diff --git a/.github/workflows/bun-linux-build.yml b/.github/workflows/bun-linux-build.yml index 52585bb269..fde38fa2a1 100644 --- a/.github/workflows/bun-linux-build.yml +++ b/.github/workflows/bun-linux-build.yml @@ -76,8 +76,8 @@ jobs: with: context: . push: false - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=local,src=/tmp/.buildx-cache-${{matrix.tag}} + cache-to: type=local,dest=/tmp/.buildx-cache-${{matrix.tag}} build-args: | ARCH=${{matrix.arch}} BUILDARCH=${{matrix.build_arch}} diff --git a/.github/workflows/bun-mac-aarch64.yml b/.github/workflows/bun-mac-aarch64.yml index ca3cb5cef2..4fb048e046 100644 --- a/.github/workflows/bun-mac-aarch64.yml +++ b/.github/workflows/bun-mac-aarch64.yml @@ -146,10 +146,21 @@ jobs: OBJ_DIR: ${{ runner.temp }}/bun-cpp-obj BUN_DEPS_OUT_DIR: ${{runner.temp}}/bun-deps run: | - brew install rust llvm@13 pkg-config coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config esbuild --force + brew install ccache rust llvm@13 pkg-config coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config esbuild --force + echo "export PATH=$(brew --prefix ccache)/bin:\$PATH" >> $GITHUB_ENV echo "export PATH=$(brew --prefix coreutils)/libexec/gnubin:\$PATH" >> $GITHUB_ENV echo "export PATH=$(brew --prefix llvm@13)/bin:\$PATH" >> $GITHUB_ENV brew link --overwrite llvm@13 + - name: ccache (dependencies) + uses: hendrikmuhs/ccache-action@v1.2 + if: matrix.dependencies + with: + key: ${{ runner.os }}-ccache-${{ matrix.tag }}-dependencies + - name: ccache (c++) + uses: hendrikmuhs/ccache-action@v1.2 + if: matrix.compile_obj + with: + key: ${{ runner.os }}-ccache-${{ matrix.tag }}-obj - name: Download WebKit if: matrix.compile_obj env: diff --git a/.github/workflows/bun-mac-x64-baseline.yml b/.github/workflows/bun-mac-x64-baseline.yml index 5a84c192c7..b5620a0657 100644 --- a/.github/workflows/bun-mac-x64-baseline.yml +++ b/.github/workflows/bun-mac-x64-baseline.yml @@ -146,10 +146,21 @@ jobs: OBJ_DIR: ${{ runner.temp }}/bun-cpp-obj BUN_DEPS_OUT_DIR: ${{runner.temp}}/bun-deps run: | - brew install rust llvm@13 pkg-config coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config esbuild --force + brew install ccache rust llvm@13 pkg-config coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config esbuild --force + echo "export PATH=$(brew --prefix ccache)/bin:\$PATH" >> $GITHUB_ENV echo "export PATH=$(brew --prefix coreutils)/libexec/gnubin:\$PATH" >> $GITHUB_ENV echo "export PATH=$(brew --prefix llvm@13)/bin:\$PATH" >> $GITHUB_ENV brew link --overwrite llvm@13 + - name: ccache (dependencies) + uses: hendrikmuhs/ccache-action@v1.2 + if: matrix.dependencies + with: + key: ${{ runner.os }}-ccache-${{ matrix.tag }}-dependencies + - name: ccache (c++) + uses: hendrikmuhs/ccache-action@v1.2 + if: matrix.compile_obj + with: + key: ${{ runner.os }}-ccache-${{ matrix.tag }}-obj - name: Download WebKit if: matrix.compile_obj env: diff --git a/.github/workflows/bun-mac-x64.yml b/.github/workflows/bun-mac-x64.yml index 9e6fff7bad..c1aa25168e 100644 --- a/.github/workflows/bun-mac-x64.yml +++ b/.github/workflows/bun-mac-x64.yml @@ -145,7 +145,7 @@ jobs: OBJ_DIR: ${{ runner.temp }}/bun-cpp-obj BUN_DEPS_OUT_DIR: ${{runner.temp}}/bun-deps run: | - brew install rust llvm@13 pkg-config coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config esbuild --force + brew install rust ccache llvm@13 pkg-config coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config esbuild --force echo "export PATH=$(brew --prefix coreutils)/libexec/gnubin:\$PATH" >> $GITHUB_ENV echo "export PATH=$(brew --prefix llvm@13)/bin:\$PATH" >> $GITHUB_ENV brew link --overwrite llvm@13 @@ -164,6 +164,16 @@ jobs: rm -rf $JSC_BASE_DIR mkdir -p $JSC_BASE_DIR curl -L ${{ matrix.webkit_url }} | tar -xz -C $JSC_BASE_DIR --strip-components=1 + - name: ccache (dependencies) + uses: hendrikmuhs/ccache-action@v1.2 + if: matrix.dependencies + with: + key: ${{ runner.os }}-ccache-${{ matrix.tag }}-dependencies + - name: ccache (c++) + uses: hendrikmuhs/ccache-action@v1.2 + if: matrix.compile_obj + with: + key: ${{ runner.os }}-ccache-${{ matrix.tag }}-obj - name: Compile dependencies if: matrix.dependencies env: diff --git a/Dockerfile b/Dockerfile index bb2fbe62db..3611a4c4ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,6 @@ ARG ZIG_URL="https://github.com/oven-sh/zig/releases/download/$ZIG_TAG/zig-linux ARG GIT_SHA="" ARG BUN_BASE_VERSION=0.3 - FROM bitnami/minideb:bullseye as bun-base RUN install_packages ca-certificates curl wget lsb-release software-properties-common gnupg gnupg1 gnupg2 @@ -43,7 +42,7 @@ RUN install_packages \ rsync \ ruby \ unzip \ - bash tar gzip + bash tar gzip ccache ENV CXX=clang++-13 ENV CC=clang-13 @@ -122,7 +121,9 @@ ARG BUN_DIR COPY Makefile ${BUN_DIR}/Makefile COPY src/deps/lol-html ${BUN_DIR}/src/deps/lol-html -RUN export PATH=$PATH:$HOME/.cargo/bin && export CC=$(which clang-13) && cd ${BUN_DIR} && \ +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache export PATH=$PATH:$HOME/.cargo/bin && export CC=$(which clang-13) && cd ${BUN_DIR} && \ make lolhtml && rm -rf src/deps/lol-html Makefile FROM bun-base as mimalloc @@ -141,7 +142,9 @@ COPY src/deps/mimalloc ${BUN_DIR}/src/deps/mimalloc ARG CPU_TARGET ENV CPU_TARGET=${CPU_TARGET} -RUN cd ${BUN_DIR} && \ +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache cd ${BUN_DIR} && \ make mimalloc && rm -rf src/deps/mimalloc Makefile FROM bun-base as zlib @@ -162,7 +165,9 @@ COPY src/deps/zlib ${BUN_DIR}/src/deps/zlib WORKDIR $BUN_DIR -RUN cd $BUN_DIR && \ +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache cd $BUN_DIR && \ make zlib && rm -rf src/deps/zlib Makefile FROM bun-base as libarchive @@ -183,7 +188,9 @@ RUN install_packages autoconf automake libtool pkg-config COPY Makefile ${BUN_DIR}/Makefile COPY src/deps/libarchive ${BUN_DIR}/src/deps/libarchive -RUN cd $BUN_DIR && \ +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache cd $BUN_DIR && \ make libarchive && rm -rf src/deps/libarchive Makefile FROM bun-base as oniguruma @@ -201,11 +208,9 @@ ENV CPU_TARGET=${CPU_TARGET} RUN install_packages autoconf automake libtool pkg-config -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/oniguruma ${BUN_DIR}/src/deps/oniguruma +ENV CCACHE_DIR=/ccache -WORKDIR $BUN_DIR -RUN make oniguruma && rm -rf src/deps/oniguruma Makefile +RUN --mount=type=cache,target=/ccache make oniguruma && rm -rf src/deps/oniguruma Makefile FROM bun-base as tinycc @@ -242,7 +247,9 @@ COPY src/deps/boringssl ${BUN_DIR}/src/deps/boringssl WORKDIR $BUN_DIR -RUN make boringssl && rm -rf src/deps/boringssl Makefile +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache make boringssl && rm -rf src/deps/boringssl Makefile FROM bun-base as uws @@ -280,6 +287,7 @@ ARG BUN_RELEASE_DIR ARG BUN_DEPS_OUT_DIR ARG BUN_DIR ARG CPU_TARGET + ENV CPU_TARGET=${CPU_TARGET} COPY Makefile ${BUN_DIR}/Makefile @@ -395,7 +403,9 @@ COPY --from=node_fallbacks ${BUN_DIR}/src/node-fallbacks/out ${BUN_DIR}/src/node COPY ./build-id ${BUN_DIR}/build-id -RUN cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && make prerelease && \ +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && make prerelease && \ mkdir -p $BUN_RELEASE_DIR && \ OUTPUT_DIR=/tmp $ZIG_PATH/zig build obj -Drelease-fast -Dtarget="${TRIPLET}" -Dcpu="${CPU_TARGET}" && \ cp /tmp/bun.o /tmp/bun-${BUN_BASE_VERSION}.$(cat ${BUN_DIR}/build-id).o && cd / && rm -rf $BUN_DIR @@ -450,7 +460,9 @@ COPY --from=tinycc ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/ # Required for `make webcrypto` COPY src/deps/boringssl/include ${BUN_DIR}/src/deps/boringssl/include -RUN cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && mkdir -p $BUN_RELEASE_DIR && make webcrypto && \ +ENV CCACHE_DIR=/ccache + +RUN --mount=type=cache,target=/ccache cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && mkdir -p $BUN_RELEASE_DIR && make webcrypto && \ make release-bindings -j10 && mv ${BUN_DEPS_OUT_DIR}/libwebcrypto.a /tmp && mv src/bun.js/bindings-obj/* /tmp FROM prepare_release as sqlite @@ -553,7 +565,7 @@ ENV LIB_ICU_PATH "${WEBKIT_DIR}/lib" CMD make headers \ api \ - analytics \ + analytiecs \ bun_error \ fallback_decoder \ bindings -j10 && \ diff --git a/Makefile b/Makefile index b1941848d4..a7d197974a 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,15 @@ OS_NAME := $(shell uname -s | tr '[:upper:]' '[:lower:]') ARCH_NAME_RAW := $(shell uname -m) BUN_AUTO_UPDATER_REPO = Jarred-Sumner/bun-releases-for-updater +CMAKE_CXX_COMPILER_LAUNCHER_FLAG ?= + +CCACHE_PATH ?= + +ifeq (,$(findstring,$(shell which ccache),ccache)) + CCACHE_PATH := $(shell which ccache) + CMAKE_CXX_COMPILER_LAUNCHER_FLAG := -DCMAKE_CXX_COMPILER_LAUNCHER=$(CCACHE_PATH) +endif + # 'make' command will trigger the help target .DEFAULT_GOAL := help @@ -73,6 +82,8 @@ ZIG ?= $(shell which zig || echo -e "error: Missing zig. Please make sure zig is CC = $(shell which clang-13 || which clang) CXX = $(shell which clang++-13 || which clang++) +CXX_WITH_CCACHE = $(CCACHE_PATH) $(CXX) + ifeq ($(OS_NAME),darwin) # Find LLVM ifeq ($(wildcard $(LLVM_PREFIX)),) @@ -118,7 +129,7 @@ LIBICONV_PATH ?= $(BREW_PREFIX_PATH)/opt/libiconv/lib/libiconv.a OPENSSL_LINUX_DIR = $(BUN_DEPS_DIR)/openssl/openssl-OpenSSL_1_1_1l -CMAKE_FLAGS_WITHOUT_RELEASE = -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MIN_MACOS_VERSION) +CMAKE_FLAGS_WITHOUT_RELEASE = -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MIN_MACOS_VERSION) $(CMAKE_CXX_COMPILER_LAUNCHER_FLAG) CMAKE_FLAGS = $(CMAKE_FLAGS_WITHOUT_RELEASE) -DCMAKE_BUILD_TYPE=Release # SQLite3 is dynamically linked on macOS @@ -1483,7 +1494,7 @@ $(DEBUG_OBJ_DIR): mkdir -p $(DEBUG_OBJ_DIR) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp - $(CXX) $(CLANG_FLAGS) $(UWS_INCLUDE) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) $(UWS_INCLUDE) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1493,7 +1504,7 @@ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp -c -o $@ $< $(OBJ_DIR)/%.o: src/bun.js/modules/%.cpp - $(CXX) $(CLANG_FLAGS) $(UWS_INCLUDE) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) $(UWS_INCLUDE) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1503,7 +1514,7 @@ $(OBJ_DIR)/%.o: src/bun.js/modules/%.cpp -c -o $@ $< $(OBJ_DIR)/%.o: $(SRC_DIR)/webcore/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1513,7 +1524,7 @@ $(OBJ_DIR)/%.o: $(SRC_DIR)/webcore/%.cpp -c -o $@ $< $(OBJ_DIR)/%.o: $(SRC_DIR)/sqlite/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1523,7 +1534,7 @@ $(OBJ_DIR)/%.o: $(SRC_DIR)/sqlite/%.cpp -c -o $@ $< $(OBJ_DIR)/%.o: src/io/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1533,7 +1544,7 @@ $(OBJ_DIR)/%.o: src/io/%.cpp -c -o $@ $< $(OBJ_DIR)/%.o: $(SRC_DIR)/node_os/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1543,7 +1554,7 @@ $(OBJ_DIR)/%.o: $(SRC_DIR)/node_os/%.cpp -c -o $@ $< $(OBJ_DIR)/%.o: src/bun.js/builtins/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1554,8 +1565,9 @@ $(OBJ_DIR)/%.o: src/bun.js/builtins/%.cpp # $(DEBUG_OBJ_DIR) is not included here because it breaks # detecting if a file needs to be rebuilt +.PHONY: $(SRC_DIR)/%.cpp $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp - $(CXX) $(CLANG_FLAGS) $(UWS_INCLUDE) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) $(UWS_INCLUDE) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1566,8 +1578,9 @@ $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp # $(DEBUG_OBJ_DIR) is not included here because it breaks # detecting if a file needs to be rebuilt +.PHONY: $(SRC_DIR)/webcore/%.cpp $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/webcore/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1576,8 +1589,9 @@ $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/webcore/%.cpp $(EMIT_LLVM_FOR_DEBUG) \ -g3 -c -o $@ $< +.PHONY: src/io/%.cpp $(DEBUG_OBJ_DIR)/%.o: src/io/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1589,8 +1603,9 @@ $(DEBUG_OBJ_DIR)/%.o: src/io/%.cpp # $(DEBUG_OBJ_DIR) is not included here because it breaks # detecting if a file needs to be rebuilt +.PHONY: $(SRC_DIR)/sqlite/%.cpp $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/sqlite/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1601,8 +1616,9 @@ $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/sqlite/%.cpp # $(DEBUG_OBJ_DIR) is not included here because it breaks # detecting if a file needs to be rebuilt +.PHONY: $(SRC_DIR)/node_os/%.cpp $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/node_os/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1613,8 +1629,9 @@ $(DEBUG_OBJ_DIR)/%.o: $(SRC_DIR)/node_os/%.cpp # $(DEBUG_OBJ_DIR) is not included here because it breaks # detecting if a file needs to be rebuilt +.PHONY: src/bun.js/builtins/%.cpp $(DEBUG_OBJ_DIR)/%.o: src/bun.js/builtins/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1623,8 +1640,9 @@ $(DEBUG_OBJ_DIR)/%.o: src/bun.js/builtins/%.cpp $(EMIT_LLVM_FOR_DEBUG) \ -g3 -c -o $@ $< +.PHONY: src/bun.js/modules/%.cpp $(DEBUG_OBJ_DIR)/%.o: src/bun.js/modules/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1636,7 +1654,7 @@ $(DEBUG_OBJ_DIR)/%.o: src/bun.js/modules/%.cpp $(DEBUG_OBJ_DIR)/webcrypto/%.o: src/bun.js/bindings/webcrypto/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(DEBUG_OPTIMIZATION_LEVEL) \ -fno-exceptions \ @@ -1660,7 +1678,7 @@ webcrypto-debug: $(OBJ_DIR)/webcrypto/%.o: src/bun.js/bindings/webcrypto/%.cpp - $(CXX) $(CLANG_FLAGS) \ + $(CXX_WITH_CCACHE) $(CLANG_FLAGS) \ $(MACOS_MIN_FLAG) \ $(OPTIMIZATION_LEVEL) \ -fno-exceptions \