diff --git a/packages/musl/build.ncl b/packages/musl/build.ncl new file mode 100644 index 00000000..3f1b8d37 --- /dev/null +++ b/packages/musl/build.ncl @@ -0,0 +1,67 @@ +let { BuildSpec, Local, OutputBin, OutputData, OutputLib, Source, Test, .. } = import "minimal.ncl" in + +let version = "1.2.6" in + +let base = import "../base/build.ncl" in +let binutils = import "../binutils/build.ncl" in +let make = import "../make/build.ncl" in +let toolchain = import "../toolchain/build.ncl" in + +{ + name = "musl", + + build_deps = [ + { file = "build.sh" } | Local, + { + url = "https://git.musl-libc.org/cgit/musl/snapshot/musl-%{version}.tar.gz", + sha256 = "e9db8b70b0cba3db43b27e84ccd8a0c0958b40029a1c36c9f13817b93787b4d6", + extract = true, + strip_prefix = "musl-%{version}", + } | Source, + base, + toolchain, + make, + ], + + runtime_deps = [], + + cmd = "./build.sh", + build_args = { + include version, + }, + + outputs = { + bins = { glob = "usr/bin/*" } | OutputBin, + musl_bins = { glob = "usr/local/musl/bin/*" } | OutputBin, + libs = { glob = "usr/local/musl/lib/*" } | OutputLib, + headers = { glob = "usr/local/musl/include/**" } | OutputData, + }, + + attrs = { + upstream_version = version, + }, + + tests = { + compile_and_run = + { + class = 'Standalone, + test_deps = [base, toolchain, binutils], + cmds = [ + ["/bin/bash", "-c", "echo '#include \nint main() { printf(\"Hello from musl!\\n\"); return 0; }' > test.c"], + ["/bin/bash", "-c", "musl-gcc test.c -o test"], + ["/bin/bash", "-c", "./test | grep 'Hello from musl!'"], + ], + } | Test, + compile_static = + { + class = 'Standalone, + test_deps = [base, toolchain, binutils], + cmds = [ + ["/bin/bash", "-c", "echo '#include \nint main() { printf(\"Hello from musl!\\n\"); return 0; }' > test.c"], + ["/bin/bash", "-c", "musl-gcc -static test.c -o test_static"], + ["/bin/bash", "-c", "./test_static | grep 'Hello from musl!'"], + ["/bin/bash", "-c", "ldd test_static 2>&1 | grep 'not a dynamic executable'"], + ], + } | Test, + }, +} | BuildSpec diff --git a/packages/musl/build.sh b/packages/musl/build.sh new file mode 100755 index 00000000..36a73c78 --- /dev/null +++ b/packages/musl/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -euo pipefail + + +export CFLAGS="-O3 -pipe -ffile-prefix-map=$(pwd)=/builddir -gno-record-gcc-switches" +export LDFLAGS="-Wl,--build-id=none" +export ARFLAGS=Drc + +./configure --prefix=/usr/local/musl --syslibdir=/usr/local/musl/lib +make -j$(nproc) +make DESTDIR=$OUTPUT_DIR install + +# Minimal's sandbox requires symlinks to be relative to the output directory +# musl creates an absolute symlink: ld-musl-.so.1 -> /usr/local/musl/lib/libc.so +cd $OUTPUT_DIR/usr/local/musl/lib +for f in ld-musl-*.so.1; do + if [ -L "$f" ]; then + ln -sf libc.so "$f" + fi +done + +# Expose musl-gcc in the standard PATH so it's easy to use +mkdir -p $OUTPUT_DIR/usr/bin +ln -sf ../local/musl/bin/musl-gcc $OUTPUT_DIR/usr/bin/musl-gcc