diff --git a/lib/maintainers.nix b/lib/maintainers.nix index f561972c93003..ceb0e56d3ac0b 100644 --- a/lib/maintainers.nix +++ b/lib/maintainers.nix @@ -108,6 +108,7 @@ dochang = "Desmond O. Chang "; doublec = "Chris Double "; drewkett = "Andrew Burkett "; + dvc94ch = "David Craven "; ebzzry = "Rommel Martinez "; ederoyd46 = "Matthew Brown "; eduarrrd = "Eduard Bachmakov "; diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index da114fdb347fa..a59642f2198e6 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -244,7 +244,8 @@ stdenv.mkDerivation { # The dynamic linker has different names on different Linux platforms. dynamicLinker = if !nativeLibc then - (if stdenv.system == "i686-linux" then "ld-linux.so.2" else + (if libc.isMusl or false then libc.dynamicLinker else + if stdenv.system == "i686-linux" then "ld-linux.so.2" else if stdenv.system == "x86_64-linux" then "ld-linux-x86-64.so.2" else # ARM with a wildcard, which can be "" or "-armhf". if stdenv.isArm then "ld-linux*.so.3" else @@ -265,7 +266,8 @@ stdenv.mkDerivation { # the style in the gcc-cross-wrapper, but to keep a stable stdenv now I # do this sufficient if/else. dynamicLinker = - (if stdenv.cross.arch == "arm" then "ld-linux.so.3" else + (if stdenv.cross.libc == "musl" then muslCross.dynamicLinker else + if stdenv.cross.arch == "arm" then "ld-linux.so.3" else if stdenv.cross.arch == "mips" then "ld.so.1" else if stdenv.lib.hasSuffix "pc-gnu" stdenv.cross.config then "ld.so.1" else abort "don't know the name of the dynamic linker for this platform"); diff --git a/pkgs/development/compilers/gcc/6/default.nix b/pkgs/development/compilers/gcc/6/default.nix index 6ca0f2f59f44b..c18078701719f 100644 --- a/pkgs/development/compilers/gcc/6/default.nix +++ b/pkgs/development/compilers/gcc/6/default.nix @@ -190,7 +190,10 @@ let version = "6.1.0"; else (if cross.libc == "uclibc" then # In uclibc cases, libgomp needs an additional '-ldl' # and as I don't know how to pass it, I disable libgomp. - " --disable-libgomp" else "") + + " --disable-libgomp" + else if cross.libc == "musl" then + " --disable-libsanitizer" + else "") + " --enable-threads=posix" + " --enable-nls" + " --disable-decimal-float") # No final libdecnumber (it may work only in 386) diff --git a/pkgs/development/compilers/gcc/libgcc.nix b/pkgs/development/compilers/gcc/libgcc.nix new file mode 100644 index 0000000000000..1d7c11ce3be42 --- /dev/null +++ b/pkgs/development/compilers/gcc/libgcc.nix @@ -0,0 +1,27 @@ +{ stdenv, gcc, glibc }: + +stdenv.mkDerivation rec { + name = "libgcc-${version}"; + version = gcc.cc.version; + arch = "x86_64-unknown-linux-gnu"; + path = "${gcc.cc}/lib/gcc/${arch}/${version}"; + + buildCommand = '' + mkdir -p "$out/lib" + + cp -r ${path}/libgcc.a $out/lib + cp -r ${path}/crtbegin.o $out/lib + cp -r ${path}/crtbeginS.o $out/lib + cp -r ${path}/crtbeginT.o $out/lib + cp -r ${path}/crtendS.o $out/lib + cp -r ${path}/crtend.o $out/lib + + cp -r ${path}/crtfastmath.o $out/lib + cp -r ${path}/crtprec32.o $out/lib + cp -r ${path}/crtprec80.o $out/lib + cp -r ${path}/crtprec64.o $out/lib + cp -r ${path}/libgcc_eh.a $out/lib + + cp -r ${glibc.out}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so + ''; +} diff --git a/pkgs/os-specific/linux/busybox/default.nix b/pkgs/os-specific/linux/busybox/default.nix index fa6591701a698..36b4c54d13fae 100644 --- a/pkgs/os-specific/linux/busybox/default.nix +++ b/pkgs/os-specific/linux/busybox/default.nix @@ -1,7 +1,6 @@ -{ stdenv, fetchurl, musl +{ stdenv, fetchurl , enableStatic ? false , enableMinimal ? false -, useMusl ? false , extraConfig ? "" }: @@ -61,8 +60,6 @@ stdenv.mkDerivation rec { EOF make oldconfig - '' + stdenv.lib.optionalString useMusl '' - makeFlagsArray+=("CC=gcc -isystem ${musl}/include -B${musl}/lib -L${musl}/lib") ''; crossAttrs = { diff --git a/pkgs/os-specific/linux/musl/default.nix b/pkgs/os-specific/linux/musl/default.nix index a8055df92fdec..ba62652e4dfd2 100644 --- a/pkgs/os-specific/linux/musl/default.nix +++ b/pkgs/os-specific/linux/musl/default.nix @@ -1,32 +1,47 @@ -{ stdenv, fetchurl }: +{ stdenv, fetchurl, cross ? null, gccCross ? null }: stdenv.mkDerivation rec { - name = "musl-${version}"; - version = "1.1.11"; + name = "musl-${version}${stdenv.lib.optionalString (cross != null) ''-${cross.arch}''}"; + version = "1.1.14"; src = fetchurl { - url = "http://www.musl-libc.org/releases/${name}.tar.gz"; - sha256 = "0grmmah3d9wajii26010plpinv3cbiq3kfqsblgn84kv3fjnv7mv"; + url = "http://www.musl-libc.org/releases/musl-${version}.tar.gz"; + sha256 = "1ddral87srzk741cqbfrx9aygnh8fpgfv7mjvbain2d6hh6c1xim"; }; - enableParallelBuilding = true; + buildInputs = stdenv.lib.optional (gccCross != null) gccCross; + CROSS_COMPILE = stdenv.lib.optionalString (cross != null) "${cross.config}-"; preConfigure = '' configureFlagsArray+=("--syslibdir=$out/lib") + ${stdenv.lib.optionalString (gccCross != null) ''export CC="${cross.config}-gcc"''} ''; configureFlags = [ "--enable-shared" "--enable-static" - ]; + "--disable-gcc-wrapper" + ] ++ stdenv.lib.optional (cross != null) "--target=${cross.arch}"; + outputs = ["dev" "out"]; + enableParallelBuilding = true; dontDisableStatic = true; + dontSetConfigureCross = true; + dontStrip = true; + dontCrossStrip = true; + + passthru = { + # isMusl can be dropped when/if providing the dynamicLinker + # name through the libc is adopted + isMusl = true; + dynamicLinker = "libc.so"; + }; meta = { description = "An efficient, small, quality libc implementation"; homepage = "http://www.musl-libc.org"; license = stdenv.lib.licenses.mit; platforms = stdenv.lib.platforms.linux; - maintainers = [ stdenv.lib.maintainers.thoughtpolice ]; + maintainers = with stdenv.lib.maintainers; [ dvc94ch thoughtpolice ]; }; } diff --git a/pkgs/stdenv/linux/make-bootstrap-tools.nix b/pkgs/stdenv/linux/make-bootstrap-tools.nix index 8ffeebaa962e6..12526c175ebb1 100644 --- a/pkgs/stdenv/linux/make-bootstrap-tools.nix +++ b/pkgs/stdenv/linux/make-bootstrap-tools.nix @@ -13,7 +13,7 @@ rec { tarMinimal = gnutar.override { acl = null; }; busyboxMinimal = busybox.override { - useMusl = true; + stdenv = muslStdenv; enableStatic = true; enableMinimal = true; extraConfig = '' diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 9fbc40ed44813..96f65a9b674d3 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4199,6 +4199,8 @@ in gcc = gcc5; + libgcc = callPackage ../development/compilers/gcc/libgcc.nix {}; + wrapCCMulti = cc: if system == "x86_64-linux" then lowPrio ( let @@ -7117,6 +7119,7 @@ in # We can choose: libcCrossChooser = name: if name == "glibc" then glibcCross + else if name == "musl" then muslCross else if name == "uclibc" then uclibcCross else if name == "msvcrt" then windows.mingw_w64 else if name == "libSystem" then darwin.xcode @@ -11127,6 +11130,11 @@ in multipath-tools = callPackage ../os-specific/linux/multipath-tools { }; musl = callPackage ../os-specific/linux/musl { }; + muslStdenv = overrideCC stdenv (gcc.override { libc = musl; }); + muslCross = forceNativeDrv (musl.override { + gccCross = gccCrossStageStatic; + cross = assert crossSystem != null; crossSystem; + }); nettools = callPackage ../os-specific/linux/net-tools { };