Skip to main content

Build provenance: This package is built and distributed by Astral as part of astral-dev-toolchain. It packages cargo-zigbuild from tag v0.23.0 at commit 2165b45f241177af39d009f61ffb010a6ab2193d.


cargo-zigbuild

CI Crates.io docs.rs PyPI Docker Image

🚀 Help me to become a full-time open-source developer by sponsoring me on GitHub

Compile Cargo project with zig as linker for easier cross compiling.

Installation

cargo install --locked cargo-zigbuild

You can also install it using pip which will also install ziglang automatically:

pip install cargo-zigbuild

We also provide Docker images which has macOS SDK pre-installed in addition to cargo-zigbuild and Rust, for example to build for x86_64 macOS:

docker run --rm -it -v $(pwd):/io -w /io ghcr.io/rust-cross/cargo-zigbuild \
  cargo zigbuild --release --target x86_64-apple-darwin

Packaging status

Usage

  1. Install zig following the official documentation, on macOS, Windows and Linux you can also install zig from PyPI via pip3 install ziglang
  2. Install Rust target via rustup, for example, rustup target add aarch64-unknown-linux-gnu
  3. Run cargo zigbuild, for example, cargo zigbuild --target aarch64-unknown-linux-gnu

Environment Variables

Variable Description
CARGO_ZIGBUILD_PYTHON_PATH Python executable path when using Python ziglang package (default: python3)
CARGO_ZIGBUILD_ZIG_PATH Zig executable path (default: zig)
CARGO_ZIGBUILD_CACHE_DIR Cache directory for zig tools and wrappers
CARGO_ZIGBUILD_RUSTC_VERSION Override detected rustc version
SDKROOT Path to macOS SDK (auto-detected on macOS)
CMAKE_TOOLCHAIN_FILE Path to CMake toolchain file (also CMAKE_TOOLCHAIN_FILE_<target>, TARGET_CMAKE_TOOLCHAIN_FILE)
BINDGEN_EXTRA_CLANG_ARGS Extra clang arguments for bindgen (also BINDGEN_EXTRA_CLANG_ARGS_<target>)
PKG_CONFIG_SYSROOT_DIR System root for pkg-config (auto-set to SDKROOT for Apple targets)
OHOS_NDK_HOME Path to OpenHarmony NDK (required for ohos targets)
CFLAGS Additional C compiler flags
RUSTFLAGS Additional Rust compiler flags

Specify glibc version

By default --target for *-gnu will have Zig implicitly build for a default version of glibc that varies based on the release of Zig (v12 to v14 releases default to glibc 2.28).

To build for a specific minimum glibc version, add that version as a suffix to the --target value. For example, to compile with --target aarch64-unknown-linux-gnu for glibc 2.17:

cargo zigbuild --target aarch64-unknown-linux-gnu.2.17

[!NOTE] There are various caveats with the glibc version targeting feature:

  • If you do not provide a --target, Zig is not used and the command effectively runs a regular cargo build.
  • If you specify an invalid glibc version, cargo zigbuild will not relay the warning emitted from zig cc about the fallback version selected.
  • This feature does not necessarily match the behaviour of dynamically linking to a specific version of glibc on the build host.
    • Version 2.32 can be specified, but runs on a host with only 2.31 available when it should instead abort with an error.
    • Meanwhile specifying 2.33 will correctly be detected as incompatible when run on a host with glibc 2.31.
  • Certain RUSTFLAGS like -C linker opt-out of using Zig, while -L path/to/files will have Zig ignore -C target-feature=+crt-static.
  • -C target-feature=+crt-static for statically linking to a glibc version is not supported (upstream zig cc lacks support)

Tip - cargo zigbuild cannot find headers (*.h files) or libraries that exist

You may need to prepend the following ENV to your cargo zigbuild command with the following system paths or similar:

  • CFLAGS='-isystem /usr/include'
  • RUSTFLAGS='-L /usr/lib64'

cargo zigbuild always uses the zig cc option -nostdinc which excludes standard header locations like /usr/include. This is also a default behaviour for Zig whenever it is configured with a --target, which additionally opts out of standard system search paths.

This can lead to a common difference between cargo build being successful, while cargo zigbuild fails without extra configuration:

# Cannot find a header file to build:
fatal error: 'libelf.h' file not found

# Cannot find a shared library to link:
error: unable to find dynamic system library 'elf' using strategy 'no_fallback'. searched paths

There is a variety of ways to resolve this, but for system paths like /usr/include you must be careful to avoid getting the system glibc headers mixed with the glibc headers Zig provides itself, otherwise this will produce errors like from CPATH=/usr/include:

In file included from /usr/local/lib64/python3.13/site-packages/ziglang/lib/libunwind/src/gcc_personality_v0.c:21:
In file included from /usr/local/lib64/python3.13/site-packages/ziglang/lib/libunwind/include/unwind.h:18:
In file included from /usr/include/stdint.h:26:
In file included from /usr/include/bits/libc-header-start.h:33:
/usr/include/features.h:516:9: warning: '__GLIBC_MINOR__' macro redefined [-Wmacro-redefined]
  516 | #define __GLIBC_MINOR__ 41
      |         ^
<command line>:2:9: note: previous definition is here
    2 | #define __GLIBC_MINOR__ 37
      |

