-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Building multiple libcs for testing
Alex Rønne Petersen edited this page May 15, 2025
·
13 revisions
When working on Zig, especially in low-level areas, it can be useful to build many copies of libc for different architectures so that zig build test will run tests for all of them. After completing one or more of the sections below, you can do e.g. zig build test -fqemu --libc-runtimes $HOME/.local/libc.
This will take multiple hours even on a beefy machine:
git clone https://sourceware.org/git/glibc.git
cd glibc
git checkout $(git describe $(git rev-list -n 1 --tags='glibc-?.??'))
mkdir build
cd build
../scripts/build-many-glibcs.py . checkout
pushd src/glibc
git checkout $(git describe $(git rev-list -n 1 --tags='glibc-?.??'))
popd
../scripts/build-many-glibcs.py . host-libraries -j $(nproc)
../scripts/build-many-glibcs.py . compilers -j $(nproc)
../scripts/build-many-glibcs.py . glibcs -j $(nproc)
mkdir -p $HOME/.local/libc
mv install/glibcs/* $HOME/.local/libcThis should take around 5-10 minutes:
git clone https://github.com/alexrp/musl.git
cd musl
# Tracks the latest musl release with Hexagon patches from: https://github.com/quic/musl
git checkout hexagon
# Workaround for: https://www.openwall.com/lists/musl/2025/01/24/1
sed -i 's/\tbrasl %r14, __tls_get_addr/.hidden __tls_get_addr\n\tbrasl %r14, __tls_get_addr/' src/thread/s390x/__tls_get_offset.s
mkdir build
cd build
for triple in arm-linux-musleabi \
arm-linux-musleabihf \
armeb-linux-musleabi \
armeb-linux-musleabihf \
thumb-linux-musleabi \
thumb-linux-musleabihf \
thumbeb-linux-musleabi \
thumbeb-linux-musleabihf \
aarch64-linux-musl \
aarch64_be-linux-musl \
hexagon-linux-musl \
loongarch64-linux-musl \
mips-linux-musleabi \
mips-linux-musleabihf \
mipsel-linux-musleabi \
mipsel-linux-musleabihf \
mips64-linux-muslabi64 \
mips64-linux-muslabin32 \
mips64el-linux-muslabi64 \
mips64el-linux-muslabin32 \
powerpc-linux-musleabi \
powerpc-linux-musleabihf \
powerpc64-linux-musl \
powerpc64le-linux-musl \
riscv32-linux-musl \
riscv64-linux-musl \
s390x-linux-musl \
x86_64-linux-musl; do
echo -e '#!/bin/sh\nzig cc -target '$triple' $@' > zcc-$triple
done
chmod +x zcc-*
for zcc in $(echo zcc-* | sort); do
prefix=$HOME/.local/libc/${zcc#zcc-}
target=${zcc#zcc-}
target=${target/x86-/i386-}
target=${target/thumb-/arm-}
target=${target/thumbeb-/armeb-}
../configure --prefix=$prefix --bindir=$prefix/usr/bin --includedir=$prefix/usr/include --libdir=$prefix/usr/lib --syslibdir=$prefix/lib --target=$target --enable-debug AR="zig ar" CC=$PWD/$zcc RANLIB="zig ranlib" && \
rm -f conf*-*-*.o && \
make clean && \
make -j $(nproc) && \
make install || break
doneNote that x86-linux-musl and x86_64-linux-muslx32 are currently broken.
TODO
TODO