diff --git a/.github/scripts/install-musl-build-tools.sh b/.github/scripts/install-musl-build-tools.sh index e2af7528d5..634fe04d71 100644 --- a/.github/scripts/install-musl-build-tools.sh +++ b/.github/scripts/install-musl-build-tools.sh @@ -32,30 +32,132 @@ case "${TARGET}" in ;; esac -if command -v clang++ >/dev/null; then - cxx="$(command -v clang++)" - echo "CXXFLAGS=--target=${TARGET} -stdlib=libc++ -pthread" >> "$GITHUB_ENV" - echo "CFLAGS=--target=${TARGET} -pthread" >> "$GITHUB_ENV" - if command -v clang >/dev/null; then - cc="$(command -v clang)" - echo "CC=${cc}" >> "$GITHUB_ENV" - echo "TARGET_CC=${cc}" >> "$GITHUB_ENV" - target_cc_var="CC_${TARGET}" - target_cc_var="${target_cc_var//-/_}" - echo "${target_cc_var}=${cc}" >> "$GITHUB_ENV" - fi -elif command -v "${arch}-linux-musl-g++" >/dev/null; then - cxx="$(command -v "${arch}-linux-musl-g++")" -elif command -v musl-g++ >/dev/null; then - cxx="$(command -v musl-g++)" +# Use the musl toolchain as the Rust linker to avoid Zig injecting its own CRT. +if command -v "${arch}-linux-musl-gcc" >/dev/null; then + musl_linker="$(command -v "${arch}-linux-musl-gcc")" elif command -v musl-gcc >/dev/null; then - cxx="$(command -v musl-gcc)" - echo "CFLAGS=-pthread" >> "$GITHUB_ENV" + musl_linker="$(command -v musl-gcc)" else - echo "musl g++ not found after install; arch=${arch}" >&2 + echo "musl gcc not found after install; arch=${arch}" >&2 exit 1 fi +zig_target="${TARGET/-unknown-linux-musl/-linux-musl}" +runner_temp="${RUNNER_TEMP:-/tmp}" +tool_root="${runner_temp}/codex-musl-tools-${TARGET}" +mkdir -p "${tool_root}" + +sysroot="" +if command -v zig >/dev/null; then + zig_bin="$(command -v zig)" + cc="${tool_root}/zigcc" + cxx="${tool_root}/zigcxx" + + cat >"${cc}" <"${cxx}" </dev/null || true)" +else + cc="${musl_linker}" + + if command -v "${arch}-linux-musl-g++" >/dev/null; then + cxx="$(command -v "${arch}-linux-musl-g++")" + elif command -v musl-g++ >/dev/null; then + cxx="$(command -v musl-g++)" + else + cxx="${cc}" + fi +fi + +if [[ -n "${sysroot}" && "${sysroot}" != "/" ]]; then + echo "BORING_BSSL_SYSROOT=${sysroot}" >> "$GITHUB_ENV" + boring_sysroot_var="BORING_BSSL_SYSROOT_${TARGET}" + boring_sysroot_var="${boring_sysroot_var//-/_}" + echo "${boring_sysroot_var}=${sysroot}" >> "$GITHUB_ENV" +fi + +cflags="-pthread" +cxxflags="-pthread" +if [[ "${TARGET}" == "aarch64-unknown-linux-musl" ]]; then + # BoringSSL enables -Wframe-larger-than=25344 under clang and treats warnings as errors. + cflags="${cflags} -Wno-error=frame-larger-than" + cxxflags="${cxxflags} -Wno-error=frame-larger-than" +fi + +echo "CFLAGS=${cflags}" >> "$GITHUB_ENV" +echo "CXXFLAGS=${cxxflags}" >> "$GITHUB_ENV" +echo "CC=${cc}" >> "$GITHUB_ENV" +echo "TARGET_CC=${cc}" >> "$GITHUB_ENV" +target_cc_var="CC_${TARGET}" +target_cc_var="${target_cc_var//-/_}" +echo "${target_cc_var}=${cc}" >> "$GITHUB_ENV" echo "CXX=${cxx}" >> "$GITHUB_ENV" +echo "TARGET_CXX=${cxx}" >> "$GITHUB_ENV" +target_cxx_var="CXX_${TARGET}" +target_cxx_var="${target_cxx_var//-/_}" +echo "${target_cxx_var}=${cxx}" >> "$GITHUB_ENV" + +cargo_linker_var="CARGO_TARGET_${TARGET^^}_LINKER" +cargo_linker_var="${cargo_linker_var//-/_}" +echo "${cargo_linker_var}=${musl_linker}" >> "$GITHUB_ENV" + +echo "CMAKE_C_COMPILER=${cc}" >> "$GITHUB_ENV" echo "CMAKE_CXX_COMPILER=${cxx}" >> "$GITHUB_ENV" echo "CMAKE_ARGS=-DCMAKE_HAVE_THREADS_LIBRARY=1 -DCMAKE_USE_PTHREADS_INIT=1 -DCMAKE_THREAD_LIBS_INIT=-pthread -DTHREADS_PREFER_PTHREAD_FLAG=ON" >> "$GITHUB_ENV" diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index a6bf51369b..a8efec1089 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -261,6 +261,12 @@ jobs: /var/cache/apt key: apt-${{ matrix.runner }}-${{ matrix.target }}-v1 + - if: ${{ matrix.target == 'x86_64-unknown-linux-musl' || matrix.target == 'aarch64-unknown-linux-musl'}} + name: Install Zig + uses: mlugg/setup-zig@v2 + with: + version: 0.14.0 + - if: ${{ matrix.target == 'x86_64-unknown-linux-musl' || matrix.target == 'aarch64-unknown-linux-musl'}} name: Install musl build tools env: diff --git a/.github/workflows/rust-release.yml b/.github/workflows/rust-release.yml index 9033d058d7..3625c830dd 100644 --- a/.github/workflows/rust-release.yml +++ b/.github/workflows/rust-release.yml @@ -104,6 +104,12 @@ jobs: ${{ github.workspace }}/codex-rs/target/ key: cargo-${{ matrix.runner }}-${{ matrix.target }}-release-${{ hashFiles('**/Cargo.lock') }} + - if: ${{ matrix.target == 'x86_64-unknown-linux-musl' || matrix.target == 'aarch64-unknown-linux-musl'}} + name: Install Zig + uses: mlugg/setup-zig@v2 + with: + version: 0.14.0 + - if: ${{ matrix.target == 'x86_64-unknown-linux-musl' || matrix.target == 'aarch64-unknown-linux-musl'}} name: Install musl build tools env: diff --git a/.github/workflows/shell-tool-mcp.yml b/.github/workflows/shell-tool-mcp.yml index 0e03fea43c..a8a01b5f6a 100644 --- a/.github/workflows/shell-tool-mcp.yml +++ b/.github/workflows/shell-tool-mcp.yml @@ -97,6 +97,12 @@ jobs: with: targets: ${{ matrix.target }} + - if: ${{ matrix.install_musl }} + name: Install Zig + uses: mlugg/setup-zig@v2 + with: + version: 0.14.0 + - if: ${{ matrix.install_musl }} name: Install musl build dependencies env: