diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml deleted file mode 100644 index 78f936207e..0000000000 --- a/.github/workflows/format.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Format - -permissions: - contents: write - -concurrency: - group: format-${{ github.workflow }}-${{ github.event_name == 'workflow_dispatch' && inputs.run-id || github.ref }} - cancel-in-progress: true - -on: - workflow_dispatch: - inputs: - run-id: - type: string - description: The workflow ID to download artifacts (skips the build step) - pull_request: - -jobs: - format: - name: Format - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - sparse-checkout: | - .prettierrc-ci - .github - .vscode - src - scripts - packages - test - bench - package.json - bun.lockb - .clang-format - - name: Setup Bun - uses: ./.github/actions/setup-bun - with: - bun-version: "1.1.25" - - name: Setup Zig - uses: mlugg/setup-zig@v1 - with: - version: 0.13.0 - - name: Install Dependencies - run: | - bun install - - name: Format - run: | - bun fmt - - name: Format Zig - run: | - bun fmt:zig - - name: Format Cpp - run: | - bun fmt:cpp - - name: Commit - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: Apply formatting changes diff --git a/.github/workflows/run-format.yml b/.github/workflows/run-format.yml deleted file mode 100644 index 8a5dc07706..0000000000 --- a/.github/workflows/run-format.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Format - -permissions: - contents: write - -on: - workflow_call: - inputs: - zig-version: - type: string - required: true - -jobs: - format: - name: Format - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - sparse-checkout: | - .prettierrc-ci - .github - .vscode - src - scripts - packages - test - bench - package.json - bun.lockb - .clang-format - - name: Setup Bun - uses: ./.github/actions/setup-bun - with: - bun-version: "1.1.25" - - name: Setup Zig - uses: mlugg/setup-zig@v1 - with: - version: ${{ inputs.zig-version }} - - name: Install Dependencies - run: | - bun install - - name: Format - run: | - bun fmt - - name: Format Zig - run: | - bun fmt:zig - - name: Commit - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: Apply formatting changes diff --git a/.github/workflows/zig-format.yml b/.github/workflows/zig-format.yml new file mode 100644 index 0000000000..0855fe0550 --- /dev/null +++ b/.github/workflows/zig-format.yml @@ -0,0 +1,45 @@ +name: zig-format + +permissions: + contents: write + +on: + workflow_call: + workflow_dispatch: + pull_request: + paths: + - ".github/workflows/zig-format.yml" + - "package.json" + - "scripts/**" + - "cmake/**" + - "src/**/*.zig" + +env: + BUN_VERSION: "1.1.27" + +jobs: + zig-format: + name: zig-format + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + package.json + scripts + cmake + src + packages + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Zig Format + run: | + bun run zig-format -DENABLE_CCACHE=OFF -DSKIP_LLVM=ON + - name: Commit + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "`bun run zig-format`" diff --git a/CMakeLists.txt b/CMakeLists.txt index 57f8d0dd64..20b999e2e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,3 +43,4 @@ include(BuildBun) # --- Analysis --- include(RunClangFormat) +include(RunZigFormat) diff --git a/cmake/Globals.cmake b/cmake/Globals.cmake index 9c14fd57db..7e9655e679 100644 --- a/cmake/Globals.cmake +++ b/cmake/Globals.cmake @@ -575,14 +575,6 @@ function(register_repository) set(GIT_PATH ${VENDOR_PATH}/${GIT_NAME}) endif() - if(GIT_COMMIT) - set(GIT_REF ${GIT_COMMIT}) - elseif(GIT_TAG) - set(GIT_REF refs/tags/${GIT_TAG}) - else() - set(GIT_REF refs/heads/${GIT_BRANCH}) - endif() - set(GIT_EFFECTIVE_OUTPUTS) foreach(output ${GIT_OUTPUTS}) list(APPEND GIT_EFFECTIVE_OUTPUTS ${GIT_PATH}/${output}) @@ -597,8 +589,10 @@ function(register_repository) ${CMAKE_COMMAND} -DGIT_PATH=${GIT_PATH} -DGIT_REPOSITORY=${GIT_REPOSITORY} - -DGIT_REF=${GIT_REF} -DGIT_NAME=${GIT_NAME} + -DGIT_COMMIT=${GIT_COMMIT} + -DGIT_TAG=${GIT_TAG} + -DGIT_BRANCH=${GIT_BRANCH} -P ${CWD}/cmake/scripts/GitClone.cmake OUTPUTS ${GIT_PATH} diff --git a/cmake/analysis/RunZigFormat.cmake b/cmake/analysis/RunZigFormat.cmake new file mode 100644 index 0000000000..98d3ce6709 --- /dev/null +++ b/cmake/analysis/RunZigFormat.cmake @@ -0,0 +1,26 @@ +set(ZIG_FORMAT_SOURCES ${BUN_ZIG_SOURCES}) + +register_command( + TARGET + zig-format-check + COMMENT + "Checking zig fmt" + COMMAND + ${ZIG_EXECUTABLE} + fmt + --check + ${ZIG_FORMAT_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + zig-format + COMMENT + "Running zig fmt" + COMMAND + ${ZIG_EXECUTABLE} + fmt + ${ZIG_FORMAT_SOURCES} + ALWAYS_RUN +) diff --git a/cmake/scripts/DownloadUrl.cmake b/cmake/scripts/DownloadUrl.cmake new file mode 100644 index 0000000000..b9a6929bf2 --- /dev/null +++ b/cmake/scripts/DownloadUrl.cmake @@ -0,0 +1,131 @@ +get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) +message(STATUS "Running script: ${SCRIPT_NAME}") + +if(NOT DOWNLOAD_URL OR NOT DOWNLOAD_PATH) + message(FATAL_ERROR "DOWNLOAD_URL and DOWNLOAD_PATH are required") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(TMP_PATH $ENV{TEMP}) +else() + set(TMP_PATH $ENV{TMPDIR}) +endif() + +if(NOT TMP_PATH) + set(TMP_PATH ${CMAKE_BINARY_DIR}/tmp) +endif() + +string(REGEX REPLACE "/+$" "" TMP_PATH ${TMP_PATH}) +string(REGEX REPLACE "[^a-zA-Z0-9]" "-" DOWNLOAD_ID ${DOWNLOAD_URL}) +string(RANDOM LENGTH 8 RANDOM_ID) + +set(DOWNLOAD_TMP_PATH ${TMP_PATH}/${DOWNLOAD_ID}-${RANDOM_ID}) +set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_PATH}/tmp) + +file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) + +if(DOWNLOAD_ACCEPT_HEADER) + set(DOWNLOAD_ACCEPT_HEADER "Accept: ${DOWNLOAD_ACCEPT_HEADER}") +else() + set(DOWNLOAD_ACCEPT_HEADER "Accept: */*") +endif() + +foreach(i RANGE 10) + set(DOWNLOAD_TMP_FILE_${i} ${DOWNLOAD_TMP_FILE}.${i}) + + if(i EQUAL 0) + message(STATUS "Downloading ${DOWNLOAD_URL}...") + else() + message(STATUS "Downloading ${DOWNLOAD_URL}... (retry ${i})") + endif() + + file(DOWNLOAD + ${DOWNLOAD_URL} + ${DOWNLOAD_TMP_FILE_${i}} + HTTPHEADER "User-Agent: cmake/${CMAKE_VERSION}" + HTTPHEADER ${DOWNLOAD_ACCEPT_HEADER} + STATUS DOWNLOAD_STATUS + INACTIVITY_TIMEOUT 60 + TIMEOUT 180 + SHOW_PROGRESS + ) + + list(GET DOWNLOAD_STATUS 0 DOWNLOAD_STATUS_CODE) + if(DOWNLOAD_STATUS_CODE EQUAL 0) + if(NOT EXISTS ${DOWNLOAD_TMP_FILE_${i}}) + message(WARNING "Download failed: result is ok, but file does not exist: ${DOWNLOAD_TMP_FILE_${i}}") + continue() + endif() + + file(RENAME ${DOWNLOAD_TMP_FILE_${i}} ${DOWNLOAD_TMP_FILE}) + break() + endif() + + list(GET DOWNLOAD_STATUS 1 DOWNLOAD_STATUS_TEXT) + file(REMOVE ${DOWNLOAD_TMP_FILE_${i}}) + message(WARNING "Download failed: ${DOWNLOAD_STATUS_CODE} ${DOWNLOAD_STATUS_TEXT}") +endforeach() + +if(NOT EXISTS ${DOWNLOAD_TMP_FILE}) + file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) + message(FATAL_ERROR "Download failed after too many attempts: ${DOWNLOAD_URL}") +endif() + +get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_URL} NAME) +if(DOWNLOAD_FILENAME MATCHES "\\.(zip|tar|gz|xz)$") + message(STATUS "Extracting ${DOWNLOAD_FILENAME}...") + + set(DOWNLOAD_TMP_EXTRACT ${DOWNLOAD_TMP_PATH}/extract) + file(ARCHIVE_EXTRACT + INPUT ${DOWNLOAD_TMP_FILE} + DESTINATION ${DOWNLOAD_TMP_EXTRACT} + TOUCH + ) + + file(REMOVE ${DOWNLOAD_TMP_FILE}) + + if(DOWNLOAD_FILTERS) + list(TRANSFORM DOWNLOAD_FILTERS PREPEND ${DOWNLOAD_TMP_EXTRACT}/ OUTPUT_VARIABLE DOWNLOAD_GLOBS) + else() + set(DOWNLOAD_GLOBS ${DOWNLOAD_TMP_EXTRACT}/*) + endif() + + file(GLOB DOWNLOAD_TMP_EXTRACT_PATHS LIST_DIRECTORIES ON ${DOWNLOAD_GLOBS}) + list(LENGTH DOWNLOAD_TMP_EXTRACT_PATHS DOWNLOAD_COUNT) + + if(DOWNLOAD_COUNT EQUAL 0) + file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) + + if(DOWNLOAD_FILTERS) + message(FATAL_ERROR "Extract failed: No files found matching ${DOWNLOAD_FILTERS}") + else() + message(FATAL_ERROR "Extract failed: No files found") + endif() + endif() + + if(DOWNLOAD_FILTERS) + set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_EXTRACT_PATHS}) + elseif(DOWNLOAD_COUNT EQUAL 1) + list(GET DOWNLOAD_TMP_EXTRACT_PATHS 0 DOWNLOAD_TMP_FILE) + get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_TMP_FILE} NAME) + message(STATUS "Hoisting ${DOWNLOAD_FILENAME}...") + else() + set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_EXTRACT}) + endif() +endif() + +if(DOWNLOAD_FILTERS) + foreach(file ${DOWNLOAD_TMP_FILE}) + file(RENAME ${file} ${DOWNLOAD_PATH}) + endforeach() +else() + file(REMOVE_RECURSE ${DOWNLOAD_PATH}) + get_filename_component(DOWNLOAD_PARENT_PATH ${DOWNLOAD_PATH} DIRECTORY) + file(MAKE_DIRECTORY ${DOWNLOAD_PARENT_PATH}) + file(RENAME ${DOWNLOAD_TMP_FILE} ${DOWNLOAD_PATH}) +endif() + +get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_PATH} NAME) +message(STATUS "Saved ${DOWNLOAD_FILENAME}") + +file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) diff --git a/cmake/scripts/DownloadZig.cmake b/cmake/scripts/DownloadZig.cmake new file mode 100644 index 0000000000..bbb89ccf7b --- /dev/null +++ b/cmake/scripts/DownloadZig.cmake @@ -0,0 +1,111 @@ +get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) +message(STATUS "Running script: ${SCRIPT_NAME}") + +if(NOT ZIG_PATH) + message(FATAL_ERROR "ZIG_PATH is required") +endif() + +if(ZIG_REPOSITORY) + if(NOT ZIG_COMMIT) + message(FATAL_ERROR "ZIG_COMMIT is required when ZIG_REPOSITORY is set") + endif() +elseif(NOT ZIG_COMMIT) + set(ZIG_REPOSITORY "oven-sh/zig") + set(ZIG_COMMIT "131a009ba2eb127a3447d05b9e12f710429aa5ee") +endif() + +if(NOT ZIG_VERSION) + set(ZIG_VERSION "0.13.0") +endif() + +if(CMAKE_HOST_APPLE) + set(ZIG_OS "macos") +elseif(CMAKE_HOST_WIN32) + set(ZIG_OS "windows") +elseif(CMAKE_HOST_UNIX) + set(ZIG_OS "linux") +else() + message(FATAL_ERROR "Unsupported operating system: ${CMAKE_HOST_SYSTEM_NAME}") +endif() + +# In script mode, using -P, this variable is not set +if(NOT DEFINED CMAKE_HOST_SYSTEM_PROCESSOR) + cmake_host_system_information(RESULT CMAKE_HOST_SYSTEM_PROCESSOR QUERY OS_PLATFORM) +endif() + +if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|ARM64|aarch64|AARCH64") + set(ZIG_ARCH "aarch64") +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|AMD64|x86_64|X86_64|x64|X64") + set(ZIG_ARCH "x86_64") +else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}") +endif() + +set(ZIG_NAME zig-${ZIG_OS}-${ZIG_ARCH}-${ZIG_VERSION}) + +if(CMAKE_HOST_WIN32) + set(ZIG_EXE "zig.exe") + set(ZIG_FILENAME ${ZIG_NAME}.zip) +else() + set(ZIG_EXE "zig") + set(ZIG_FILENAME ${ZIG_NAME}.tar.xz) +endif() + +message(STATUS "Downloading ${ZIG_EXE} ${ZIG_VERSION} on ${ZIG_OS} ${ZIG_ARCH}...") +set(ZIG_DOWNLOAD_URL https://ziglang.org/download/${ZIG_VERSION}/${ZIG_FILENAME}) + +execute_process( + COMMAND + ${CMAKE_COMMAND} + -DDOWNLOAD_URL=${ZIG_DOWNLOAD_URL} + -DDOWNLOAD_PATH=${ZIG_PATH} + -P ${CMAKE_CURRENT_LIST_DIR}/DownloadUrl.cmake + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + ZIG_DOWNLOAD_ERROR + RESULT_VARIABLE + ZIG_DOWNLOAD_RESULT +) + +if(NOT ZIG_DOWNLOAD_RESULT EQUAL 0) + message(FATAL_ERROR "Download failed: ${ZIG_DOWNLOAD_ERROR}") +endif() + +if(NOT EXISTS ${ZIG_PATH}/${ZIG_EXE}) + message(FATAL_ERROR "Download failed: executable not found: \"${ZIG_PATH}/${ZIG_EXE}\"") +endif() + +# Tools like VSCode need a stable path to the zig executable, on both Unix and Windows +# To workaround this, we create a `bun.exe` symlink on Unix. +if(NOT WIN32) + file(CREATE_LINK ${ZIG_PATH}/${ZIG_EXE} ${ZIG_PATH}/zig.exe SYMBOLIC) +endif() + +if(ZIG_REPOSITORY AND ZIG_COMMIT) + message(STATUS "Downloading zig library from ${ZIG_REPOSITORY} at ${ZIG_COMMIT}...") + + execute_process( + COMMAND + ${CMAKE_COMMAND} + -DGIT_PATH=${ZIG_PATH}/tmp + -DGIT_REPOSITORY=${ZIG_REPOSITORY} + -DGIT_COMMIT=${ZIG_COMMIT} + -P ${CMAKE_CURRENT_LIST_DIR}/GitClone.cmake + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + ZIG_REPOSITORY_ERROR + RESULT_VARIABLE + ZIG_REPOSITORY_RESULT + ) + + if(NOT ZIG_REPOSITORY_RESULT EQUAL 0) + message(FATAL_ERROR "Download failed: ${ZIG_REPOSITORY_ERROR}") + endif() + + file(REMOVE_RECURSE ${ZIG_PATH}/lib) + file(RENAME ${ZIG_PATH}/tmp/lib ${ZIG_PATH}/lib) + file(REMOVE_RECURSE ${ZIG_PATH}/tmp) + message(STATUS "Saved ${ZIG_PATH}/lib") +endif() + +message(STATUS "Saved ${ZIG_EXE}") diff --git a/cmake/scripts/GitClone.cmake b/cmake/scripts/GitClone.cmake index 89f86abd76..d02f0228b3 100644 --- a/cmake/scripts/GitClone.cmake +++ b/cmake/scripts/GitClone.cmake @@ -1,74 +1,85 @@ -include(cmake/Globals.cmake) +get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) +message(STATUS "Running script: ${SCRIPT_NAME}") -if(NOT GIT_PATH OR NOT GIT_REPOSITORY OR NOT GIT_REF) - message(FATAL_ERROR "git_clone: GIT_PATH, GIT_REPOSITORY, and GIT_REF are required") +if(NOT GIT_PATH OR NOT GIT_REPOSITORY) + message(FATAL_ERROR "GIT_PATH and GIT_REPOSITORY are required") endif() -setx(GIT_PATH ${GIT_PATH}) -setx(GIT_REPOSITORY ${GIT_REPOSITORY}) -setx(GIT_REF ${GIT_REF}) +if(GIT_COMMIT) + set(GIT_REF ${GIT_COMMIT}) +elseif(GIT_TAG) + set(GIT_REF refs/tags/${GIT_TAG}) +elseif(GIT_BRANCH) + set(GIT_REF refs/heads/${GIT_BRANCH}) +else() + message(FATAL_ERROR "GIT_COMMIT, GIT_TAG, or GIT_BRANCH are required") +endif() string(REGEX MATCH "([^/]+)$" GIT_ORIGINAL_NAME ${GIT_REPOSITORY}) - if(NOT GIT_NAME) - setx(GIT_NAME ${GIT_ORIGINAL_NAME}) + set(GIT_NAME ${GIT_ORIGINAL_NAME}) endif() -set(GIT_REF_PATH ${GIT_PATH}/.ref) +set(GIT_DOWNLOAD_URL https://github.com/${GIT_REPOSITORY}/archive/${GIT_REF}.tar.gz) -if(EXISTS ${GIT_REF_PATH}) - file(READ ${GIT_REF_PATH} GIT_CACHED_REF) - if(GIT_CACHED_REF STREQUAL GIT_REF) - return() - endif() +message(STATUS "Cloning ${GIT_REPOSITORY} at ${GIT_REF}...") +execute_process( + COMMAND + ${CMAKE_COMMAND} + -DDOWNLOAD_URL=${GIT_DOWNLOAD_URL} + -DDOWNLOAD_PATH=${GIT_PATH} + -DDOWNLOAD_FILTERS=${GIT_FILTERS} + -P ${CMAKE_CURRENT_LIST_DIR}/DownloadUrl.cmake + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + GIT_ERROR + RESULT_VARIABLE + GIT_RESULT +) + +if(NOT GIT_RESULT EQUAL 0) + message(FATAL_ERROR "Clone failed: ${GIT_ERROR}") endif() -setx(GIT_DOWNLOAD_PATH ${GIT_PATH}.tar.gz) -setx(GIT_DOWNLOAD_URL https://github.com/${GIT_REPOSITORY}/archive/${GIT_REF}.tar.gz) - -foreach(i RANGE 10) - set(GIT_DOWNLOAD_TMP_PATH ${GIT_PATH}.tmp.${i}) - file(DOWNLOAD - ${GIT_DOWNLOAD_URL} - ${GIT_DOWNLOAD_TMP_PATH} - TIMEOUT 120 - STATUS GIT_DOWNLOAD_STATUS - SHOW_PROGRESS - ) - if(GIT_DOWNLOAD_STATUS MATCHES "^0" AND EXISTS ${GIT_DOWNLOAD_TMP_PATH}) - file(RENAME ${GIT_DOWNLOAD_TMP_PATH} ${GIT_DOWNLOAD_PATH}) - break() - endif() - message(WARNING "git_clone: ${GIT_DOWNLOAD_STATUS}: ${GIT_DOWNLOAD_URL}") - file(REMOVE ${GIT_DOWNLOAD_TMP_PATH}) -endforeach() - -if(NOT EXISTS ${GIT_DOWNLOAD_PATH}) - message(FATAL_ERROR "git_clone: failed to download ${GIT_DOWNLOAD_URL}") -endif() - -file(REMOVE_RECURSE ${GIT_PATH}) -get_filename_component(GIT_PARENT_PATH ${GIT_PATH} DIRECTORY) -file(ARCHIVE_EXTRACT INPUT ${GIT_DOWNLOAD_PATH} DESTINATION ${GIT_PARENT_PATH}/tmp-${GIT_ORIGINAL_NAME} TOUCH) -file(GLOB GIT_TMP_PATH LIST_DIRECTORIES ON ${GIT_PARENT_PATH}/tmp-${GIT_ORIGINAL_NAME}/${GIT_ORIGINAL_NAME}-*) -file(RENAME ${GIT_TMP_PATH} ${GIT_PATH}) -file(REMOVE_RECURSE ${GIT_PARENT_PATH}/tmp-${GIT_ORIGINAL_NAME}) -file(REMOVE ${GIT_DOWNLOAD_PATH}) - file(GLOB_RECURSE GIT_PATCH_PATHS ${CMAKE_SOURCE_DIR}/patches/${GIT_NAME}/*) -foreach(GIT_PATCH_PATH ${GIT_PATCH_PATHS}) - if(GIT_PATCH_PATH MATCHES "\\.patch$") - execute_process( - COMMAND git apply --ignore-whitespace --ignore-space-change --no-index --verbose ${GIT_PATCH_PATH} - WORKING_DIRECTORY ${GIT_PATH} - RESULT_VARIABLE GIT_PATCH_RESULT - ) - if(NOT GIT_PATCH_RESULT EQUAL 0) - message(FATAL_ERROR "git_clone: failed to apply patch: ${GIT_PATCH_PATH}") - endif() - else() - file(COPY ${GIT_PATCH_PATH} DESTINATION ${GIT_PATH}) - endif() -endforeach() +list(LENGTH GIT_PATCH_PATHS GIT_PATCH_COUNT) -file(WRITE ${GIT_REF_PATH} ${GIT_REF}) +if(GIT_PATCH_COUNT GREATER 0) + find_program(GIT_PROGRAM git REQUIRED) + + foreach(GIT_PATCH ${GIT_PATCH_PATHS}) + get_filename_component(GIT_PATCH_NAME ${GIT_PATCH} NAME) + + if(GIT_PATCH_NAME MATCHES "\\.patch$") + message(STATUS "Applying patch ${GIT_PATCH_NAME}...") + execute_process( + COMMAND + ${GIT_PROGRAM} + apply + --ignore-whitespace + --ignore-space-change + --no-index + --verbose + ${GIT_PATCH} + WORKING_DIRECTORY + ${GIT_PATH} + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + GIT_PATCH_ERROR + RESULT_VARIABLE + GIT_PATCH_RESULT + ) + + if(NOT GIT_PATCH_RESULT EQUAL 0 AND NOT GIT_PATCH_ERROR MATCHES "cleanly") + file(REMOVE_RECURSE ${GIT_PATH}) + message(FATAL_ERROR "Failed to apply patch: ${GIT_PATCH_ERROR}") + endif() + else() + message(STATUS "Copying file ${GIT_PATCH_NAME}...") + file(COPY ${GIT_PATCH} DESTINATION ${GIT_PATH}) + endif() + endforeach() +endif() + +file(WRITE ${GIT_PATH}/.ref ${GIT_REF}) +message(STATUS "Cloned ${GIT_REPOSITORY}") diff --git a/cmake/targets/BuildBun.cmake b/cmake/targets/BuildBun.cmake index 8eb7a95dfa..d276073268 100644 --- a/cmake/targets/BuildBun.cmake +++ b/cmake/targets/BuildBun.cmake @@ -54,7 +54,7 @@ register_command( COMMENT "Generating src/js_lexer/*.blob" COMMAND - ${CMAKE_ZIG_COMPILER} + ${ZIG_EXECUTABLE} run ${CMAKE_ZIG_FLAGS} ${BUN_ZIG_IDENTIFIER_SCRIPT} @@ -62,8 +62,6 @@ register_command( ${BUN_ZIG_IDENTIFIER_SOURCES} OUTPUTS ${BUN_ZIG_IDENTIFIER_OUTPUTS} - TARGETS - clone-zig ) set(BUN_ERROR_SOURCE ${CWD}/packages/bun-error) @@ -484,6 +482,9 @@ list(APPEND BUN_ZIG_SOURCES ${CWD}/build.zig ${CWD}/root.zig ${CWD}/root_wasm.zig +) + +set(BUN_ZIG_GENERATED_SOURCES ${BUN_ZIG_IDENTIFIER_OUTPUTS} ${BUN_ERROR_OUTPUTS} ${BUN_FALLBACK_DECODER_OUTPUT} @@ -496,9 +497,9 @@ list(APPEND BUN_ZIG_SOURCES # In debug builds, these are not embedded, but rather referenced at runtime. if (DEBUG) - list(APPEND BUN_ZIG_SOURCES ${CODEGEN_PATH}/kit_empty_file) + list(APPEND BUN_ZIG_GENERATED_SOURCES ${CODEGEN_PATH}/kit_empty_file) else() - list(APPEND BUN_ZIG_SOURCES ${BUN_KIT_RUNTIME_OUTPUTS}) + list(APPEND BUN_ZIG_GENERATED_SOURCES ${BUN_KIT_RUNTIME_OUTPUTS}) endif() set(BUN_ZIG_OUTPUT ${BUILD_PATH}/bun-zig.o) @@ -527,7 +528,7 @@ register_command( COMMENT "Building src/*.zig for ${ZIG_TARGET}" COMMAND - ${CMAKE_ZIG_COMPILER} + ${ZIG_EXECUTABLE} build obj ${CMAKE_ZIG_FLAGS} --prefix ${BUILD_PATH} @@ -545,8 +546,7 @@ register_command( ${BUN_ZIG_OUTPUT} SOURCES ${BUN_ZIG_SOURCES} - TARGETS - clone-zig + ${BUN_ZIG_GENERATED_SOURCES} ) set_property(TARGET bun-zig PROPERTY JOB_POOL compile_pool) diff --git a/cmake/tools/SetupLLVM.cmake b/cmake/tools/SetupLLVM.cmake index a029ce9fce..7298415980 100644 --- a/cmake/tools/SetupLLVM.cmake +++ b/cmake/tools/SetupLLVM.cmake @@ -1,3 +1,7 @@ +if(SKIP_LLVM) + return() +endif() + if(CMAKE_HOST_WIN32 OR CMAKE_HOST_APPLE) set(DEFAULT_LLVM_VERSION "18.1.8") else() diff --git a/cmake/tools/SetupZig.cmake b/cmake/tools/SetupZig.cmake index 005fec3597..eb082023b4 100644 --- a/cmake/tools/SetupZig.cmake +++ b/cmake/tools/SetupZig.cmake @@ -43,101 +43,33 @@ optionx(ZIG_OPTIMIZE "ReleaseFast|ReleaseSafe|ReleaseSmall|Debug" "The Zig optim # Change to "bc" to experiment, "Invalid record" means it is not valid output. optionx(ZIG_OBJECT_FORMAT "obj|bc" "Output file format for Zig object files" DEFAULT obj) -optionx(ZIG_VERSION STRING "The version of zig to use" DEFAULT "0.13.0") optionx(ZIG_LOCAL_CACHE_DIR FILEPATH "The path to local the zig cache directory" DEFAULT ${CACHE_PATH}/zig/local) optionx(ZIG_GLOBAL_CACHE_DIR FILEPATH "The path to the global zig cache directory" DEFAULT ${CACHE_PATH}/zig/global) -setx(ZIG_REPOSITORY_PATH ${VENDOR_PATH}/zig) -setx(ZIG_PATH ${CACHE_PATH}/zig/bin) - -register_repository( - NAME - zig - REPOSITORY - oven-sh/zig - COMMIT - 131a009ba2eb127a3447d05b9e12f710429aa5ee - PATH - ${ZIG_REPOSITORY_PATH} -) - setenv(ZIG_LOCAL_CACHE_DIR ${ZIG_LOCAL_CACHE_DIR}) setenv(ZIG_GLOBAL_CACHE_DIR ${ZIG_GLOBAL_CACHE_DIR}) +setx(ZIG_PATH ${VENDOR_PATH}/zig) + +if(WIN32) + setx(ZIG_EXECUTABLE ${ZIG_PATH}/zig.exe) +else() + setx(ZIG_EXECUTABLE ${ZIG_PATH}/zig) +endif() + set(CMAKE_ZIG_FLAGS --cache-dir ${ZIG_LOCAL_CACHE_DIR} --global-cache-dir ${ZIG_GLOBAL_CACHE_DIR} - --zig-lib-dir ${ZIG_REPOSITORY_PATH}/lib + --zig-lib-dir ${ZIG_PATH}/lib ) -find_command( - VARIABLE - CMAKE_ZIG_COMPILER - COMMAND - zig - zig.exe - PATHS - ${ZIG_PATH} - VERSION - ${ZIG_VERSION} - REQUIRED - OFF -) - -if(CMAKE_ZIG_COMPILER) - return() -endif() - -if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|aarch64") - set(ZIG_HOST_ARCH "aarch64") -elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|x64|AMD64") - set(ZIG_HOST_ARCH "x86_64") -else() - unsupported(CMAKE_HOST_SYSTEM_PROCESSOR) -endif() - -if(CMAKE_HOST_APPLE) - set(ZIG_HOST_OS "macos") -elseif(CMAKE_HOST_WIN32) - set(ZIG_HOST_OS "windows") -elseif(CMAKE_HOST_UNIX) - set(ZIG_HOST_OS "linux") -else() - unsupported(CMAKE_HOST_SYSTEM_NAME) -endif() - -set(ZIG_NAME zig-${ZIG_HOST_OS}-${ZIG_HOST_ARCH}-${ZIG_VERSION}) - -if(CMAKE_HOST_WIN32) - set(ZIG_EXE "zig.exe") - set(ZIG_FILENAME ${ZIG_NAME}.zip) -else() - set(ZIG_EXE "zig") - set(ZIG_FILENAME ${ZIG_NAME}.tar.xz) -endif() - -setx(ZIG_DOWNLOAD_URL https://ziglang.org/download/${ZIG_VERSION}/${ZIG_FILENAME}) -file(DOWNLOAD ${ZIG_DOWNLOAD_URL} ${TMP_PATH}/${ZIG_FILENAME} SHOW_PROGRESS) -file(ARCHIVE_EXTRACT INPUT ${TMP_PATH}/${ZIG_FILENAME} DESTINATION ${TMP_PATH} TOUCH) -file(REMOVE ${TMP_PATH}/${ZIG_FILENAME}) -file(COPY ${TMP_PATH}/${ZIG_NAME}/${ZIG_EXE} DESTINATION ${ZIG_PATH}) -file(CHMOD ${ZIG_PATH}/${ZIG_EXE} PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE) -setx(CMAKE_ZIG_COMPILER ${ZIG_PATH}/${ZIG_EXE}) - -if(NOT WIN32) - file(CREATE_LINK ${ZIG_PATH}/${ZIG_EXE} ${ZIG_PATH}/zig.exe SYMBOLIC) -endif() - -# Some zig commands need the executable to be in the same directory as the zig repository register_command( COMMENT - "Creating symlink for zig" + "Downloading zig" COMMAND - ${CMAKE_COMMAND} -E copy ${ZIG_PATH}/${ZIG_EXE} ${ZIG_REPOSITORY_PATH}/${ZIG_EXE} - && ${CMAKE_COMMAND} -E create_symlink ${ZIG_REPOSITORY_PATH}/${ZIG_EXE} ${ZIG_REPOSITORY_PATH}/zig.exe + ${CMAKE_COMMAND} + -DZIG_PATH=${ZIG_PATH} + -P ${CWD}/cmake/scripts/DownloadZig.cmake OUTPUTS - ${ZIG_REPOSITORY_PATH}/${ZIG_EXE} - ${ZIG_REPOSITORY_PATH}/zig.exe - TARGETS - clone-zig + ${ZIG_EXECUTABLE} ) diff --git a/package.json b/package.json index 41836d180d..c7292681e6 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,10 @@ "zig:check": "bun run zig build check --summary new", "zig:check-all": "bun run zig build check-all --summary new", "zig:check-windows": "bun run zig build check-windows --summary new", - "clang-format": "bun run build --target clang-format", - "clang-format:check": "bun run build --target clang-format-check" + "cmake": "bun ./scripts/build.mjs -DCMAKE_BUILD_TYPE=Debug -B build/debug", + "clang-format": "bun run cmake --target clang-format", + "clang-format:check": "bun run cmake --target clang-format-check", + "zig-format": "bun run cmake --target zig-format", + "zig-format:check": "bun run cmake --target zig-format-check" } }