When you have installed system packages that added headers to /usr/include that your project needs to build, you will want Zig to fallback to /usr/include just for those headers while using it's own for glibc. This can be done with zig cc -isystem /usr/include, which for cargo zigbuild can be configured through the common ENV CFLAGS='-isystem /usr/include'.

For the similar issue with shared libraries, if your packages are installing system libraries at /usr/lib64 you would normally use LDFLAGS='-L /usr/lib64', but rustc and cargo do not read this ENV but they must be configured with the search path for crates with a build.rs that searches for a library to link dynamically/statically. Instead you will need to use RUSTFLAGS='-L /usr/lib64'.

Tip - Verify minimum GLIBC version required

Provided you have no stripped the symbols from your binary built, on Linux you can run the following script to scan for glibc versioned symbols and find the highest version (the minimum required to run)

  1. Create a file /usr/local/bin/get-min-glibc:

    #!/bin/bash
    
    FILE_NAME=$1
    LANG=C readelf -W --version-info --dyn-syms ${FILE_NAME} \
      | grep 'Name: GLIBC' \
      | sed -re 's/.*GLIBC_(.+) Flags.*/\1/g' \
      | sort -t . -k1,1n -k2,2n \
      | tail -n 1
    
  2. Make the script command executable:

    chmod +x /usr/local/bin/get-min-glibc
    
  3. Run the command with the path to your executable / library to check:

    $ get-min-glibc target/x86_64-unknown-linux-gnu/release/hello-world
    2.28
    

macOS universal2 target

cargo zigbuild supports a special universal2-apple-darwin target for building macOS universal2 binaries/libraries on Rust 1.64.0 and later.

rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin
cargo zigbuild --target universal2-apple-darwin

Note

Note that Cargo --message-format option doesn't work with universal2 target currently.

Caveats

  1. Currently only Linux and macOS targets are supported, other target platforms can be added if you can make it work, pull requests are welcome.
  2. Only current Rust stable and nightly versions are regularly tested on CI, other versions may not work.
  3. When using zig 0.15+ with crates that use bindgen, you may need clang 18+ installed for bindgen to work correctly. This is because zig 0.15+ bundles libc++ 19 headers which require a compatible libclang version.

Known upstream zig issues:

  1. zig cc: parse -target and -mcpu/-march/-mtune flags according to clang: Some Rust targets aren't recognized by zig cc, for example armv7-unknown-linux-gnueabihf, workaround by using -mcpu=generic and explicitly passing target features in #58
  2. ability to link against darwin frameworks (such as CoreFoundation) when cross compiling: Set the SDKROOT environment variable to a macOS SDK path to workaround it
  3. zig misses some compiler_rt functions that may lead to undefined symbol error for certain targets. See also: zig compiler-rt status.
  4. CPU features are not passed to clang

License

This work is released under the MIT license. A copy of the license is provided in the LICENSE file.

Release files for astral-dev-toolchain-cargo-zigbuild 0.23.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for astral-dev-toolchain-cargo-zigbuild 0.23.0
File
astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details
astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 9.0 MB

Release files / astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-win_arm64.whl

Download URL astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-win_arm64.whl
Size 1.4 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
f69ce1997b3138b2e61d038be99b81ff8c607f3a093f148078a676a8fec65465
BLAKE2b-256 checksum
How to use checksums
a228c18d1c000cee5d9f973a8e5e5a7781cb46e529070754c7c536fc9888ec95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release files / astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-win_amd64.whl

Download URL astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-win_amd64.whl
Size 1.5 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
a289022ebda0cab1530089b429cdefd95fe74cb84ee0960137b6e7ca9ba6c48b
BLAKE2b-256 checksum
How to use checksums
a59b385380c04781f08988b4bb2903f4c65e8cefb437b881324e73ecf4c16fbe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release files / astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.5 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
256247c6971efcc06bc85976e71bf63dc1d9ba7dbf46b43709f6d6263aef76e3
BLAKE2b-256 checksum
How to use checksums
2f577cf864e1a2f42b5811a8807c2b4aa6a6b311abff829b5cad07ca5d0f5bdf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release files / astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 1.4 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
44124dd0a8ac06456c3f897ea332fa22580fbedfb87e9042e435088d26f2724d
BLAKE2b-256 checksum
How to use checksums
cd8fa7ec4cb942c527e6b99aab5dc0e5600a6c81d09cee36a9821a383262bbdd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release files / astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-macosx_11_0_arm64.whl

Download URL astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-macosx_11_0_arm64.whl
Size 1.6 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
75be6ea506c1db53ccbdd45054d629690af1c3d485694903f69bc919c88fac0f
BLAKE2b-256 checksum
How to use checksums
59afbaf51b4d3ef28433997e6eb15b1ad52f372605714c5d5b24aa659e9dcc31
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release files / astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-macosx_10_12_x86_64.whl

Download URL astral_dev_toolchain_cargo_zigbuild-0.23.0-py3-none-macosx_10_12_x86_64.whl
Size 1.6 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
db0e5190e37d03f53328d1030c169516e5bfbb9bb7dc35b1e2bddb0d77d72de6
BLAKE2b-256 checksum
How to use checksums
18cb884643acb2e786b0f8407145cd0ab8d901517c228fd55aa2ae529e7e4bd8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release history Release notifications | RSS feed

0.23.4

6 release files

This release

0.23.0 This release

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page