Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions packages/musl/build.ncl
Original file line number Diff line number Diff line change
@@ -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 <stdio.h>\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 <stdio.h>\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
24 changes: 24 additions & 0 deletions packages/musl/build.sh
Original file line number Diff line number Diff line change
@@ -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-<arch>.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