This repo bootstraps the Zig compiler against v1.41 of the Solana LLVM fork, which allows you to build Solana on-chain programs.
The version on this repo follows the Solana LLVM version, with optional patch versions to fix any issues that come up solely in this repo.
Fetch the Solana fork of LLVM, managed as a submodule:
git submodule update --init --recursive
Targets known to work:
- x86_64-linux-gnu
- x86_64-linux-musl
- x86_64-windows-gnu
- x86_64-macos-none
- aarch64-linux-gnu
- aarch64-linux-musl
- aarch64-macos-none
When updating to a new version of zig, it may be needed to update the sbf target file. This can be done by running:
zig run update_cpu_features.zig -- ../../out/build-llvm-host/bin/llvm-tablegen ../../llvm-project/ ../
The purpose of this project is to start with minimum system dependencies and end with a fully operational Zig compiler for any target.
This repository copies sources from upstream. Patches listed below. Use git to find and inspect the patch diffs.
- LLVM, LLD, Clang 18.1.7
- zlib 1.3.1
- zstd 1.5.2
- zig 0.13.0
For other versions, check the git tags of this repository.
- llvm/llvm-project#91425
- all: Deleted unused files.
- LLVM: Support .lib extension for static zstd.
- LLVM: Portable handling of .def linker flag
- Clang: Disable building of libclang-cpp.so.
- LLD: Added additional include directory to Zig's libunwind.
- LLD: Respect
LLD_BUILD_TOOLS=OFF
- zlib: Delete the ability to build a shared library.
- C++ compiler capable of building LLVM, Clang, and LLD from source (GCC 5.1+ or Clang)
- CMake 3.19 or later
- make, ninja, or any other build system supported by CMake
- POSIX system (bash, mkdir, cd)
- Python 3
./build <arch>-<os>-<abi> <mcpu>
All parameters are required:
<arch>-<os>-<abi>
: Replace with one of the Supported Triples below, or usenative
for the<arch>
value (e.g.native-linux-gnu
) to use the native architecture.<mcpu>
: Replace with a-mcpu
parameter of Zig.baseline
is recommended and means it will target a generic CPU for the target.native
means it will target the native CPU. See the Zig documentation for more details.
Please be aware of the following two CMake environment variables that can significantly affect how long it takes to build:
CMAKE_GENERATOR
can be used to select a different generator instead of the default. For example,CMAKE_GENERATOR=Ninja
.CMAKE_BUILD_PARALLEL_LEVEL
can be used to introduce parallelism to build systems (such as make) which do not default to parallel builds. This option is irrelevant when using Ninja.
When it succeeds, output can be found in out/zig-<triple>-<cpu>/
.
Bootstrapping on Windows with MSVC is also possible via build.bat
, which
takes the same arguments as build
above.
This script requires that the "C++ CMake tools for Windows" component be installed via the Visual Studio installer.
The script must be run within the Developer Command Prompt for VS 2019
shell:
build.bat <arch>-<os>-<abi> <mcpu>
To build for x86 Windows, run the script within the x86 Native Tools Command Prompt for VS 2019
.
If you try a "not tested" one and find a problem please file an issue, and a pull request linking to the issue in the table.
If you try a "not tested" one and find that it works, please file a pull request changing the status to "OK".
If you try an "OK" one and it does not work, please check if there is an existing issue, and if not, file an issue.
Note: Generally, for Linux targets, we prefer the musl libc builds over the glibc builds here, because musl builds end up producing a static binary, which is more portable across Linux distributions.
triple | support status |
---|---|
aarch64_be-linux-gnu |
#90 |
aarch64_be-linux-musl |
#92 |
aarch64_be-windows-gnu |
#94 |
aarch64-linux-gnu |
OK |
aarch64-linux-musl |
OK |
aarch64-windows-gnu |
OK |
aarch64-macos-none |
OK |
armeb-linux-gnueabi |
#96 |
armeb-linux-gnueabihf |
#97 |
armeb-linux-musleabi |
#98 |
armeb-linux-musleabihf |
#99 |
armeb-windows-gnu |
#100 |
arm-linux-gnueabi |
#101 |
arm-linux-gnueabihf |
#102 |
arm-linux-musleabi |
#103 |
arm-linux-musleabihf |
OK |
arm-windows-gnu |
#105 |
i386-linux-gnu |
not tested |
i386-linux-musl |
OK |
i386-windows-gnu |
OK |
mips64el-linux-gnuabi64 |
#106 |
mips64el-linux-gnuabin32 |
#107 |
mips64el-linux-musl |
#3 |
mips64-linux-gnuabi64 |
#108 |
mips64-linux-gnuabin32 |
#109 |
mips64-linux-musl |
#110 |
mipsel-linux-gnu |
#111 |
mipsel-linux-musl |
#12 |
mips-linux-gnu |
#112 |
mips-linux-musl |
not tested |
powerpc64le-linux-gnu |
#24 |
powerpc64le-linux-musl |
OK |
powerpc64-linux-gnu |
#113 |
powerpc64-linux-musl |
OK |
powerpc-linux-gnu |
#114 |
powerpc-linux-musl |
OK |
riscv64-linux-gnu |
#115 |
riscv64-linux-musl |
OK |
s390x-linux-gnu |
#116 |
s390x-linux-musl |
#52 |
sparc-linux-gnu |
#117 |
sparcv9-linux-gnu |
ziglang/zig#4931 |
x86_64-freebsd-gnu |
#45 |
x86_64-linux-gnu |
OK |
x86_64-linux-gnux32 |
#20 |
x86_64-linux-musl |
OK |
x86_64-windows-gnu |
OK |
x86_64-macos-none |
OK |
loongarch64-linux-musl |
#164 |
loongarch64-linux-gnu |
#166 |
arm-linux-musleabi
with mcpu value ofgeneric+v6kz
. This produces a build of Zig that runs on the RPi 1 and RPi Zero.- If you want to produce a build for this CPU exactly, use
arm1176jzf_s
.
- If you want to produce a build for this CPU exactly, use