{ lib, buildPlatform, hostPlatform, fetchurl, bash, gcc, binutils, findutils, gnumake, gnugrep, gnused, gnutar, gzip, linux-headers, libgcc, }: let inherit (import ./common.nix { inherit lib; }) pname meta; version = "1.2.6"; src = fetchurl { url = "https://musl.libc.org/releases/musl-${version}.tar.gz"; hash = "sha256-1YX9O2E8ZhUfwySejtRPdwIMtebB5jWmFtP5+CRgUSo="; }; binutilsTargetPrefix = lib.optionalString ( hostPlatform.config != buildPlatform.config ) "${hostPlatform.config}-"; in bash.runCommand "${pname}-${version}" { inherit pname version meta; nativeBuildInputs = [ gcc binutils findutils gnumake gnused gnugrep gnutar gzip ]; passthru.tests.hello-world = result: bash.runCommand "${pname}-simple-program-${version}" { nativeBuildInputs = [ gcc binutils result ]; } '' cat <> test.c #include int main() { printf("Hello World!\n"); return 0; } EOF musl-gcc -o test test.c ./test mkdir $out ''; } '' # Unpack tar xzf ${src} cd musl-${version} # Patch # https://github.com/ZilchOS/bootstrap-from-tcc/blob/2e0c68c36b3437386f786d619bc9a16177f2e149/using-nix/2a3-intermediate-musl.nix sed -i 's|/bin/sh|${lib.getExe bash}|' \ tools/*.sh # patch popen/system to search in PATH instead of hardcoding /bin/sh sed -i 's|posix_spawn(&pid, "/bin/sh",|posix_spawnp(\&pid, "sh",|' \ src/stdio/popen.c src/process/system.c sed -i 's|execl("/bin/sh", "sh", "-c",|execlp("sh", "-c",|'\ src/misc/wordexp.c # Configure export CC="${binutilsTargetPrefix}gcc -B${libgcc}/lib/gcc/${hostPlatform.config}/${libgcc.version} -Wl,-rpath,${libgcc}/lib/gcc/${hostPlatform.config}/${libgcc.version}" bash ./configure \ --prefix=$out \ --build=${buildPlatform.config} \ --host=${hostPlatform.config} \ --syslibdir=$out/lib # Build make -j $NIX_BUILD_CORES # Install make -j $NIX_BUILD_CORES install mkdir -p $out/bin ln -s ../lib/libc.so $out/bin/ldd ln -s $(ls -d ${linux-headers}/include/* | grep -v scsi\$) $out/include/ # Strip # Ignore failures, because strip may fail on non-elf files. find $out/{bin,lib} -type f -exec ${binutilsTargetPrefix}strip --strip-debug {} + || true ''