From 115bf9d2cfae7400f4d69dc7fa02216a2c09ca32 Mon Sep 17 00:00:00 2001 From: Will Dietz Date: Thu, 30 Nov 2017 13:43:38 -0600 Subject: [PATCH 01/40] cc-wrapper: don't add broken cflags to clang On non-GNU (gcc) compilers, there is no "/lib/gcc/..." so when this is eventually expanded this is empty resulting in an incomplete "-idirafter " that eats the next argument: -idirafter -B/nix/store/wamjwwdvkmhbf4f2902nhw8jxxzv0hy3-clang-wrapper-4.0.1/bin/ --- pkgs/build-support/cc-wrapper/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index b79697b33f0c..b809591fbc82 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -264,7 +264,7 @@ stdenv.mkDerivation { # compile, because it uses "#include_next " to find the # limits.h file in ../includes-fixed. To remedy the problem, # another -idirafter is necessary to add that directory again. - echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include -idirafter ${cc}/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags + echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include ${optionalString isGNU "-idirafter ${cc}/lib/gcc/*/*/include-fixed"}" > $out/nix-support/libc-cflags echo "-L${libc_lib}/lib" > $out/nix-support/libc-ldflags From 9d8f9b2e531bf95a700a949d879927fb6996ffc9 Mon Sep 17 00:00:00 2001 From: Will Dietz Date: Thu, 30 Nov 2017 13:10:41 -0600 Subject: [PATCH 02/40] Add clang multilib variants (x64_64-only, 64/32bit), basic multilib tests --- pkgs/development/compilers/llvm/multi.nix | 44 +++++++++++++++++++++++ pkgs/test/cc-wrapper/multilib.nix | 37 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 16 +++++++++ pkgs/top-level/release.nix | 2 ++ 4 files changed, 99 insertions(+) create mode 100644 pkgs/development/compilers/llvm/multi.nix create mode 100644 pkgs/test/cc-wrapper/multilib.nix diff --git a/pkgs/development/compilers/llvm/multi.nix b/pkgs/development/compilers/llvm/multi.nix new file mode 100644 index 000000000000..0fa0eb3404d8 --- /dev/null +++ b/pkgs/development/compilers/llvm/multi.nix @@ -0,0 +1,44 @@ +{ runCommand, +clang, +gcc64, +gcc32, +glibc_multi +}: + +let + combine = basegcc: runCommand "combine-gcc-libc" {} '' + mkdir -p $out + cp -r ${basegcc.cc}/lib $out/lib + + chmod u+rw -R $out/lib + cp -r ${basegcc.libc}/lib/* $(ls -d $out/lib/gcc/*/*) + ''; + gcc_multi_sysroot = runCommand "gcc-multi-sysroot" {} '' + mkdir -p $out/lib/gcc + + ln -s ${combine gcc64}/lib/gcc/* $out/lib/gcc/ + ln -s ${combine gcc32}/lib/gcc/* $out/lib/gcc/ + # XXX: This shouldn't be needed, clang just doesn't look for "i686-unknown" + ln -s $out/lib/gcc/i686-unknown-linux-gnu $out/lib/gcc/i686-pc-linux-gnu + + + # includes + ln -s ${glibc_multi.dev}/include $out/ + + # dynamic linkers + mkdir -p $out/lib/32 + ln -s ${glibc_multi.out}/lib/ld-linux* $out/lib + ln -s ${glibc_multi.out}/lib/32/ld-linux* $out/lib/32/ + ''; + + clangMulti = clang.override { + # Only used for providing expected structure re:dynamic linkers, AFAIK + # Most of the magic is done by setting the --gcc-toolchain option below + libc = gcc_multi_sysroot; + + extraBuildCommands = '' + sed -e '$a --gcc-toolchain=${gcc_multi_sysroot}' -i $out/nix-support/libc-cflags + ''; + }; + +in clangMulti diff --git a/pkgs/test/cc-wrapper/multilib.nix b/pkgs/test/cc-wrapper/multilib.nix new file mode 100644 index 000000000000..5ea50b5eb268 --- /dev/null +++ b/pkgs/test/cc-wrapper/multilib.nix @@ -0,0 +1,37 @@ +{ stdenv }: + +stdenv.mkDerivation { + name = "cc-multilib-test"; + + # XXX: "depend" on cc-wrapper test? + + # TODO: Have tests report pointer size or something; ensure they are what we asked for + buildCommand = '' + NIX_DEBUG=1 $CC -v + NIX_DEBUG=1 $CXX -v + + printf "checking whether compiler builds valid C binaries... " >&2 + $CC -o cc-check ${./cc-main.c} + ./cc-check + + printf "checking whether compiler builds valid 32bit C binaries... " >&2 + $CC -m32 -o c32-check ${./cc-main.c} + ./c32-check + + printf "checking whether compiler builds valid 64bit C binaries... " >&2 + $CC -m64 -o c64-check ${./cc-main.c} + ./c64-check + + printf "checking whether compiler builds valid 32bit C++ binaries... " >&2 + $CXX -m32 -o cxx32-check ${./cxx-main.cc} + ./cxx32-check + + printf "checking whether compiler builds valid 64bit C++ binaries... " >&2 + $CXX -m64 -o cxx64-check ${./cxx-main.cc} + ./cxx64-check + + touch $out + ''; + + meta.platforms = stdenv.lib.platforms.x86_64; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 839bed15d4a8..3470651acdbe 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5579,7 +5579,20 @@ with pkgs; ''; }) else throw "Multilib ${cc.name} not supported on ‘${system}’"; + wrapClangMulti = clang: + if system == "x86_64-linux" then + callPackages ../development/compilers/llvm/multi.nix { + inherit clang; + gcc32 = pkgsi686Linux.gcc; + gcc64 = pkgs.gcc; + } + else throw "Multilib ${clang.cc.name} not supported on '${system}'"; + gcc_multi = wrapCCMulti gcc; + clang_multi = wrapClangMulti clang; + + gccMultiStdenv = overrideCC stdenv gcc_multi; + clangMultiStdenv = overrideCC stdenv clang_multi; gcc_debug = lowPrio (wrapCC (gcc.cc.override { stripped = false; @@ -20040,6 +20053,9 @@ with pkgs; cc-wrapper-libcxx-5 = callPackage ../test/cc-wrapper { stdenv = llvmPackages_5.libcxxStdenv; }; stdenv-inputs = callPackage ../test/stdenv-inputs { }; + cc-multilib-gcc = callPackage ../test/cc-wrapper/multilib.nix { stdenv = gccMultiStdenv; }; + cc-multilib-clang = callPackage ../test/cc-wrapper/multilib.nix { stdenv = clangMultiStdenv; }; + macOSSierraShared = callPackage ../test/macos-sierra-shared {}; }; diff --git a/pkgs/top-level/release.nix b/pkgs/top-level/release.nix index 8cbb7063b4eb..201c3a38cf8b 100644 --- a/pkgs/top-level/release.nix +++ b/pkgs/top-level/release.nix @@ -112,6 +112,8 @@ let jobs.tests.cc-wrapper-clang-39.x86_64-darwin jobs.tests.cc-wrapper-libcxx-39.x86_64-linux jobs.tests.cc-wrapper-libcxx-39.x86_64-darwin + jobs.tests.cc-multilib-gcc.x86_64-linux + jobs.tests.cc-multilib-clang.x86_64-linux jobs.tests.stdenv-inputs.x86_64-linux jobs.tests.stdenv-inputs.x86_64-darwin jobs.tests.macOSSierraShared.x86_64-darwin From d945b3e53b14b7e09229e26d5e343482be1dd3e5 Mon Sep 17 00:00:00 2001 From: Frederik Rietdijk Date: Sun, 10 Dec 2017 15:41:05 +0100 Subject: [PATCH 03/40] buildPythonPackage: remove bytecode from bin folder When a Python script has the extension `.py`, bytecode is generated. Typically, executables in bin have no extension, so no bytecode is generated. However, some packages do provide executables with extensions, and thus bytecode is generated. --- .../interpreters/python/mk-python-derivation.nix | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkgs/development/interpreters/python/mk-python-derivation.nix b/pkgs/development/interpreters/python/mk-python-derivation.nix index a0cac7d1ddda..1fd6745093bb 100644 --- a/pkgs/development/interpreters/python/mk-python-derivation.nix +++ b/pkgs/development/interpreters/python/mk-python-derivation.nix @@ -40,6 +40,12 @@ # Skip wrapping of python programs altogether , dontWrapPythonPrograms ? false +# Remove bytecode from bin folder. +# When a Python script has the extension `.py`, bytecode is generated +# Typically, executables in bin have no extension, so no bytecode is generated. +# However, some packages do provide executables with extensions, and thus bytecode is generated. +, removeBinBytecode ? true + , meta ? {} , passthru ? {} @@ -77,6 +83,11 @@ python.stdenv.mkDerivation (builtins.removeAttrs attrs [ postFixup = lib.optionalString (!dontWrapPythonPrograms) '' wrapPythonPrograms + '' + lib.optionalString removeBinBytecode '' + if [ -d "$out/bin" ]; then + rm -rf "$out/bin/__pycache__" # Python 3 + find "$out/bin" -type f -name "*.pyc" -delete # Python 2 + fi '' + lib.optionalString catchConflicts '' # Check if we have two packages with the same name in the closure and fail. # If this happens, something went wrong with the dependencies specs. From a3349304909aee736bc9a9ad1c35d698a27df23d Mon Sep 17 00:00:00 2001 From: Frederik Rietdijk Date: Sun, 10 Dec 2017 14:20:38 +0100 Subject: [PATCH 04/40] Python: rewrite requiredPythonModules. Add requiredPythonModules attribute to derivation --- .../interpreters/python/build-python-package.nix | 4 ++-- .../interpreters/python/mk-python-derivation.nix | 11 +++-------- pkgs/top-level/python-packages.nix | 14 ++++++-------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/pkgs/development/interpreters/python/build-python-package.nix b/pkgs/development/interpreters/python/build-python-package.nix index 982542c1fc3e..12d17b2e8322 100644 --- a/pkgs/development/interpreters/python/build-python-package.nix +++ b/pkgs/development/interpreters/python/build-python-package.nix @@ -7,7 +7,7 @@ , setuptools , unzip , ensureNewerSourcesHook -, pythonModule +, toPythonModule , namePrefix , bootstrapped-pip , flit @@ -19,7 +19,7 @@ let wheel-specific = import ./build-python-package-wheel.nix { }; common = import ./build-python-package-common.nix { inherit python bootstrapped-pip; }; mkPythonDerivation = import ./mk-python-derivation.nix { - inherit lib python wrapPython setuptools unzip ensureNewerSourcesHook pythonModule namePrefix; + inherit lib python wrapPython setuptools unzip ensureNewerSourcesHook toPythonModule namePrefix; }; in diff --git a/pkgs/development/interpreters/python/mk-python-derivation.nix b/pkgs/development/interpreters/python/mk-python-derivation.nix index a0cac7d1ddda..b92167ce42d6 100644 --- a/pkgs/development/interpreters/python/mk-python-derivation.nix +++ b/pkgs/development/interpreters/python/mk-python-derivation.nix @@ -7,7 +7,7 @@ , unzip , ensureNewerSourcesHook # Whether the derivation provides a Python module or not. -, pythonModule +, toPythonModule , namePrefix }: @@ -54,7 +54,7 @@ if disabled then throw "${name} not supported for interpreter ${python.executable}" else -python.stdenv.mkDerivation (builtins.removeAttrs attrs [ +toPythonModule (python.stdenv.mkDerivation (builtins.removeAttrs attrs [ "disabled" "checkInputs" "doCheck" "doInstallCheck" "dontWrapPythonPrograms" "catchConflicts" ] // { @@ -84,14 +84,9 @@ python.stdenv.mkDerivation (builtins.removeAttrs attrs [ ${python.interpreter} ${./catch_conflicts}/catch_conflicts.py '' + attrs.postFixup or ''''; - passthru = { - inherit python; # The python interpreter - inherit pythonModule; - } // passthru; - meta = { # default to python's platforms platforms = python.meta.platforms; isBuildPythonPackage = python.meta.platforms; } // meta; -}) +})) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index b4e4e274893e..7068ccedb73a 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -56,14 +56,14 @@ let flit = self.flit; # We want Python libraries to be named like e.g. "python3.6-${name}" inherit namePrefix; - pythonModule = python; + inherit toPythonModule; })); buildPythonApplication = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix { inherit bootstrapped-pip; flit = self.flit; namePrefix = ""; - pythonModule = false; + toPythonModule = x: x; # Application does not provide modules. })); graphiteVersion = "1.0.2"; @@ -91,11 +91,9 @@ let # Get list of required Python modules given a list of derivations. requiredPythonModules = drvs: let - filterNull = list: filter (x: !isNull x) list; - conditionalGetRecurse = attr: condition: drv: let f = conditionalGetRecurse attr condition; in - (if (condition drv) then unique [drv]++(concatMap f (filterNull(getAttr attr drv))) else []); - _required = drv: conditionalGetRecurse "propagatedBuildInputs" hasPythonModule drv; - in [python] ++ (unique (concatMap _required (filterNull drvs))); + removeNull = list: filter (x: !isNull x) list; + modules = filter hasPythonModule (removeNull drvs); + in unique ([python] ++ modules ++ concatLists (catAttrs "requiredPythonModules" modules)); # Create a PYTHONPATH from a list of derivations. This function recurses into the items to find derivations # providing Python modules. @@ -106,9 +104,9 @@ let drv.overrideAttrs( oldAttrs: { # Use passthru in order to prevent rebuilds when possible. passthru = (oldAttrs.passthru or {})// { - name = namePrefix + oldAttrs.name; pythonModule = python; pythonPath = [ ]; # Deprecated, for compatibility. + requiredPythonModules = requiredPythonModules drv.propagatedBuildInputs; }; }); From 9630bd52323e335c422d4da208590abb535fda43 Mon Sep 17 00:00:00 2001 From: Frederik Rietdijk Date: Sun, 10 Dec 2017 14:20:52 +0100 Subject: [PATCH 05/40] python.pkgs.setuptools: mark as python module --- pkgs/top-level/python-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 7068ccedb73a..d164b80279bb 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -127,7 +127,7 @@ in { recursivePthLoader = callPackage ../development/python-modules/recursive-pth-loader { }; - setuptools = callPackage ../development/python-modules/setuptools { }; + setuptools = toPythonModule (callPackage ../development/python-modules/setuptools { }); vowpalwabbit = callPackage ../development/python-modules/vowpalwabbit { pythonPackages = self; From c86b19cb20f68e6b65af6ac884940ea125e4a8f8 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Sun, 10 Dec 2017 20:10:35 +0000 Subject: [PATCH 06/40] Python: simplify hasPythonModule --- pkgs/top-level/python-packages.nix | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index d164b80279bb..bcc1bcd7d6b6 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -87,12 +87,11 @@ let in fetcher (builtins.removeAttrs attrs ["format"]) ); # Check whether a derivation provides a Python module. - hasPythonModule = drv: (hasAttr "pythonModule" drv) && ( (getAttr "pythonModule" drv) == python); + hasPythonModule = drv: drv?pythonModule && drv.pythonModule == python; # Get list of required Python modules given a list of derivations. requiredPythonModules = drvs: let - removeNull = list: filter (x: !isNull x) list; - modules = filter hasPythonModule (removeNull drvs); + modules = filter hasPythonModule drvs; in unique ([python] ++ modules ++ concatLists (catAttrs "requiredPythonModules" modules)); # Create a PYTHONPATH from a list of derivations. This function recurses into the items to find derivations From 4e4520a0f33fba9f2109f2991d0ed4a3bd328746 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 10 Dec 2017 17:34:53 -0500 Subject: [PATCH 07/40] gcc: Don't choke if there is no lib output --- pkgs/development/compilers/gcc/builder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/development/compilers/gcc/builder.sh b/pkgs/development/compilers/gcc/builder.sh index d21755d7b1dc..0765daee4534 100644 --- a/pkgs/development/compilers/gcc/builder.sh +++ b/pkgs/development/compilers/gcc/builder.sh @@ -12,7 +12,7 @@ mkdir "$NIX_FIXINC_DUMMY" if test "$staticCompiler" = "1"; then EXTRA_LDFLAGS="-static" else - EXTRA_LDFLAGS="-Wl,-rpath,$lib/lib" + EXTRA_LDFLAGS="-Wl,-rpath,${!outputLib}/lib" fi From 62cd4f13898bd2113fa1ff876d9c753e27f4a70a Mon Sep 17 00:00:00 2001 From: Will Dietz Date: Mon, 11 Dec 2017 12:13:50 -0600 Subject: [PATCH 08/40] clang_multi: fix incorrect leftover use of "callPackages" Addresses problem identified by @orivej: https://github.com/NixOS/nixpkgs/pull/32215#issuecomment-350600045 --- pkgs/top-level/all-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 8840d70bc131..31c627832b1d 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5597,7 +5597,7 @@ with pkgs; wrapClangMulti = clang: if system == "x86_64-linux" then - callPackages ../development/compilers/llvm/multi.nix { + callPackage ../development/compilers/llvm/multi.nix { inherit clang; gcc32 = pkgsi686Linux.gcc; gcc64 = pkgs.gcc; From 45d4b27d025ec71adc1218bcb2c02e50bcc08492 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Mon, 11 Dec 2017 19:10:10 -0500 Subject: [PATCH 09/40] cc-wrapper: GNAT wrapper stop caring about `-m32` It need not concern itself with 32-bit dynamic linking; ld-wrapper handles that now. --- pkgs/build-support/cc-wrapper/gnat-wrapper.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/gnat-wrapper.sh b/pkgs/build-support/cc-wrapper/gnat-wrapper.sh index 7a0eb28be636..0ac8f313ea18 100644 --- a/pkgs/build-support/cc-wrapper/gnat-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/gnat-wrapper.sh @@ -36,10 +36,6 @@ for i in "$@"; do dontLink=1 elif [ "${i:0:1}" != - ]; then nonFlagArgs=1 - elif [ "$i" = -m32 ]; then - if [ -e @out@/nix-support/dynamic-linker-m32 ]; then - NIX_@infixSalt@_LDFLAGS+=" -dynamic-linker $(< @out@/nix-support/dynamic-linker-m32)" - fi fi done From 19dbfb66c0d66692bbd121937f42e28842578e20 Mon Sep 17 00:00:00 2001 From: Tristan Carel Date: Thu, 7 Dec 2017 15:32:07 +0100 Subject: [PATCH 10/40] boost: build Python numpy extension by default In order to manipulate Python arrays numpy is needed from boost 1.65 on. http://www.boost.org/users/history/version_1_65_1.html --- pkgs/development/libraries/boost/1.65.nix | 2 ++ pkgs/development/libraries/boost/generic.nix | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/boost/1.65.nix b/pkgs/development/libraries/boost/1.65.nix index 9837e1c69193..56b136cd99b4 100644 --- a/pkgs/development/libraries/boost/1.65.nix +++ b/pkgs/development/libraries/boost/1.65.nix @@ -9,4 +9,6 @@ callPackage ./generic.nix (args // rec { sha256 = "9807a5d16566c57fd74fb522764e0b134a8bbe6b6e8967b83afefd30dcd3be81"; }; + enableNumpy = true; + }) diff --git a/pkgs/development/libraries/boost/generic.nix b/pkgs/development/libraries/boost/generic.nix index 3c954bdd1474..b2ec31ace17b 100644 --- a/pkgs/development/libraries/boost/generic.nix +++ b/pkgs/development/libraries/boost/generic.nix @@ -10,7 +10,7 @@ , enablePIC ? false , enableExceptions ? false , enablePython ? hostPlatform == buildPlatform -, enableNumpy ? false, numpy ? null +, enableNumpy ? false , taggedLayout ? ((enableRelease && enableDebug) || (enableSingleThreaded && enableMultiThreaded) || (enableShared && enableStatic)) , patches ? null , mpi ? null @@ -156,7 +156,7 @@ stdenv.mkDerivation { ++ optional (hostPlatform == buildPlatform) icu ++ optional stdenv.isDarwin fixDarwinDylibNames ++ optional enablePython python - ++ optional enableNumpy numpy; + ++ optional enableNumpy python.pkgs.numpy; configureScript = "./bootstrap.sh"; configureFlags = commonConfigureFlags From fc7ed8691505c502b2d05b9b14bb46f239976315 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 31 Aug 2017 14:43:09 -0400 Subject: [PATCH 11/40] cc-wrapper: Pull variable mangler into utils.sh In preparation for splitting out bintools-wrapper --- pkgs/build-support/cc-wrapper/add-flags.sh | 11 +---------- pkgs/build-support/cc-wrapper/cc-wrapper.sh | 4 ++-- pkgs/build-support/cc-wrapper/gnat-wrapper.sh | 4 ++-- pkgs/build-support/cc-wrapper/ld-wrapper.sh | 4 ++-- pkgs/build-support/cc-wrapper/utils.sh | 17 +++++++++++++++++ 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh index 39633fce69a8..5f7c071fb9cf 100644 --- a/pkgs/build-support/cc-wrapper/add-flags.sh +++ b/pkgs/build-support/cc-wrapper/add-flags.sh @@ -36,16 +36,7 @@ fi # We need to mangle names for hygiene, but also take parameters/overrides # from the environment. for var in "${var_templates[@]}"; do - outputVar="${var/+/_@infixSalt@_}" - export ${outputVar}+='' - # For each role we serve, we accumulate the input parameters into our own - # cc-wrapper-derivation-specific environment variables. - for infix in "${role_infixes[@]}"; do - inputVar="${var/+/${infix}}" - if [ -v "$inputVar" ]; then - export ${outputVar}+="${!outputVar:+ }${!inputVar}" - fi - done + mangleVarList "$var" "${role_infixes[@]}" done # `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld. diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh index d2cdbf6ce0cc..82f5c6443d54 100644 --- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -15,12 +15,12 @@ if [[ -n "@coreutils_bin@" && -n "@gnugrep_bin@" ]]; then PATH="@coreutils_bin@/bin:@gnugrep_bin@/bin" fi +source @out@/nix-support/utils.sh + if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then source @out@/nix-support/add-flags.sh fi -source @out@/nix-support/utils.sh - # Parse command line options and set several variables. # For instance, figure out if linker flags should be passed. diff --git a/pkgs/build-support/cc-wrapper/gnat-wrapper.sh b/pkgs/build-support/cc-wrapper/gnat-wrapper.sh index 0ac8f313ea18..a86c9fe4ada4 100644 --- a/pkgs/build-support/cc-wrapper/gnat-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/gnat-wrapper.sh @@ -17,12 +17,12 @@ if [ -n "@coreutils_bin@" ]; then PATH="@coreutils_bin@/bin" fi +source @out@/nix-support/utils.sh + if [ -z "${NIX_@infixSalt@_GNAT_WRAPPER_FLAGS_SET:-}" ]; then source @out@/nix-support/add-flags.sh fi -source @out@/nix-support/utils.sh - # Figure out if linker flags should be passed. GCC prints annoying # warnings when they are not needed. diff --git a/pkgs/build-support/cc-wrapper/ld-wrapper.sh b/pkgs/build-support/cc-wrapper/ld-wrapper.sh index ef618f9a86d4..4452018866db 100644 --- a/pkgs/build-support/cc-wrapper/ld-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/ld-wrapper.sh @@ -14,12 +14,12 @@ if [ -n "@coreutils_bin@" ]; then PATH="@coreutils_bin@/bin" fi +source @out@/nix-support/utils.sh + if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then source @out@/nix-support/add-flags.sh fi -source @out@/nix-support/utils.sh - # Optionally filter out paths not refering to the store. expandResponseParams "$@" diff --git a/pkgs/build-support/cc-wrapper/utils.sh b/pkgs/build-support/cc-wrapper/utils.sh index c43c2e12d74a..41afde5c3c52 100644 --- a/pkgs/build-support/cc-wrapper/utils.sh +++ b/pkgs/build-support/cc-wrapper/utils.sh @@ -1,3 +1,20 @@ +mangleVarList() { + declare var="$1" + shift + declare -a role_infixes=("$@") + + outputVar="${var/+/_@infixSalt@_}" + export ${outputVar}+='' + # For each role we serve, we accumulate the input parameters into our own + # cc-wrapper-derivation-specific environment variables. + for infix in "${role_infixes[@]}"; do + inputVar="${var/+/${infix}}" + if [ -v "$inputVar" ]; then + export ${outputVar}+="${!outputVar:+ }${!inputVar}" + fi + done +} + skip () { if (( "${NIX_DEBUG:-0}" >= 1 )); then echo "skipping impure path $1" >&2 From bdd6c037c0b64a60d3e5a118f9d73e326cbfd5d2 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 31 Aug 2017 15:29:03 -0400 Subject: [PATCH 12/40] cc-wrapper: Use separate mangler for "bool" variables This avoids any `NIX_FOOBAR=1 1` not triggering conditions. --- pkgs/build-support/cc-wrapper/add-flags.sh | 9 ++++++-- pkgs/build-support/cc-wrapper/utils.sh | 25 +++++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh index 5f7c071fb9cf..978041fb4d87 100644 --- a/pkgs/build-support/cc-wrapper/add-flags.sh +++ b/pkgs/build-support/cc-wrapper/add-flags.sh @@ -4,7 +4,7 @@ # that case, it is cheaper/better to not repeat this step and let the forked # wrapped binary just inherit the work of the forker's wrapper script. -var_templates=( +var_templates_list=( NIX+CFLAGS_COMPILE NIX+CFLAGS_LINK NIX+CXXSTDLIB_COMPILE @@ -14,7 +14,9 @@ var_templates=( NIX+LDFLAGS NIX+LDFLAGS_BEFORE NIX+LDFLAGS_AFTER +) +var_templates_bool=( NIX+SET_BUILD_ID NIX+DONT_SET_RPATH NIX+ENFORCE_NO_NATIVE @@ -35,9 +37,12 @@ fi # We need to mangle names for hygiene, but also take parameters/overrides # from the environment. -for var in "${var_templates[@]}"; do +for var in "${var_templates_list[@]}"; do mangleVarList "$var" "${role_infixes[@]}" done +for var in "${var_templates_bool[@]}"; do + mangleVarBool "$var" "${role_infixes[@]}" +done # `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld. NIX_@infixSalt@_CFLAGS_COMPILE="-B@out@/bin/ $NIX_@infixSalt@_CFLAGS_COMPILE" diff --git a/pkgs/build-support/cc-wrapper/utils.sh b/pkgs/build-support/cc-wrapper/utils.sh index 41afde5c3c52..4b2b13809181 100644 --- a/pkgs/build-support/cc-wrapper/utils.sh +++ b/pkgs/build-support/cc-wrapper/utils.sh @@ -1,20 +1,35 @@ mangleVarList() { - declare var="$1" + local var="$1" shift - declare -a role_infixes=("$@") + local -a role_infixes=("$@") - outputVar="${var/+/_@infixSalt@_}" - export ${outputVar}+='' + local outputVar="${var/+/_@infixSalt@_}" + declare -gx ${outputVar}+='' # For each role we serve, we accumulate the input parameters into our own # cc-wrapper-derivation-specific environment variables. for infix in "${role_infixes[@]}"; do - inputVar="${var/+/${infix}}" + local inputVar="${var/+/${infix}}" if [ -v "$inputVar" ]; then export ${outputVar}+="${!outputVar:+ }${!inputVar}" fi done } +mangleVarBool() { + local var="$1" + shift + local -a role_infixes=("$@") + + local outputVar="${var/+/_@infixSalt@_}" + declare -gxi ${outputVar}+=0 + for infix in "${role_infixes[@]}"; do + local inputVar="${var/+/${infix}}" + if [ -v "$inputVar" ]; then + let "${outputVar} |= ${!inputVar}" + fi + done +} + skip () { if (( "${NIX_DEBUG:-0}" >= 1 )); then echo "skipping impure path $1" >&2 From 4f869bccc14fb2fa19df130e76c022765ecda924 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 22 Nov 2017 16:29:57 -0500 Subject: [PATCH 13/40] cc-wrapper: Don't treat "-" alone as a flag It means stdin, and is morally equivalent to passing a file. e.g. $ echo 'int main(void) { return 0; }' | gcc -x c - will compile and link a binary. --- pkgs/build-support/cc-wrapper/cc-wrapper.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh index 82f5c6443d54..df1afef33745 100644 --- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -59,7 +59,8 @@ while (( "$n" < "$nParams" )); do cppInclude=0 elif [ "$p" = -nostdinc++ ]; then cppInclude=0 - elif [ "${p:0:1}" != - ]; then + elif [[ "$p" != -?* ]]; then + # A dash alone signifies standard input; it is not a flag nonFlagArgs=1 fi n+=1 From 8e557ed2c58e6ce48a8d05dbc57ef84e98b4cecd Mon Sep 17 00:00:00 2001 From: John Ericson Date: Mon, 28 Aug 2017 14:56:08 -0400 Subject: [PATCH 14/40] bintools-wrapper: Init Factor a bintools (i.e. binutils / cctools) wrapper out of cc-wrapper. While only LD is wrapped, the setup hook defines environment variables on behalf of other utilites. --- .../bintools-wrapper/add-flags.sh | 40 +++ .../bintools-wrapper/add-hardening.sh | 53 ++++ .../bintools-wrapper/default.nix | 285 ++++++++++++++++++ .../ld-solaris-wrapper.sh | 0 .../ld-wrapper.sh | 2 +- .../macos-sierra-reexport-hack.bash | 4 +- .../bintools-wrapper/setup-hook.sh | 67 ++++ pkgs/build-support/cc-wrapper/add-flags.sh | 15 - .../build-support/cc-wrapper/add-hardening.sh | 10 - pkgs/build-support/cc-wrapper/cc-wrapper.sh | 6 + pkgs/build-support/cc-wrapper/default.nix | 161 +++------- pkgs/build-support/cc-wrapper/setup-hook.sh | 27 +- pkgs/top-level/all-packages.nix | 1 + 13 files changed, 506 insertions(+), 165 deletions(-) create mode 100644 pkgs/build-support/bintools-wrapper/add-flags.sh create mode 100644 pkgs/build-support/bintools-wrapper/add-hardening.sh create mode 100644 pkgs/build-support/bintools-wrapper/default.nix rename pkgs/build-support/{cc-wrapper => bintools-wrapper}/ld-solaris-wrapper.sh (100%) mode change 100755 => 100644 rename pkgs/build-support/{cc-wrapper => bintools-wrapper}/ld-wrapper.sh (98%) rename pkgs/build-support/{cc-wrapper => bintools-wrapper}/macos-sierra-reexport-hack.bash (95%) create mode 100644 pkgs/build-support/bintools-wrapper/setup-hook.sh diff --git a/pkgs/build-support/bintools-wrapper/add-flags.sh b/pkgs/build-support/bintools-wrapper/add-flags.sh new file mode 100644 index 000000000000..7d118d20fc68 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/add-flags.sh @@ -0,0 +1,40 @@ +# See cc-wrapper for comments. +var_templates_list=( + NIX+IGNORE_LD_THROUGH_GCC + NIX+LDFLAGS + NIX+LDFLAGS_BEFORE + NIX+LDFLAGS_AFTER + NIX+LDFLAGS_HARDEN +) +var_templates_bool=( + NIX+SET_BUILD_ID + NIX+DONT_SET_RPATH +) + +declare -a role_infixes=() +if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD:-}" ]; then + role_infixes+=(_BUILD_) +fi +if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST:-}" ]; then + role_infixes+=(_) +fi +if [ "${NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_TARGET:-}" ]; then + role_infixes+=(_TARGET_) +fi + +for var in "${var_templates_list[@]}"; do + mangleVarList "$var" "${role_infixes[@]}" +done +for var in "${var_templates_bool[@]}"; do + mangleVarBool "$var" "${role_infixes[@]}" +done + +if [ -e @out@/nix-support/libc-ldflags ]; then + NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/libc-ldflags)" +fi + +if [ -e @out@/nix-support/libc-ldflags-before ]; then + NIX_@infixSalt@_LDFLAGS_BEFORE="$(< @out@/nix-support/libc-ldflags-before) $NIX_@infixSalt@_LDFLAGS_BEFORE" +fi + +export NIX_BINTOOLS_WRAPPER_@infixSalt@_FLAGS_SET=1 diff --git a/pkgs/build-support/bintools-wrapper/add-hardening.sh b/pkgs/build-support/bintools-wrapper/add-hardening.sh new file mode 100644 index 000000000000..5282d17fce27 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/add-hardening.sh @@ -0,0 +1,53 @@ +hardeningFlags=(relro bindnow) +# Intentionally word-split in case 'hardeningEnable' is defined in +# Nix. Also, our bootstrap tools version of bash is old enough that +# undefined arrays trip `set -u`. +if [[ -v hardeningEnable[@] ]]; then + hardeningFlags+=(${hardeningEnable[@]}) +fi +hardeningLDFlags=() + +declare -A hardeningDisableMap + +# Intentionally word-split in case 'hardeningDisable' is defined in Nix. +for flag in ${hardeningDisable[@]:-IGNORED_KEY} @hardening_unsupported_flags@ +do + hardeningDisableMap[$flag]=1 +done + +if (( "${NIX_DEBUG:-0}" >= 1 )); then + printf 'HARDENING: disabled flags:' >&2 + (( "${#hardeningDisableMap[@]}" )) && printf ' %q' "${!hardeningDisableMap[@]}" >&2 + echo >&2 +fi + +if [[ -z "${hardeningDisableMap[all]:-}" ]]; then + if (( "${NIX_DEBUG:-0}" >= 1 )); then + echo 'HARDENING: Is active (not completely disabled with "all" flag)' >&2; + fi + for flag in "${hardeningFlags[@]}" + do + if [[ -z "${hardeningDisableMap[$flag]:-}" ]]; then + case $flag in + pie) + if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi + hardeningLDFlags+=('-pie') + fi + ;; + relro) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi + hardeningLDFlags+=('-z' 'relro') + ;; + bindnow) + if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi + hardeningLDFlags+=('-z' 'now') + ;; + *) + # Ignore unsupported. Checked in Nix that at least *some* + # tool supports each flag. + ;; + esac + fi + done +fi diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix new file mode 100644 index 000000000000..a9155c2c6eba --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -0,0 +1,285 @@ +# The Nixpkgs CC is not directly usable, since it doesn't know where +# the C library and standard header files are. Therefore the compiler +# produced by that package cannot be installed directly in a user +# environment and used from the command line. So we use a wrapper +# script that sets up the right environment variables so that the +# compiler and the linker just "work". + +{ name ? "", stdenvNoCC, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" +, bintools ? null, libc ? null +, coreutils ? null, shell ? stdenvNoCC.shell, gnugrep ? null +, extraPackages ? [], extraBuildCommands ? "" +, buildPackages ? {} +, useMacosReexportHack ? false +}: + +with stdenvNoCC.lib; + +assert nativeTools -> nativePrefix != ""; +assert !nativeTools -> + bintools != null && coreutils != null && gnugrep != null; +assert !(nativeLibc && noLibc); +assert (noLibc || nativeLibc) == (libc == null); + +let + stdenv = stdenvNoCC; + inherit (stdenv) hostPlatform targetPlatform; + + # Prefix for binaries. Customarily ends with a dash separator. + # + # TODO(@Ericson2314) Make unconditional, or optional but always true by + # default. + targetPrefix = stdenv.lib.optionalString (targetPlatform != hostPlatform) + (targetPlatform.config + "-"); + + bintoolsVersion = (builtins.parseDrvName bintools.name).version; + bintoolsName = (builtins.parseDrvName bintools.name).name; + + libc_bin = if libc == null then null else getBin libc; + libc_dev = if libc == null then null else getDev libc; + libc_lib = if libc == null then null else getLib libc; + bintools_bin = if nativeTools then "" else getBin bintools; + # The wrapper scripts use 'cat' and 'grep', so we may need coreutils. + coreutils_bin = if nativeTools then "" else getBin coreutils; + + dashlessTarget = stdenv.lib.replaceStrings ["-"] ["_"] targetPlatform.config; + + # See description in cc-wrapper. + infixSalt = dashlessTarget; + + # The dynamic linker has different names on different platforms. This is a + # shell glob that ought to match it. + dynamicLinker = + /**/ if libc == null then null + else if targetPlatform.system == "i686-linux" then "${libc_lib}/lib/ld-linux.so.2" + else if targetPlatform.system == "x86_64-linux" then "${libc_lib}/lib/ld-linux-x86-64.so.2" + # ARM with a wildcard, which can be "" or "-armhf". + else if (with targetPlatform; isArm && isLinux) then "${libc_lib}/lib/ld-linux*.so.3" + else if targetPlatform.system == "aarch64-linux" then "${libc_lib}/lib/ld-linux-aarch64.so.1" + else if targetPlatform.system == "powerpc-linux" then "${libc_lib}/lib/ld.so.1" + else if targetPlatform.system == "mips64el-linux" then "${libc_lib}/lib/ld.so.1" + else if targetPlatform.isDarwin then "/usr/lib/dyld" + else if stdenv.lib.hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1" + else null; + + expand-response-params = + if buildPackages.stdenv.cc or null != null && buildPackages.stdenv.cc != "/dev/null" + then import ../expand-response-params { inherit (buildPackages) stdenv; } + else ""; + +in + +stdenv.mkDerivation { + name = targetPrefix + + (if name != "" then name else "${bintoolsName}-wrapper") + + (stdenv.lib.optionalString (bintools != null && bintoolsVersion != "") "-${bintoolsVersion}"); + + preferLocalBuild = true; + + inherit bintools_bin libc_bin libc_dev libc_lib coreutils_bin; + shell = getBin shell + shell.shellPath or ""; + gnugrep_bin = if nativeTools then "" else gnugrep; + + inherit targetPrefix infixSalt; + + outputs = [ "out" "man" ]; + + passthru = { + inherit bintools libc nativeTools nativeLibc nativePrefix; + + emacsBufferSetup = pkgs: '' + ; We should handle propagation here too + (mapc + (lambda (arg) + (when (file-directory-p (concat arg "/lib")) + (setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib"))) + (when (file-directory-p (concat arg "/lib64")) + (setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib64")))) + '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)})) + ''; + }; + + dontBuild = true; + dontConfigure = true; + + unpackPhase = '' + src=$PWD + ''; + + installPhase = + '' + set -u + + mkdir -p $out/bin $out/nix-support $man/nix-support + + wrap() { + local dst="$1" + local wrapper="$2" + export prog="$3" + set +u + substituteAll "$wrapper" "$out/bin/$dst" + set -u + chmod +x "$out/bin/$dst" + } + '' + + + (if nativeTools then '' + echo ${nativePrefix} > $out/nix-support/orig-bintools + + ldPath="${nativePrefix}/bin" + '' else '' + echo $bintools_bin > $out/nix-support/orig-bintools + + ldPath="${bintools_bin}/bin" + '' + + + optionalString (targetPlatform.isSunOS && nativePrefix != "") '' + # Solaris needs an additional ld wrapper. + ldPath="${nativePrefix}/bin" + exec="$ldPath/${targetPrefix}ld" + wrap ld-solaris ${./ld-solaris-wrapper.sh} + '') + + + '' + # Create a symlink to as (the assembler). + if [ -e $ldPath/${targetPrefix}as ]; then + ln -s $ldPath/${targetPrefix}as $out/bin/${targetPrefix}as + fi + + '' + (if !useMacosReexportHack then '' + wrap ${targetPrefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${targetPrefix}ld} + '' else '' + ldInner="${targetPrefix}ld-reexport-delegate" + wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${targetPrefix}ld} + wrap "${targetPrefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner" + unset ldInner + '') + '' + + if [ -e ${bintools_bin}/bin/${targetPrefix}ld.gold ]; then + wrap ${targetPrefix}ld.gold ${./ld-wrapper.sh} ${bintools_bin}/bin/${targetPrefix}ld.gold + fi + + if [ -e ${bintools_bin}/bin/ld.bfd ]; then + wrap ${targetPrefix}ld.bfd ${./ld-wrapper.sh} ${bintools_bin}/bin/${targetPrefix}ld.bfd + fi + + set +u + ''; + + propagatedBuildInputs = extraPackages; + + setupHook = ./setup-hook.sh; + + postFixup = + '' + set -u + '' + + + optionalString (libc != null) ('' + ## + ## General libc support + ## + + echo "-L${libc_lib}/lib" > $out/nix-support/libc-ldflags + + echo "${libc_lib}" > $out/nix-support/orig-libc + echo "${libc_dev}" > $out/nix-support/orig-libc-dev + + ## + ## Dynamic linker support + ## + + if [[ -z ''${dynamicLinker+x} ]]; then + echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead." >&2 + local dynamicLinker="${libc_lib}/lib/ld*.so.?" + fi + + # Expand globs to fill array of options + dynamicLinker=($dynamicLinker) + + case ''${#dynamicLinker[@]} in + 0) echo "No dynamic linker found for platform '${targetPlatform.config}'." >&2;; + 1) echo "Using dynamic linker: '$dynamicLinker'" >&2;; + *) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;; + esac + + if [ -n "''${dynamicLinker:-}" ]; then + echo $dynamicLinker > $out/nix-support/dynamic-linker + + '' + (if targetPlatform.isDarwin then '' + printf "export LD_DYLD_PATH=%q\n" "$dynamicLinker" >> $out/nix-support/setup-hook + '' else '' + if [ -e ${libc_lib}/lib/32/ld-linux.so.2 ]; then + echo ${libc_lib}/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32 + fi + + local ldflagsBefore=(-dynamic-linker "$dynamicLinker") + '') + '' + fi + + # The dynamic linker is passed in `ldflagsBefore' to allow + # explicit overrides of the dynamic linker by callers to ld + # (the *last* value counts, so ours should come first). + printWords "''${ldflagsBefore[@]}" > $out/nix-support/libc-ldflags-before + '') + + + optionalString (!nativeTools) '' + + ## + ## User env support + ## + + # Propagate the underling unwrapped bintools so that if you + # install the wrapper, you get tools like objdump, the manpages, + # etc. as well (same for any binaries of libc). + printWords ${bintools_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages + '' + + + '' + + ## + ## Hardening support + ## + + # some linkers on some platforms don't support specific -z flags + export hardening_unsupported_flags="" + if [[ "$($ldPath/${targetPrefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then + hardening_unsupported_flags+=" bindnow" + fi + if [[ "$($ldPath/${targetPrefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then + hardening_unsupported_flags+=" relro" + fi + '' + + + optionalString hostPlatform.isCygwin '' + hardening_unsupported_flags+=" pic" + '' + + + '' + set +u + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh + substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh + substituteAll ${../cc-wrapper/utils.sh} $out/nix-support/utils.sh + + ## + ## Extra custom steps + ## + + '' + + extraBuildCommands; + + inherit dynamicLinker expand-response-params; + + # for substitution in utils.sh + expandResponseParams = "${expand-response-params}/bin/expand-response-params"; + + meta = + let bintools_ = if bintools != null then bintools else {}; in + (if bintools_ ? meta then removeAttrs bintools.meta ["priority"] else {}) // + { description = + stdenv.lib.attrByPath ["meta" "description"] "System binary utilities" bintools_ + + " (wrapper script)"; + } // optionalAttrs useMacosReexportHack { + platforms = stdenv.lib.platforms.darwin; + }; +} diff --git a/pkgs/build-support/cc-wrapper/ld-solaris-wrapper.sh b/pkgs/build-support/bintools-wrapper/ld-solaris-wrapper.sh old mode 100755 new mode 100644 similarity index 100% rename from pkgs/build-support/cc-wrapper/ld-solaris-wrapper.sh rename to pkgs/build-support/bintools-wrapper/ld-solaris-wrapper.sh diff --git a/pkgs/build-support/cc-wrapper/ld-wrapper.sh b/pkgs/build-support/bintools-wrapper/ld-wrapper.sh similarity index 98% rename from pkgs/build-support/cc-wrapper/ld-wrapper.sh rename to pkgs/build-support/bintools-wrapper/ld-wrapper.sh index 4452018866db..136621d27af5 100644 --- a/pkgs/build-support/cc-wrapper/ld-wrapper.sh +++ b/pkgs/build-support/bintools-wrapper/ld-wrapper.sh @@ -16,7 +16,7 @@ fi source @out@/nix-support/utils.sh -if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then +if [ -z "${NIX_BINTOOLS_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then source @out@/nix-support/add-flags.sh fi diff --git a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash b/pkgs/build-support/bintools-wrapper/macos-sierra-reexport-hack.bash similarity index 95% rename from pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash rename to pkgs/build-support/bintools-wrapper/macos-sierra-reexport-hack.bash index 205035453332..a0c4e9edfcdb 100644 --- a/pkgs/build-support/cc-wrapper/macos-sierra-reexport-hack.bash +++ b/pkgs/build-support/bintools-wrapper/macos-sierra-reexport-hack.bash @@ -81,8 +81,10 @@ else symbolBloatObject=$outputNameLibless-symbol-hack.o if [[ ! -e $symbolBloatObject ]]; then + # `-Q` means use GNU Assembler rather than Clang, avoiding an awkward + # dependency cycle. printf '.private_extern _______child_hack_foo\nchild_hack_foo:\n' \ - | @targetPrefix@as -- -o $symbolBloatObject + | @targetPrefix@as -Q -- -o $symbolBloatObject fi # first half of libs diff --git a/pkgs/build-support/bintools-wrapper/setup-hook.sh b/pkgs/build-support/bintools-wrapper/setup-hook.sh new file mode 100644 index 000000000000..43f79ec59200 --- /dev/null +++ b/pkgs/build-support/bintools-wrapper/setup-hook.sh @@ -0,0 +1,67 @@ +# Binutils Wrapper hygiene +# +# See comments in cc-wrapper's setup hook. This works exactly the same way. + +bintoolsWrapper_addLDVars () { + case $depOffset in + -1) local role='BUILD_' ;; + 0) local role='' ;; + 1) local role='TARGET_' ;; + *) echo "bintools-wrapper: Error: Cannot be used with $depOffset-offset deps, " >2; + return 1 ;; + esac + + if [[ -d "$1/lib64" && ! -L "$1/lib64" ]]; then + export NIX_${role}LDFLAGS+=" -L$1/lib64" + fi + + if [[ -d "$1/lib" ]]; then + export NIX_${role}LDFLAGS+=" -L$1/lib" + fi +} + +if [ -n "${crossConfig:-}" ]; then + export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_BUILD=1 + role_pre='BUILD_' + role_post='_FOR_BUILD' +else + export NIX_BINTOOLS_WRAPPER_@infixSalt@_TARGET_HOST=1 + role_pre="" + role_post='' +fi + +envHooks+=(bintoolsWrapper_addLDVars) + +# shellcheck disable=SC2157 +if [ -n "@bintools_bin@" ]; then + addToSearchPath _PATH @bintools_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@libc_bin@" ]; then + addToSearchPath _PATH @libc_bin@/bin +fi + +# shellcheck disable=SC2157 +if [ -n "@coreutils_bin@" ]; then + addToSearchPath _PATH @coreutils_bin@/bin +fi + +# Export tool environment variables so various build systems use the right ones. + +export NIX_${role_pre}BINTOOLS=@out@ + +for cmd in \ + ar as ld nm objcopy objdump readelf ranlib strip strings size windres +do + if + PATH=$_PATH type -p "@targetPrefix@${cmd}" > /dev/null + then + upper_case="$(echo "$cmd" | tr "[:lower:]" "[:upper:]")" + export "${role_pre}${upper_case}=@targetPrefix@${cmd}"; + export "${upper_case}${role_post}=@targetPrefix@${cmd}"; + fi +done + +# No local scope in sourced file +unset -v role_pre role_post cmd upper_case diff --git a/pkgs/build-support/cc-wrapper/add-flags.sh b/pkgs/build-support/cc-wrapper/add-flags.sh index 978041fb4d87..d8b42244607a 100644 --- a/pkgs/build-support/cc-wrapper/add-flags.sh +++ b/pkgs/build-support/cc-wrapper/add-flags.sh @@ -10,15 +10,8 @@ var_templates_list=( NIX+CXXSTDLIB_COMPILE NIX+CXXSTDLIB_LINK NIX+GNATFLAGS_COMPILE - NIX+IGNORE_LD_THROUGH_GCC - NIX+LDFLAGS - NIX+LDFLAGS_BEFORE - NIX+LDFLAGS_AFTER ) - var_templates_bool=( - NIX+SET_BUILD_ID - NIX+DONT_SET_RPATH NIX+ENFORCE_NO_NATIVE ) @@ -62,17 +55,9 @@ if [ -e @out@/nix-support/gnat-cflags ]; then NIX_@infixSalt@_GNATFLAGS_COMPILE="$(< @out@/nix-support/gnat-cflags) $NIX_@infixSalt@_GNATFLAGS_COMPILE" fi -if [ -e @out@/nix-support/libc-ldflags ]; then - NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/libc-ldflags)" -fi - if [ -e @out@/nix-support/cc-ldflags ]; then NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/cc-ldflags)" fi -if [ -e @out@/nix-support/libc-ldflags-before ]; then - NIX_@infixSalt@_LDFLAGS_BEFORE="$(< @out@/nix-support/libc-ldflags-before) $NIX_@infixSalt@_LDFLAGS_BEFORE" -fi - # That way forked processes will not extend these environment variables again. export NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET=1 diff --git a/pkgs/build-support/cc-wrapper/add-hardening.sh b/pkgs/build-support/cc-wrapper/add-hardening.sh index b0e39e455ffc..a35ff3cb4260 100644 --- a/pkgs/build-support/cc-wrapper/add-hardening.sh +++ b/pkgs/build-support/cc-wrapper/add-hardening.sh @@ -6,7 +6,6 @@ if [[ -v hardeningEnable[@] ]]; then hardeningFlags+=(${hardeningEnable[@]}) fi hardeningCFlags=() -hardeningLDFlags=() declare -A hardeningDisableMap @@ -44,7 +43,6 @@ if [[ -z "${hardeningDisableMap[all]:-}" ]]; then if [[ ! ("$*" =~ " -shared " || "$*" =~ " -static ") ]]; then if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling LDFlags -pie >&2; fi hardeningCFlags+=('-pie') - hardeningLDFlags+=('-pie') fi ;; pic) @@ -59,14 +57,6 @@ if [[ -z "${hardeningDisableMap[all]:-}" ]]; then if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling format >&2; fi hardeningCFlags+=('-Wformat' '-Wformat-security' '-Werror=format-security') ;; - relro) - if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling relro >&2; fi - hardeningLDFlags+=('-z' 'relro') - ;; - bindnow) - if (( "${NIX_DEBUG:-0}" >= 1 )); then echo HARDENING: enabling bindnow >&2; fi - hardeningLDFlags+=('-z' 'now') - ;; *) # Ignore unsupported. Checked in Nix that at least *some* # tool supports each flag. diff --git a/pkgs/build-support/cc-wrapper/cc-wrapper.sh b/pkgs/build-support/cc-wrapper/cc-wrapper.sh index df1afef33745..c2e6c1406358 100644 --- a/pkgs/build-support/cc-wrapper/cc-wrapper.sh +++ b/pkgs/build-support/cc-wrapper/cc-wrapper.sh @@ -17,6 +17,12 @@ fi source @out@/nix-support/utils.sh +# Flirting with a layer violation here. +if [ -z "${NIX_BINTOOLS_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then + source @bintools@/nix-support/add-flags.sh +fi + +# Put this one second so libc ldflags take priority. if [ -z "${NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET:-}" ]; then source @out@/nix-support/add-flags.sh fi diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index b79697b33f0c..f554a2425dd2 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -28,6 +28,17 @@ let stdenv = stdenvNoCC; inherit (stdenv) hostPlatform targetPlatform; + bintools = import ../bintools-wrapper { + bintools = binutils; + inherit # name + stdenvNoCC nativeTools noLibc nativeLibc nativePrefix + libc + coreutils shell gnugrep + extraPackages extraBuildCommands + buildPackages + useMacosReexportHack; + }; + # Prefix for binaries. Customarily ends with a dash separator. # # TODO(@Ericson2314) Make unconditional, or optional but always true by @@ -42,7 +53,6 @@ let libc_dev = if libc == null then null else getDev libc; libc_lib = if libc == null then null else getLib libc; cc_solib = getLib cc; - binutils_bin = if nativeTools then "" else getBin binutils; # The wrapper scripts use 'cat' and 'grep', so we may need coreutils. coreutils_bin = if nativeTools then "" else getBin coreutils; @@ -58,21 +68,6 @@ let # unstable implementation detail, however. infixSalt = dashlessTarget; - # The dynamic linker has different names on different platforms. This is a - # shell glob that ought to match it. - dynamicLinker = - /**/ if libc == null then null - else if targetPlatform.system == "i686-linux" then "${libc_lib}/lib/ld-linux.so.2" - else if targetPlatform.system == "x86_64-linux" then "${libc_lib}/lib/ld-linux-x86-64.so.2" - # ARM with a wildcard, which can be "" or "-armhf". - else if (with targetPlatform; isArm && isLinux) then "${libc_lib}/lib/ld-linux*.so.3" - else if targetPlatform.system == "aarch64-linux" then "${libc_lib}/lib/ld-linux-aarch64.so.1" - else if targetPlatform.system == "powerpc-linux" then "${libc_lib}/lib/ld.so.1" - else if targetPlatform.system == "mips64el-linux" then "${libc_lib}/lib/ld.so.1" - else if targetPlatform.isDarwin then "/usr/lib/dyld" - else if stdenv.lib.hasSuffix "pc-gnu" targetPlatform.config then "ld.so.1" - else null; - expand-response-params = if buildPackages.stdenv.cc or null != null && buildPackages.stdenv.cc != "/dev/null" then import ../expand-response-params { inherit (buildPackages) stdenv; } @@ -80,6 +75,14 @@ let in +# Ensure bintools matches +assert libc_bin == bintools.libc_bin; +assert libc_dev == bintools.libc_dev; +assert libc_lib == bintools.libc_lib; +assert nativeTools == bintools.nativeTools; +assert nativeLibc == bintools.nativeLibc; +assert nativePrefix == bintools.nativePrefix; + stdenv.mkDerivation { name = targetPrefix + (if name != "" then name else "${ccName}-wrapper") @@ -87,8 +90,8 @@ stdenv.mkDerivation { preferLocalBuild = true; - inherit cc libc_bin libc_dev libc_lib binutils_bin coreutils_bin; - shell = getBin shell + shell.shellPath or ""; + inherit cc libc_bin libc_dev libc_lib bintools coreutils_bin; + shell = getBin shell + stdenv.lib.optionalString (stdenv ? shellPath) stdenv.shellPath; gnugrep_bin = if nativeTools then "" else gnugrep; inherit targetPrefix infixSalt; @@ -98,20 +101,18 @@ stdenv.mkDerivation { passthru = { # "cc" is the generic name for a C compiler, but there is no one for package # providing the linker and related tools. The two we use now are GNU - # Binutils, and Apple's "cctools"; "binutils" as an attempt to find an + # Binutils, and Apple's "cctools"; "bintools" as an attempt to find an # unused middle-ground name that evokes both. - bintools = binutils_bin; + inherit bintools; inherit libc nativeTools nativeLibc nativePrefix isGNU isClang default_cxx_stdlib_compile; emacsBufferSetup = pkgs: '' ; We should handle propagation here too - (mapc (lambda (arg) - (when (file-directory-p (concat arg "/include")) - (setenv "NIX_${infixSalt}_CFLAGS_COMPILE" (concat (getenv "NIX_${infixSalt}_CFLAGS_COMPILE") " -isystem " arg "/include"))) - (when (file-directory-p (concat arg "/lib")) - (setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib"))) - (when (file-directory-p (concat arg "/lib64")) - (setenv "NIX_${infixSalt}_LDFLAGS" (concat (getenv "NIX_${infixSalt}_LDFLAGS") " -L" arg "/lib64")))) '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)})) + (mapc + (lambda (arg) + (when (file-directory-p (concat arg "/include")) + (setenv "NIX_${infixSalt}_CFLAGS_COMPILE" (concat (getenv "NIX_${infixSalt}_CFLAGS_COMPILE") " -isystem " arg "/include")))) + '(${concatStringsSep " " (map (pkg: "\"${pkg}\"") pkgs)})) ''; }; @@ -141,45 +142,18 @@ stdenv.mkDerivation { echo ${if targetPlatform.isDarwin then cc else nativePrefix} > $out/nix-support/orig-cc ccPath="${if targetPlatform.isDarwin then cc else nativePrefix}/bin" - ldPath="${nativePrefix}/bin" '' else '' echo $cc > $out/nix-support/orig-cc ccPath="${cc}/bin" - ldPath="${binutils_bin}/bin" - '' - - + optionalString (targetPlatform.isSunOS && nativePrefix != "") '' - # Solaris needs an additional ld wrapper. - ldPath="${nativePrefix}/bin" - exec="$ldPath/${targetPrefix}ld" - wrap ld-solaris ${./ld-solaris-wrapper.sh} '') + '' - # Create a symlink to as (the assembler). This is useful when a - # cc-wrapper is installed in a user environment, as it ensures that - # the right assembler is called. - if [ -e $ldPath/${targetPrefix}as ]; then - ln -s $ldPath/${targetPrefix}as $out/bin/${targetPrefix}as - fi - - '' + (if !useMacosReexportHack then '' - wrap ${targetPrefix}ld ${./ld-wrapper.sh} ''${ld:-$ldPath/${targetPrefix}ld} - '' else '' - ldInner="${targetPrefix}ld-reexport-delegate" - wrap "$ldInner" ${./macos-sierra-reexport-hack.bash} ''${ld:-$ldPath/${targetPrefix}ld} - wrap "${targetPrefix}ld" ${./ld-wrapper.sh} "$out/bin/$ldInner" - unset ldInner - '') + '' - - if [ -e ${binutils_bin}/bin/${targetPrefix}ld.gold ]; then - wrap ${targetPrefix}ld.gold ${./ld-wrapper.sh} ${binutils_bin}/bin/${targetPrefix}ld.gold - fi - - if [ -e ${binutils_bin}/bin/ld.bfd ]; then - wrap ${targetPrefix}ld.bfd ${./ld-wrapper.sh} ${binutils_bin}/bin/${targetPrefix}ld.bfd - fi + # Create symlinks to everything in the bintools wrapper. + for bbin in $bintools/bin/*; do + mkdir -p "$out/bin" + ln -s "$bbin" "$out/bin/$(basename $bbin)" + done # We export environment variables pointing to the wrapped nonstandard # cmds, lest some lousy configure script use those to guess compiler @@ -239,16 +213,28 @@ stdenv.mkDerivation { ln -s $ccPath/${targetPrefix}ghdl $out/bin/${targetPrefix}ghdl ''; - propagatedBuildInputs = extraPackages; + propagatedBuildInputs = [ bintools ] ++ extraPackages; setupHook = ./setup-hook.sh; postFixup = '' set -u + + # Backwards compatability for packages expecting this file, e.g. with + # `$NIX_CC/nix-support/dynamic-linker`. + # + # TODO(@Ericson2314): Remove this after stable release and force + # everyone to refer to bintools-wrapper directly. + if [[ -f "$bintools/nix-support/dynamic-linker" ]]; then + ln -s "$bintools/nix-support/dynamic-linker" "$out/nix-support" + fi + if [[ -f "$bintools/nix-support/dynamic-linker-m32" ]]; then + ln -s "$bintools/nix-support/dynamic-linker-m32" "$out/nix-support" + fi '' - + optionalString (libc != null) ('' + + optionalString (libc != null) '' ## ## General libc support ## @@ -266,48 +252,9 @@ stdenv.mkDerivation { # another -idirafter is necessary to add that directory again. echo "-B${libc_lib}/lib/ -idirafter ${libc_dev}/include -idirafter ${cc}/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags - echo "-L${libc_lib}/lib" > $out/nix-support/libc-ldflags - echo "${libc_lib}" > $out/nix-support/orig-libc echo "${libc_dev}" > $out/nix-support/orig-libc-dev - - ## - ## Dynamic linker support - ## - - if [[ -z ''${dynamicLinker+x} ]]; then - echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead." >&2 - local dynamicLinker="${libc_lib}/lib/ld*.so.?" - fi - - # Expand globs to fill array of options - dynamicLinker=($dynamicLinker) - - case ''${#dynamicLinker[@]} in - 0) echo "No dynamic linker found for platform '${targetPlatform.config}'." >&2;; - 1) echo "Using dynamic linker: '$dynamicLinker'" >&2;; - *) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;; - esac - - if [ -n "''${dynamicLinker:-}" ]; then - echo $dynamicLinker > $out/nix-support/dynamic-linker - - '' + (if targetPlatform.isDarwin then '' - printf "export LD_DYLD_PATH=%q\n" "$dynamicLinker" >> $out/nix-support/setup-hook - '' else '' - if [ -e ${libc_lib}/lib/32/ld-linux.so.2 ]; then - echo ${libc_lib}/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32 - fi - - local ldflagsBefore=(-dynamic-linker "$dynamicLinker") - '') + '' - fi - - # The dynamic linker is passed in `ldflagsBefore' to allow - # explicit overrides of the dynamic linker by callers to gcc/ld - # (the *last* value counts, so ours should come first). - printWords "''${ldflagsBefore[@]}" > $out/nix-support/libc-ldflags-before - '') + '' + optionalString (!nativeTools) '' @@ -348,7 +295,6 @@ stdenv.mkDerivation { # Propagate the wrapped cc so that if you install the wrapper, # you get tools like gcov, the manpages, etc. as well (including # for binutils and Glibc). - printWords ${cc} ${binutils_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages printWords ${cc.man or ""} > $man/nix-support/propagated-user-env-packages '' @@ -358,14 +304,7 @@ stdenv.mkDerivation { ## Hardening support ## - # some linkers on some platforms don't support specific -z flags export hardening_unsupported_flags="" - if [[ "$($ldPath/${targetPrefix}ld -z now 2>&1 || true)" =~ un(recognized|known)\ option ]]; then - hardening_unsupported_flags+=" bindnow" - fi - if [[ "$($ldPath/${targetPrefix}ld -z relro 2>&1 || true)" =~ un(recognized|known)\ option ]]; then - hardening_unsupported_flags+=" relro" - fi '' + optionalString hostPlatform.isCygwin '' @@ -384,7 +323,7 @@ stdenv.mkDerivation { '' + extraBuildCommands; - inherit dynamicLinker expand-response-params; + inherit expand-response-params; # for substitution in utils.sh expandResponseParams = "${expand-response-params}/bin/expand-response-params"; @@ -395,7 +334,5 @@ stdenv.mkDerivation { { description = stdenv.lib.attrByPath ["meta" "description"] "System C compiler" cc_ + " (wrapper script)"; - } // optionalAttrs useMacosReexportHack { - platforms = stdenv.lib.platforms.darwin; }; } diff --git a/pkgs/build-support/cc-wrapper/setup-hook.sh b/pkgs/build-support/cc-wrapper/setup-hook.sh index 7822b7f84d00..a922193ad2e7 100644 --- a/pkgs/build-support/cc-wrapper/setup-hook.sh +++ b/pkgs/build-support/cc-wrapper/setup-hook.sh @@ -74,14 +74,6 @@ ccWrapper_addCVars () { export NIX_${role}CFLAGS_COMPILE+=" ${ccIncludeFlag:--isystem} $1/include" fi - if [[ -d "$1/lib64" && ! -L "$1/lib64" ]]; then - export NIX_${role}LDFLAGS+=" -L$1/lib64" - fi - - if [[ -d "$1/lib" ]]; then - export NIX_${role}LDFLAGS+=" -L$1/lib" - fi - if [[ -d "$1/Library/Frameworks" ]]; then export NIX_${role}CFLAGS_COMPILE+=" -F$1/Library/Frameworks" fi @@ -118,11 +110,6 @@ if [ -n "@cc@" ]; then addToSearchPath _PATH @cc@/bin fi -# shellcheck disable=SC2157 -if [ -n "@binutils_bin@" ]; then - addToSearchPath _PATH @binutils_bin@/bin -fi - # shellcheck disable=SC2157 if [ -n "@libc_bin@" ]; then addToSearchPath _PATH @libc_bin@/bin @@ -142,17 +129,5 @@ export ${role_pre}CXX=@named_cxx@ export CC${role_post}=@named_cc@ export CXX${role_post}=@named_cxx@ -for cmd in \ - ar as ld nm objcopy objdump readelf ranlib strip strings size windres -do - if - PATH=$_PATH type -p "@targetPrefix@${cmd}" > /dev/null - then - upper_case="$(echo "$cmd" | tr "[:lower:]" "[:upper:]")" - export "${role_pre}${upper_case}=@targetPrefix@${cmd}"; - export "${upper_case}${role_post}=@targetPrefix@${cmd}"; - fi -done - # No local scope in sourced file -unset -v role_pre role_post cmd upper_case +unset -v role_pre role_post diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d947009defb1..d66c4dcd76d7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5618,6 +5618,7 @@ with pkgs; crossStageStatic = true; langCC = false; libcCross = libcCross1; + targetPackages.stdenv.cc.bintools = binutils; enableShared = false; }; libc = libcCross1; From 2bba92906231ae021b4778986419320c3792ce48 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sat, 26 Aug 2017 11:43:30 -0400 Subject: [PATCH 15/40] bintools-wrapper: Import separately from cc-wrapper --- pkgs/build-support/cc-wrapper/default.nix | 16 +---- .../compilers/emscripten-fastcomp/default.nix | 4 +- .../compilers/llvm/3.7/default.nix | 4 +- .../compilers/llvm/3.8/default.nix | 4 +- .../compilers/llvm/3.9/default.nix | 4 +- pkgs/development/compilers/llvm/4/default.nix | 4 +- pkgs/development/compilers/llvm/5/default.nix | 4 +- pkgs/development/libraries/libbfd/default.nix | 4 +- .../libraries/libopcodes/default.nix | 4 +- pkgs/os-specific/darwin/binutils/default.nix | 4 +- pkgs/stdenv/darwin/default.nix | 62 ++++++++++++------- pkgs/stdenv/linux/default.nix | 42 ++++++++++--- .../linux/make-bootstrap-tools-cross.nix | 2 +- pkgs/stdenv/linux/make-bootstrap-tools.nix | 2 +- pkgs/top-level/all-packages.nix | 57 ++++++++++++++--- pkgs/top-level/darwin-packages.nix | 10 ++- 16 files changed, 150 insertions(+), 77 deletions(-) diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index f554a2425dd2..ae4bdfd575b2 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -6,18 +6,17 @@ # compiler and the linker just "work". { name ? "", stdenvNoCC, nativeTools, noLibc ? false, nativeLibc, nativePrefix ? "" -, cc ? null, libc ? null, binutils ? null, coreutils ? null, shell ? stdenvNoCC.shell +, cc ? null, libc ? null, bintools, coreutils ? null, shell ? stdenvNoCC.shell , zlib ? null, extraPackages ? [], extraBuildCommands ? "" , isGNU ? false, isClang ? cc.isClang or false, gnugrep ? null , buildPackages ? {} -, useMacosReexportHack ? false }: with stdenvNoCC.lib; assert nativeTools -> nativePrefix != ""; assert !nativeTools -> - cc != null && binutils != null && coreutils != null && gnugrep != null; + cc != null && coreutils != null && gnugrep != null; assert !(nativeLibc && noLibc); assert (noLibc || nativeLibc) == (libc == null); @@ -28,17 +27,6 @@ let stdenv = stdenvNoCC; inherit (stdenv) hostPlatform targetPlatform; - bintools = import ../bintools-wrapper { - bintools = binutils; - inherit # name - stdenvNoCC nativeTools noLibc nativeLibc nativePrefix - libc - coreutils shell gnugrep - extraPackages extraBuildCommands - buildPackages - useMacosReexportHack; - }; - # Prefix for binaries. Customarily ends with a dash separator. # # TODO(@Ericson2314) Make unconditional, or optional but always true by diff --git a/pkgs/development/compilers/emscripten-fastcomp/default.nix b/pkgs/development/compilers/emscripten-fastcomp/default.nix index 5d952073740e..490dace2faaf 100644 --- a/pkgs/development/compilers/emscripten-fastcomp/default.nix +++ b/pkgs/development/compilers/emscripten-fastcomp/default.nix @@ -1,4 +1,4 @@ -{ newScope, stdenv, wrapCC, wrapCCWith, symlinkJoin }: +{ newScope, stdenv, binutils-raw, wrapCCWith, symlinkJoin }: let callPackage = newScope (self // {inherit stdenv;}); @@ -6,6 +6,8 @@ let emscriptenfastcomp-unwrapped = callPackage ./emscripten-fastcomp.nix {}; emscriptenfastcomp-wrapped = wrapCCWith { cc = self.emscriptenfastcomp-unwrapped; + # Never want Apple's cctools for WASM target + bintools = binutils-raw; libc = stdenv.cc.libc; extraBuildCommands = '' # hardening flags break WASM support diff --git a/pkgs/development/compilers/llvm/3.7/default.nix b/pkgs/development/compilers/llvm/3.7/default.nix index 432443e1a89a..35af978216c6 100644 --- a/pkgs/development/compilers/llvm/3.7/default.nix +++ b/pkgs/development/compilers/llvm/3.7/default.nix @@ -30,14 +30,14 @@ let libstdcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ libstdcxxHook ]; }; libcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ self.libcxx self.libcxxabi ]; }; diff --git a/pkgs/development/compilers/llvm/3.8/default.nix b/pkgs/development/compilers/llvm/3.8/default.nix index 453d2c1f04b4..bd79db012a63 100644 --- a/pkgs/development/compilers/llvm/3.8/default.nix +++ b/pkgs/development/compilers/llvm/3.8/default.nix @@ -27,14 +27,14 @@ let libstdcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ libstdcxxHook ]; }; libcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ self.libcxx self.libcxxabi ]; }; diff --git a/pkgs/development/compilers/llvm/3.9/default.nix b/pkgs/development/compilers/llvm/3.9/default.nix index 755b417c78d4..5ce51bc9c122 100644 --- a/pkgs/development/compilers/llvm/3.9/default.nix +++ b/pkgs/development/compilers/llvm/3.9/default.nix @@ -27,14 +27,14 @@ let libstdcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ libstdcxxHook ]; }; libcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ self.libcxx self.libcxxabi ]; }; diff --git a/pkgs/development/compilers/llvm/4/default.nix b/pkgs/development/compilers/llvm/4/default.nix index 25bb008567f7..fa61a6c22e71 100644 --- a/pkgs/development/compilers/llvm/4/default.nix +++ b/pkgs/development/compilers/llvm/4/default.nix @@ -42,14 +42,14 @@ let libstdcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ libstdcxxHook ]; }; libcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ self.libcxx self.libcxxabi ]; }; diff --git a/pkgs/development/compilers/llvm/5/default.nix b/pkgs/development/compilers/llvm/5/default.nix index 1d5cc0e504b7..9891f3090ac1 100644 --- a/pkgs/development/compilers/llvm/5/default.nix +++ b/pkgs/development/compilers/llvm/5/default.nix @@ -42,14 +42,14 @@ let libstdcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ libstdcxxHook ]; }; libcxxClang = ccWrapperFun { cc = self.clang-unwrapped; /* FIXME is this right? */ - inherit (stdenv.cc) libc nativeTools nativeLibc; + inherit (stdenv.cc) bintools libc nativeTools nativeLibc; extraPackages = [ self.libcxx self.libcxxabi ]; }; diff --git a/pkgs/development/libraries/libbfd/default.nix b/pkgs/development/libraries/libbfd/default.nix index 700c5a928e55..5bcf243155b0 100644 --- a/pkgs/development/libraries/libbfd/default.nix +++ b/pkgs/development/libraries/libbfd/default.nix @@ -5,11 +5,11 @@ stdenv.mkDerivation rec { name = "libbfd-${version}"; - inherit (binutils-raw) version src; + inherit (binutils-raw.bintools) version src; outputs = [ "out" "dev" ]; - patches = binutils-raw.patches ++ [ + patches = binutils-raw.bintools.patches ++ [ ../../tools/misc/binutils/build-components-separately.patch ]; diff --git a/pkgs/development/libraries/libopcodes/default.nix b/pkgs/development/libraries/libopcodes/default.nix index f3e12db39819..7ffc40f14946 100644 --- a/pkgs/development/libraries/libopcodes/default.nix +++ b/pkgs/development/libraries/libopcodes/default.nix @@ -5,11 +5,11 @@ stdenv.mkDerivation rec { name = "libopcodes-${version}"; - inherit (binutils-raw) version src; + inherit (binutils-raw.bintools) version src; outputs = [ "out" "dev" ]; - patches = binutils-raw.patches ++ [ + patches = binutils-raw.bintools.patches ++ [ ../../tools/misc/binutils/build-components-separately.patch ]; diff --git a/pkgs/os-specific/darwin/binutils/default.nix b/pkgs/os-specific/darwin/binutils/default.nix index 613606b50358..e05d8cf8c43d 100644 --- a/pkgs/os-specific/darwin/binutils/default.nix +++ b/pkgs/os-specific/darwin/binutils/default.nix @@ -20,7 +20,7 @@ stdenv.mkDerivation { buildCommand = '' mkdir -p $out/bin $out/include - ln -s ${binutils-raw.out}/bin/${targetPrefix}c++filt $out/bin/${targetPrefix}c++filt + ln -s ${binutils-raw.bintools.out}/bin/${targetPrefix}c++filt $out/bin/${targetPrefix}c++filt # We specifically need: # - ld: binutils doesn't provide it on darwin @@ -38,7 +38,7 @@ stdenv.mkDerivation { done # FIXME: this will give us incorrect man pages for bits of cctools - ln -s ${binutils-raw.out}/share $out/share + ln -s ${binutils-raw.bintools.out}/share $out/share ln -s ${cctools}/libexec $out/libexec ''; diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 89c903b04a04..d202186c29b2 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -60,10 +60,40 @@ in rec { extraBuildInputs, allowedRequisites ? null}: let + buildPackages = lib.optionalAttrs (last ? stdenv) { + inherit (last) stdenv; + }; + + coreutils = { name = "coreutils-9.9.9"; outPath = bootstrapTools; }; + gnugrep = { name = "gnugrep-9.9.9"; outPath = bootstrapTools; }; + + bintools = import ../../build-support/bintools-wrapper { + inherit shell; + inherit (last) stdenvNoCC; + + nativeTools = false; + nativeLibc = false; + inherit buildPackages coreutils gnugrep; + libc = last.pkgs.darwin.Libsystem; + bintools = { name = "binutils-9.9.9"; outPath = bootstrapTools; }; + }; + + cc = if isNull last then "/dev/null" else import ../../build-support/cc-wrapper { + inherit shell; + inherit (last) stdenvNoCC; + + nativeTools = false; + nativeLibc = false; + inherit buildPackages coreutils gnugrep bintools; + libc = last.pkgs.darwin.Libsystem; + isClang = true; + cc = { name = "clang-9.9.9"; outPath = bootstrapTools; }; + }; + thisStdenv = import ../generic { inherit config shell extraNativeBuildInputs extraBuildInputs; allowedRequisites = if allowedRequisites == null then null else allowedRequisites ++ [ - thisStdenv.cc.expand-response-params + cc.expand-response-params cc.bintools ]; name = "stdenv-darwin-boot-${toString step}"; @@ -72,24 +102,9 @@ in rec { hostPlatform = localSystem; targetPlatform = localSystem; - cc = if isNull last then "/dev/null" else import ../../build-support/cc-wrapper { - inherit shell; - inherit (last) stdenvNoCC; + inherit cc; - nativeTools = false; - nativeLibc = false; - buildPackages = lib.optionalAttrs (last ? stdenv) { - inherit (last) stdenv; - }; - libc = last.pkgs.darwin.Libsystem; - isClang = true; - cc = { name = "clang-9.9.9"; outPath = bootstrapTools; }; - binutils = { name = "binutils-9.9.9"; outPath = bootstrapTools; }; - coreutils = { name = "coreutils-9.9.9"; outPath = bootstrapTools; }; - gnugrep = { name = "gnugrep-9.9.9"; outPath = bootstrapTools; }; - }; - - preHook = stage0.stdenv.lib.optionalString (shell == "${bootstrapTools}/bin/bash") '' + preHook = lib.optionalString (shell == "${bootstrapTools}/bin/bash") '' # Don't patch #!/interpreter because it leads to retained # dependencies on the bootstrapTools in the final stdenv. dontPatchShebangs=1 @@ -328,9 +343,10 @@ in rec { buildPackages = { inherit (prevStage) stdenv; }; - inherit (pkgs) coreutils binutils gnugrep; - cc = pkgs.llvmPackages.clang-unwrapped; - libc = pkgs.darwin.Libsystem; + inherit (pkgs) coreutils gnugrep; + cc = pkgs.llvmPackages.clang-unwrapped; + bintools = pkgs.darwin.binutils; + libc = pkgs.darwin.Libsystem; }; extraNativeBuildInputs = []; @@ -349,8 +365,8 @@ in rec { xz.out xz.bin libcxx libcxxabi gmp.out gnumake findutils bzip2.out bzip2.bin llvmPackages.llvm llvmPackages.llvm.lib zlib.out zlib.dev libffi.out coreutils ed diffutils gnutar gzip ncurses.out ncurses.dev ncurses.man gnused bash gawk - gnugrep llvmPackages.clang-unwrapped patch pcre.out binutils-raw.out - binutils gettext + gnugrep llvmPackages.clang-unwrapped patch pcre.out gettext + binutils-raw.bintools binutils binutils.bintools cc.expand-response-params ]) ++ (with pkgs.darwin; [ dyld Libsystem CF cctools ICU libiconv locale diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index a114ab609e6c..858323e5cc56 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -80,9 +80,10 @@ let inherit (prevStage) stdenv; }; cc = prevStage.gcc-unwrapped; + bintools = prevStage.binutils; isGNU = true; libc = prevStage.glibc; - inherit (prevStage) binutils coreutils gnugrep; + inherit (prevStage) coreutils gnugrep; name = name; stdenvNoCC = prevStage.ccWrapperStdenv; }; @@ -143,7 +144,15 @@ in ''; }; gcc-unwrapped = bootstrapTools; - binutils = bootstrapTools; + binutils = import ../../build-support/bintools-wrapper { + nativeTools = false; + nativeLibc = false; + buildPackages = { }; + libc = self.glibc; + inherit (self) stdenvNoCC coreutils gnugrep; + bintools = bootstrapTools; + name = "bootstrap-binutils-wrapper"; + }; coreutils = bootstrapTools; gnugrep = bootstrapTools; }; @@ -165,7 +174,7 @@ in # Rebuild binutils to use from stage2 onwards. overrides = self: super: { - binutils = super.binutils.override { gold = false; }; + binutils = super.binutils_nogold; inherit (prevStage) ccWrapperStdenv glibc gcc-unwrapped coreutils gnugrep; @@ -188,9 +197,14 @@ in overrides = self: super: { inherit (prevStage) ccWrapperStdenv - binutils gcc-unwrapped coreutils gnugrep + gcc-unwrapped coreutils gnugrep perl paxctl gnum4 bison; # This also contains the full, dynamically linked, final Glibc. + binutils = prevStage.binutils.override { + # Rewrap the binutils with the new glibc, so both the next + # stage's wrappers use it. + libc = self.glibc; + }; }; }) @@ -235,6 +249,15 @@ in # other purposes (binutils and top-level pkgs) too. inherit (prevStage) gettext gnum4 bison gmp perl glibc zlib linuxHeaders; + binutils = super.binutils.override { + # Don't use stdenv's shell but our own + shell = self.bash + "/bin/bash"; + # Build expand-response-params with last stage like below + buildPackages = { + inherit (prevStage) stdenv; + }; + }; + gcc = lib.makeOverridable (import ../../build-support/cc-wrapper) { nativeTools = false; nativeLibc = false; @@ -243,8 +266,9 @@ in inherit (prevStage) stdenv; }; cc = prevStage.gcc-unwrapped; + bintools = self.binutils; libc = self.glibc; - inherit (self) stdenvNoCC binutils coreutils gnugrep; + inherit (self) stdenvNoCC coreutils gnugrep; name = ""; shell = self.bash + "/bin/bash"; }; @@ -299,8 +323,8 @@ in allowedRequisites = with prevStage; with lib; # Simple executable tools concatMap (p: [ (getBin p) (getLib p) ]) - [ gzip bzip2 xz bash binutils coreutils diffutils findutils gawk - gnumake gnused gnutar gnugrep gnupatch patchelf ed paxctl + [ gzip bzip2 xz bash binutils.bintools coreutils diffutils findutils + gawk gnumake gnused gnutar gnugrep gnupatch patchelf ed paxctl ] # Library dependencies ++ map getLib ( @@ -310,7 +334,7 @@ in # More complicated cases ++ [ glibc.out glibc.dev glibc.bin/*propagated from .dev*/ linuxHeaders - gcc gcc.cc gcc.cc.lib gcc.expand-response-params + binutils gcc gcc.cc gcc.cc.lib gcc.expand-response-params ] ++ lib.optionals localSystem.isAarch64 [ prevStage.updateAutotoolsGnuConfigScriptsHook prevStage.gnu-config ]; @@ -322,7 +346,7 @@ in attr acl paxctl zlib pcre; } // lib.optionalAttrs (super.targetPlatform == localSystem) { # Need to get rid of these when cross-compiling. - inherit (prevStage) binutils; + inherit (prevStage) binutils binutils-raw; gcc = cc; }; }; diff --git a/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix b/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix index 8a1f7445b30b..8aaf4993108b 100644 --- a/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix +++ b/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix @@ -177,7 +177,7 @@ rec { # Copy binutils. for i in as ld ar ranlib nm strip readelf objdump; do - cp ${binutils.out}/bin/$i $out/bin + cp ${binutils.bintools.out}/bin/$i $out/bin done chmod -R u+w $out diff --git a/pkgs/stdenv/linux/make-bootstrap-tools.nix b/pkgs/stdenv/linux/make-bootstrap-tools.nix index 52eea41bdbd7..15be64a22a92 100644 --- a/pkgs/stdenv/linux/make-bootstrap-tools.nix +++ b/pkgs/stdenv/linux/make-bootstrap-tools.nix @@ -126,7 +126,7 @@ rec { # Copy binutils. for i in as ld ar ranlib nm strip readelf objdump; do - cp ${binutils.out}/bin/$i $out/bin + cp ${binutils.bintools.out}/bin/$i $out/bin done chmod -R u+w $out diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d66c4dcd76d7..2e90f94ab580 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5462,7 +5462,9 @@ with pkgs; clang-sierraHack = clang.override { name = "clang-wrapper-with-reexport-hack"; - useMacosReexportHack = true; + bintools = clang.bintools.override { + useMacosReexportHack = true; + }; }; clang_5 = llvmPackages_5.clang; @@ -5491,7 +5493,7 @@ with pkgs; cc = build; isClang = true; inherit stdenvNoCC; - libc = glibc; + inherit (targetPackages.stdenv.cc) bintools libc; extraPackages = [ libcxx libcxxabi ]; nativeTools = false; nativeLibc = false; @@ -5561,18 +5563,23 @@ with pkgs; }; wrapCCMulti = cc: - if system == "x86_64-linux" then lowPrio (wrapCCWith { + if system == "x86_64-linux" then let + # Binutils with glibc multi + bintools = cc.bintools.override { + libc = glibc_multi; + }; + in lowPrio (wrapCCWith { cc = cc.cc.override { stdenv = overrideCC stdenv (wrapCCWith { cc = cc.cc; + inherit bintools; libc = glibc_multi; }); profiledCompiler = false; enableMultilib = true; }; - libc = glibc_multi; - + inherit bintools; extraBuildCommands = '' echo "dontMoveLib64=1" >> $out/nix-support/setup-hook ''; @@ -5605,6 +5612,10 @@ with pkgs; if targetPlatform.libc == "msvcrt" then targetPackages.windows.mingw_w64_headers else if targetPlatform.libc == "libSystem" then darwin.xcode else null; + binutils1 = wrapBintoolsWith { + bintools = binutils-unwrapped; + libc = libcCross1; + }; in wrapCCWith { name = "gcc-cross-wrapper"; cc = gccFun { @@ -5618,9 +5629,10 @@ with pkgs; crossStageStatic = true; langCC = false; libcCross = libcCross1; - targetPackages.stdenv.cc.bintools = binutils; + targetPackages.stdenv.cc.bintools = binutils1; enableShared = false; }; + bintools = binutils1; libc = libcCross1; }; @@ -5629,6 +5641,7 @@ with pkgs; name = "gcc-cross-wrapper"; cc = gccCrossStageStatic.gcc; libc = windows.mingw_headers2; + inherit binutils; }; gcc45 = lowPrio (wrapCC (callPackage ../development/compilers/gcc/4.5 { @@ -6394,7 +6407,8 @@ with pkgs; wla-dx = callPackage ../development/compilers/wla-dx { }; - wrapCCWith = { name ? "", cc, libc, extraBuildCommands ? "" }: ccWrapperFun rec { + wrapCCWith = { name ? "", cc, bintools, libc, extraBuildCommands ? "" }: + ccWrapperFun rec { nativeTools = targetPlatform == hostPlatform && stdenv.cc.nativeTools or false; nativeLibc = targetPlatform == hostPlatform && stdenv.cc.nativeLibc or false; nativePrefix = stdenv.cc.nativePrefix or ""; @@ -6403,14 +6417,20 @@ with pkgs; isGNU = cc.isGNU or false; isClang = cc.isClang or false; - inherit name cc libc extraBuildCommands; + inherit name cc bintools libc extraBuildCommands; }; ccWrapperFun = callPackage ../build-support/cc-wrapper; + bintoolsWrapperFun = callPackage ../build-support/bintools-wrapper; wrapCC = cc: wrapCCWith { name = lib.optionalString (targetPlatform != hostPlatform) "gcc-cross-wrapper"; inherit cc; + # This should be the only bintools runtime dep with this sort of logic. The + # Others should instead delegate to the next stage's choice with + # `targetPackages.stdenv.cc.bintools`. This one is different just to + # provide the default choice, avoiding infinite recursion. + bintools = if targetPlatform.isDarwin then darwin.binutils else binutils; libc = if targetPlatform != hostPlatform then libcCross else stdenv.cc.libc; }; # legacy version, used for gnat bootstrapping @@ -6422,6 +6442,17 @@ with pkgs; libc = glibc; }; + wrapBintoolsWith = { bintools, libc }: bintoolsWrapperFun { + nativeTools = targetPlatform == hostPlatform && stdenv.cc.nativeTools or false; + nativeLibc = targetPlatform == hostPlatform && stdenv.cc.nativeLibc or false; + nativePrefix = stdenv.cc.nativePrefix or ""; + + noLibc = (libc == null); + + inherit bintools libc; + extraBuildCommands = ""; + }; + # prolog yap = callPackage ../development/compilers/yap { }; @@ -7003,13 +7034,19 @@ with pkgs; then darwin.binutils else binutils-raw; - binutils-raw = callPackage ../development/tools/misc/binutils { + binutils-unwrapped = callPackage ../development/tools/misc/binutils { # FHS sys dirs presumably only have stuff for the build platform noSysDirs = (targetPlatform != buildPlatform) || noSysDirs; }; + binutils-raw = wrapBintoolsWith { + libc = if targetPlatform != hostPlatform then libcCross else stdenv.cc.libc; + bintools = binutils-unwrapped; + }; binutils_nogold = lowPrio (binutils-raw.override { - gold = false; + bintools = binutils-raw.bintools.override { + gold = false; + }; }); bison2 = callPackage ../development/tools/parsing/bison/2.x.nix { }; diff --git a/pkgs/top-level/darwin-packages.nix b/pkgs/top-level/darwin-packages.nix index 32d540a8f967..f252a63f8c37 100644 --- a/pkgs/top-level/darwin-packages.nix +++ b/pkgs/top-level/darwin-packages.nix @@ -10,8 +10,14 @@ in apple_sdk = callPackage ../os-specific/darwin/apple-sdk { }; - binutils = callPackage ../os-specific/darwin/binutils { - inherit (darwin) cctools; + binutils = pkgs.wrapBintoolsWith { + libc = + if pkgs.targetPlatform != pkgs.hostPlatform + then pkgs.libcCross + else pkgs.stdenv.cc.libc; + bintools = callPackage ../os-specific/darwin/binutils { + inherit (darwin) cctools; + }; }; cctools = callPackage ../os-specific/darwin/cctools/port.nix { From 91ca46f6934c0749527f275c8b8f8cb5c8c29ae2 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Fri, 1 Sep 2017 15:33:59 -0400 Subject: [PATCH 16/40] doc: Document Bintools Wrapper Shrunk the CC Wrapper documentation so as not to be repetative. --- doc/stdenv.xml | 65 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/doc/stdenv.xml b/doc/stdenv.xml index 46b562a794f0..544f89ae4bde 100644 --- a/doc/stdenv.xml +++ b/doc/stdenv.xml @@ -1350,33 +1350,64 @@ someVar=$(stripHash $name) + + Bintools Wrapper + + + Bintools Wrapper wraps the binary utilities for a bunch of miscellaneous purposes. + These are GNU Binutils when targetting Linux, and a mix of cctools and GNU binutils for Darwin. + [The "Bintools" name is supposed to be a compromise between "Binutils" and "cctools" not denoting any specific implementation.] + Specifically, the underlying bintools package, and a C standard library (glibc or Darwin's libSystem, just for the dynamic loader) are all fed in, and dependency finding, hardening (see below), and purity checks for each are handled by Bintools Wrapper. + Packages typically depend on CC Wrapper, which in turn (at run time) depends on Bintools Wrapper. + + + Bintools Wrapper was only just recently split off from CC Wrapper, so the division of labor is still being worked out. + For example, it shouldn't care about about the C standard library, but just take a derivation with the dynamic loader (which happens to be the glibc on linux). + Dependency finding however is a task both wrappers will continue to need to share, and probably the most important to understand. + It is currently accomplished by collecting directories of host-platform dependencies (i.e. buildInputs and nativeBuildInputs) in environment variables. + Bintools Wrapper's setup hook causes any lib and lib64 subdirectories to be added to NIX_LDFLAGS. + Since CC Wrapper and Bintools Wrapper use the same strategy, most of the Bintools Wrapper code is sparsely commented and refers to CC Wrapper. + But CC Wrapper's code, by contrast, has quite lengthy comments. + Bintools Wrapper merely cites those, rather than repeating them, to avoid falling out of sync. + + + A final task of the setup hook is defining a number of standard environment variables to tell build systems which executables full-fill which purpose. + They are defined to just be the base name of the tools, under the assumption that Bintools Wrapper's binaries will be on the path. + Firstly, this helps poorly-written packages, e.g. ones that look for just gcc when CC isn't defined yet clang is to be used. + Secondly, this helps packages not get confused when cross-compiling, in which case multiple Bintools Wrappers may simultaneously be in use. + + Each wrapper targets a single platform, so if binaries for multiple platforms are needed, the underlying binaries must be wrapped multiple times. + As this is a property of the wrapper itself, the multiple wrappings are needed whether or not the same underlying binaries can target multiple platforms. + + BUILD_- and TARGET_-prefixed versions of the normal environment variable are defined for the additional Bintools Wrappers, properly disambiguating them. + + + A problem with this final task is that Bintools Wrapper is honest and defines LD as ld. + Most packages, however, firstly use the C compiler for linking, secondly use LD anyways, defining it as the C compiler, and thirdly, only so define LD when it is undefined as a fallback. + This triple-threat means Bintools Wrapper will break those packages, as LD is already defined as the actual linker which the package won't override yet doesn't want to use. + The workaround is to define, just for the problematic package, LD as the C compiler. + A good way to do this would be preConfigure = "LD=$CC". + + + + CC Wrapper CC Wrapper wraps a C toolchain for a bunch of miscellaneous purposes. - Specifically, a C compiler (GCC or Clang), Binutils (or the CCTools + binutils mashup when targetting Darwin), and a C standard library (glibc or Darwin's libSystem) are all fed in, and dependency finding, hardening (see below), and purity checks for each are handled by CC Wrapper. - Packages typically depend on only CC Wrapper, instead of those 3 inputs directly. + Specifically, a C compiler (GCC or Clang), wrapped binary tools, and a C standard library (glibc or Darwin's libSystem, just for the dynamic loader) are all fed in, and dependency finding, hardening (see below), and purity checks for each are handled by CC Wrapper. + Packages typically depend on CC Wrapper, which in turn (at run time) depends on Bintools Wrapper. - Dependency finding is undoubtedly the main task of CC wrapper. - It is currently accomplished by collecting directories of host-platform dependencies (i.e. buildInputs and nativeBuildInputs) in environment variables. - CC wrapper's setup hook causes any include subdirectory of such a dependency to be added to NIX_CFLAGS_COMPILE, and any lib and lib64 subdirectories to NIX_LDFLAGS. + Dependency finding is undoubtedly the main task of CC Wrapper. + This works just like Bintools Wrapper, except that any include subdirectory of any relevant dependency is added to NIX_CFLAGS_COMPILE. The setup hook itself contains some lengthy comments describing the exact convoluted mechanism by which this is accomplished. - A final task of the setup hook is defining a number of standard environment variables to tell build systems which executables full-fill which purpose. - They are defined to just be the base name of the tools, under the assumption that CC Wrapper's binaries will be on the path. - Firstly, this helps poorly-written packages, e.g. ones that look for just gcc when CC isn't defined yet clang is to be used. - Secondly, this helps packages not get confused when cross-compiling, in which case multiple CC wrappers may be simultaneous in use (targeting different platforms). - BUILD_- and TARGET_-prefixed versions of the normal environment variable are defined for the additional CC Wrappers, properly disambiguating them. - - - A problem with this final task is that CC Wrapper is honest and defines LD as ld. - Most packages, however, firstly use the C compiler for linking, secondly use LD anyways, defining it as the C compiler, and thirdly, only so define LD when it is undefined as a fallback. - This triple-threat means CC Wrapper will break those packages, as LD is already defined as the actually linker which the package won't override yet doesn't want to use. - The workaround is to define, just for the problematic package, LD as the C compiler. - A good way to do this would be preConfigure = "LD=$CC". + CC Wrapper also like Bintools Wrapper defines standard environment variables with the names of the tools it wraps, for the same reasons described above. + Importantly, while it includes a cc symlink to the c compiler for portability, the CC will be defined using the compiler's "real name" (i.e. gcc or clang). + This helps lousy build systems that inspect on the name of the compiler rather than run it. From b8a21aa918e97bc9bc050afdfd28a81da3f1bd9a Mon Sep 17 00:00:00 2001 From: John Ericson Date: Thu, 21 Sep 2017 01:33:00 -0400 Subject: [PATCH 17/40] misc setup-hooks: Use env vars to refer to binutils programs This is more robust for cross-compilation --- pkgs/build-support/setup-hooks/separate-debug-info.sh | 6 +++--- pkgs/build-support/setup-hooks/strip.sh | 2 +- pkgs/build-support/setup-hooks/win-dll-link.sh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/build-support/setup-hooks/separate-debug-info.sh b/pkgs/build-support/setup-hooks/separate-debug-info.sh index c90d2cd52013..19dbb10d18e7 100644 --- a/pkgs/build-support/setup-hooks/separate-debug-info.sh +++ b/pkgs/build-support/setup-hooks/separate-debug-info.sh @@ -19,7 +19,7 @@ _separateDebugInfo() { if ! isELF "$i"; then continue; fi # Extract the Build ID. FIXME: there's probably a cleaner way. - local id="$(readelf -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')" + local id="$($READELF -n "$i" | sed 's/.*Build ID: \([0-9a-f]*\).*/\1/; t; d')" if [ "${#id}" != 40 ]; then echo "could not find build ID of $i, skipping" >&2 continue @@ -28,8 +28,8 @@ _separateDebugInfo() { # Extract the debug info. header "separating debug info from $i (build ID $id)" mkdir -p "$dst/${id:0:2}" - objcopy --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug" - strip --strip-debug "$i" + $OBJCOPY --only-keep-debug "$i" "$dst/${id:0:2}/${id:2}.debug" + $STRIP --strip-debug "$i" # Also a create a symlink .debug. ln -sfn ".build-id/${id:0:2}/${id:2}.debug" "$dst/../$(basename "$i")" diff --git a/pkgs/build-support/setup-hooks/strip.sh b/pkgs/build-support/setup-hooks/strip.sh index 0bf37e10d870..a33968ca18de 100644 --- a/pkgs/build-support/setup-hooks/strip.sh +++ b/pkgs/build-support/setup-hooks/strip.sh @@ -30,7 +30,7 @@ stripDirs() { if [ -n "${dirs}" ]; then header "stripping (with flags $stripFlags) in$dirs" - find $dirs -type f -print0 | xargs -0 ${xargsFlags:--r} strip $commonStripFlags $stripFlags 2>/dev/null || true + find $dirs -type f -print0 | xargs -0 ${xargsFlags:--r} $STRIP $commonStripFlags $stripFlags 2>/dev/null || true stopNest fi } diff --git a/pkgs/build-support/setup-hooks/win-dll-link.sh b/pkgs/build-support/setup-hooks/win-dll-link.sh index 9658b9f82595..6130f32bef86 100644 --- a/pkgs/build-support/setup-hooks/win-dll-link.sh +++ b/pkgs/build-support/setup-hooks/win-dll-link.sh @@ -25,7 +25,7 @@ _linkDLLs() { linkCount=0 # Iterate over any DLL that we depend on. local dll - for dll in $(objdump -p *.{exe,dll} | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do + for dll in $($OBJDUMP -p *.{exe,dll} | sed -n 's/.*DLL Name: \(.*\)/\1/p' | sort -u); do if [ -e "./$dll" ]; then continue; fi # Locate the DLL - it should be an *executable* file on $DLLPATH. local dllPath="$(PATH="$DLLPATH" type -P "$dll")" From ef178be597e24cf1d34b7079af5265d754cc31a3 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sat, 25 Nov 2017 14:04:43 -0500 Subject: [PATCH 18/40] bintools-wrapper: Support ld.ldd, along with ld.bfd and ld.gold Also make the code more precise in the process --- pkgs/build-support/bintools-wrapper/default.nix | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix index a9155c2c6eba..dc157acc6cc2 100644 --- a/pkgs/build-support/bintools-wrapper/default.nix +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -155,13 +155,11 @@ stdenv.mkDerivation { unset ldInner '') + '' - if [ -e ${bintools_bin}/bin/${targetPrefix}ld.gold ]; then - wrap ${targetPrefix}ld.gold ${./ld-wrapper.sh} ${bintools_bin}/bin/${targetPrefix}ld.gold - fi - - if [ -e ${bintools_bin}/bin/ld.bfd ]; then - wrap ${targetPrefix}ld.bfd ${./ld-wrapper.sh} ${bintools_bin}/bin/${targetPrefix}ld.bfd - fi + for variant in ld.gold ld.bfd ld.lld; do + local underlying=$ldPath/${targetPrefix}$variant + [[ -e "$underlying" ]] || continue + wrap ${targetPrefix}$variant ${./ld-wrapper.sh} $underlying + done set +u ''; From cebe1b4c08b1d555cbcb4fd8b61a8f28f191a284 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 26 Nov 2017 14:46:34 -0500 Subject: [PATCH 19/40] darwin binutils: Better handling of man pages and info --- pkgs/development/tools/misc/binutils/default.nix | 2 +- pkgs/os-specific/darwin/binutils/default.nix | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkgs/development/tools/misc/binutils/default.nix b/pkgs/development/tools/misc/binutils/default.nix index 519d5c722af8..7628e37ae1cd 100644 --- a/pkgs/development/tools/misc/binutils/default.nix +++ b/pkgs/development/tools/misc/binutils/default.nix @@ -55,7 +55,7 @@ stdenv.mkDerivation rec { ./disambiguate-arm-targets.patch ]; - outputs = [ "out" "info" ]; + outputs = [ "out" "info" "man" ]; nativeBuildInputs = [ bison buildPackages.stdenv.cc ]; buildInputs = [ zlib ]; diff --git a/pkgs/os-specific/darwin/binutils/default.nix b/pkgs/os-specific/darwin/binutils/default.nix index e05d8cf8c43d..1fff4915da3c 100644 --- a/pkgs/os-specific/darwin/binutils/default.nix +++ b/pkgs/os-specific/darwin/binutils/default.nix @@ -17,6 +17,7 @@ in # TODO loop over targetPrefixed binaries too stdenv.mkDerivation { name = "${targetPrefix}cctools-binutils-darwin"; + outputs = [ "out" "info" "man" ]; buildCommand = '' mkdir -p $out/bin $out/include @@ -37,10 +38,16 @@ stdenv.mkDerivation { ln -sf "${cctools}/bin/$i" "$out/bin/$i" done - # FIXME: this will give us incorrect man pages for bits of cctools ln -s ${binutils-raw.bintools.out}/share $out/share ln -s ${cctools}/libexec $out/libexec + + mkdir -p "$info/nix-support" "$man/nix-support" + printWords ${binutils-raw.bintools.info} \ + >> $info/nix-support/propagated-build-inputs + # FIXME: cctools missing man pages + printWords ${binutils-raw.bintools.man} \ + >> $man/nix-support/propagated-build-inputs ''; passthru = { From 99806c5e12bd02926981ebf2d0b779c683b801ee Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 28 Nov 2017 17:16:09 -0500 Subject: [PATCH 20/40] bintools-wrapper: Create man and info outputs propagated underlying ones These will be installed if the wrappers are. The wrappers aren't very good to install, but that's another matter. --- pkgs/build-support/bintools-wrapper/default.nix | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix index dc157acc6cc2..0dcae204824d 100644 --- a/pkgs/build-support/bintools-wrapper/default.nix +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -82,7 +82,7 @@ stdenv.mkDerivation { inherit targetPrefix infixSalt; - outputs = [ "out" "man" ]; + outputs = [ "out" "info" "man" ]; passthru = { inherit bintools libc nativeTools nativeLibc nativePrefix; @@ -110,7 +110,7 @@ stdenv.mkDerivation { '' set -u - mkdir -p $out/bin $out/nix-support $man/nix-support + mkdir -p $out/bin {$out,$info,$man}/nix-support wrap() { local dst="$1" @@ -231,6 +231,15 @@ stdenv.mkDerivation { # install the wrapper, you get tools like objdump, the manpages, # etc. as well (same for any binaries of libc). printWords ${bintools_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages + + ## + ## Man page and info support + ## + + printWords ${bintools.info or ""} \ + >> $info/nix-support/propagated-build-inputs + printWords ${bintools.man or ""} \ + >> $man/nix-support/propagated-build-inputs '' + '' From 12e0672d8848852677c6c77a63e2c793ad7a266b Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sat, 9 Dec 2017 14:19:02 -0500 Subject: [PATCH 21/40] gcc: Adjust builder.sh to find some things in bintools-wrapper instead --- .../development/compilers/gcc/4.5/default.nix | 1 + .../development/compilers/gcc/4.8/default.nix | 1 + .../development/compilers/gcc/4.9/default.nix | 1 + pkgs/development/compilers/gcc/5/default.nix | 1 + pkgs/development/compilers/gcc/6/default.nix | 1 + pkgs/development/compilers/gcc/7/default.nix | 1 + pkgs/development/compilers/gcc/builder.sh | 53 ++++++++++++------- .../compilers/gcc/snapshot/default.nix | 1 + 8 files changed, 41 insertions(+), 19 deletions(-) diff --git a/pkgs/development/compilers/gcc/4.5/default.nix b/pkgs/development/compilers/gcc/4.5/default.nix index b41d22f4f539..b4ae867d5859 100644 --- a/pkgs/development/compilers/gcc/4.5/default.nix +++ b/pkgs/development/compilers/gcc/4.5/default.nix @@ -356,6 +356,7 @@ stdenv.mkDerivation ({ dontStrip = true; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work diff --git a/pkgs/development/compilers/gcc/4.8/default.nix b/pkgs/development/compilers/gcc/4.8/default.nix index 8713c174d5a6..4efac1b26c34 100644 --- a/pkgs/development/compilers/gcc/4.8/default.nix +++ b/pkgs/development/compilers/gcc/4.8/default.nix @@ -444,6 +444,7 @@ stdenv.mkDerivation ({ buildFlags = ""; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work diff --git a/pkgs/development/compilers/gcc/4.9/default.nix b/pkgs/development/compilers/gcc/4.9/default.nix index c338f9c641ee..fb4218a0edea 100644 --- a/pkgs/development/compilers/gcc/4.9/default.nix +++ b/pkgs/development/compilers/gcc/4.9/default.nix @@ -442,6 +442,7 @@ stdenv.mkDerivation ({ buildFlags = ""; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work diff --git a/pkgs/development/compilers/gcc/5/default.nix b/pkgs/development/compilers/gcc/5/default.nix index 552e827ec366..b4399ef72f19 100644 --- a/pkgs/development/compilers/gcc/5/default.nix +++ b/pkgs/development/compilers/gcc/5/default.nix @@ -451,6 +451,7 @@ stdenv.mkDerivation ({ buildFlags = ""; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work diff --git a/pkgs/development/compilers/gcc/6/default.nix b/pkgs/development/compilers/gcc/6/default.nix index fbc490026067..d923092168ab 100644 --- a/pkgs/development/compilers/gcc/6/default.nix +++ b/pkgs/development/compilers/gcc/6/default.nix @@ -452,6 +452,7 @@ stdenv.mkDerivation ({ buildFlags = ""; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work diff --git a/pkgs/development/compilers/gcc/7/default.nix b/pkgs/development/compilers/gcc/7/default.nix index 032a20271ee0..c9daf813e6f8 100644 --- a/pkgs/development/compilers/gcc/7/default.nix +++ b/pkgs/development/compilers/gcc/7/default.nix @@ -446,6 +446,7 @@ stdenv.mkDerivation ({ buildFlags = ""; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work diff --git a/pkgs/development/compilers/gcc/builder.sh b/pkgs/development/compilers/gcc/builder.sh index 0765daee4534..1796c83385e5 100644 --- a/pkgs/development/compilers/gcc/builder.sh +++ b/pkgs/development/compilers/gcc/builder.sh @@ -28,37 +28,55 @@ if test "$noSysDirs" = "1"; then EXTRA_BUILD_FLAGS EXTRA_FLAGS EXTRA_TARGET_FLAGS \ EXTRA_BUILD_LDFLAGS EXTRA_TARGET_LDFLAGS + # Extract flags from Bintools Wrappers + for pre in 'BUILD_' ''; do + curBintools="NIX_${pre}BINTOOLS" + + declare -a extraLDFlags=() + if [[ -e "${!curBintools}/nix-support/orig-libc" ]]; then + # Figure out what extra flags when linking to pass to the gcc + # compilers being generated to make sure that they use our libc. + extraLDFlags=($(< "${!curBintools}/nix-support/libc-ldflags") $(< "${!curBintools}/nix-support/libc-ldflags-before" || true)) + + # The path to the Libc binaries such as `crti.o'. + libc_libdir="$(< "${!curBintools}/nix-support/orig-libc")/lib" + else + # Hack: support impure environments. + extraLDFlags=("-L/usr/lib64" "-L/usr/lib") + libc_libdir="/usr/lib" + fi + extraLDFlags=("-L$libc_libdir" "-rpath" "$libc_libdir" + "${extraLDFlags[@]}") + for i in "${extraLDFlags[@]}"; do + declare EXTRA_${pre}LDFLAGS+=" -Wl,$i" + done + done + + # Extract flags from CC Wrappers for pre in 'BUILD_' ''; do curCC="NIX_${pre}CC" curFIXINC="NIX_${pre}FIXINC_DUMMY" - declare -a extraFlags=() extraLDFlags=() + declare -a extraFlags=() if [[ -e "${!curCC}/nix-support/orig-libc" ]]; then - # Figure out what extra flags to pass to the gcc compilers being - # generated to make sure that they use our glibc. - extraFlags=($(cat "${!curCC}/nix-support/libc-cflags")) - extraLDFlags=($(cat "${!curCC}/nix-support/libc-ldflags") $(cat "${!curCC}/nix-support/libc-ldflags-before" || true)) + # Figure out what extra compiling flags to pass to the gcc compilers + # being generated to make sure that they use our libc. + extraFlags=($(< "${!curCC}/nix-support/libc-cflags")) - # The path to the Glibc binaries such as `crti.o'. - glibc_libdir="$(cat "${!curCC}/nix-support/orig-libc")/lib" - glibc_devdir="$(cat "${!curCC}/nix-support/orig-libc-dev")" + # The path to the Libc headers + libc_devdir="$(< "${!curCC}/nix-support/orig-libc-dev")" # Use *real* header files, otherwise a limits.h is generated that - # does not include Glibc's limits.h (notably missing SSIZE_MAX, + # does not include Libc's limits.h (notably missing SSIZE_MAX, # which breaks the build). - declare NIX_${pre}FIXINC_DUMMY="$glibc_devdir/include" + declare NIX_${pre}FIXINC_DUMMY="$libc_devdir/include" else # Hack: support impure environments. extraFlags=("-isystem" "/usr/include") - extraLDFlags=("-L/usr/lib64" "-L/usr/lib") - glibc_libdir="/usr/lib" declare NIX_${pre}FIXINC_DUMMY=/usr/include fi - extraFlags=("-I${!curFIXINC}" - "${extraFlags[@]}") - extraLDFlags=("-L$glibc_libdir" "-rpath" "$glibc_libdir" - "${extraLDFlags[@]}") + extraFlags=("-I${!curFIXINC}" "${extraFlags[@]}") # BOOT_CFLAGS defaults to `-g -O2'; since we override it below, make # sure to explictly add them so that files compiled with the bootstrap @@ -72,9 +90,6 @@ if test "$noSysDirs" = "1"; then fi declare EXTRA_${pre}FLAGS="${extraFlags[*]}" - for i in "${extraLDFlags[@]}"; do - declare EXTRA_${pre}LDFLAGS+=" -Wl,$i" - done done if test -z "${targetConfig-}"; then diff --git a/pkgs/development/compilers/gcc/snapshot/default.nix b/pkgs/development/compilers/gcc/snapshot/default.nix index f2f8eeb09a5e..9d1bdc08133d 100644 --- a/pkgs/development/compilers/gcc/snapshot/default.nix +++ b/pkgs/development/compilers/gcc/snapshot/default.nix @@ -433,6 +433,7 @@ stdenv.mkDerivation ({ buildFlags = ""; }; + NIX_BUILD_BINTOOLS = buildPackages.stdenv.cc.bintools; NIX_BUILD_CC = buildPackages.stdenv.cc; # Needed for the cross compilation to work From 26a5612aebd10668e10a67ad54092a2690ffa281 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 12 Dec 2017 19:40:41 -0500 Subject: [PATCH 22/40] libstdc++5: Fix after binutils-wrapper Will need to be editted again to work for cross --- pkgs/development/libraries/libstdc++5/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/development/libraries/libstdc++5/default.nix b/pkgs/development/libraries/libstdc++5/default.nix index baea981ca4a1..5c0e7c9bdfa4 100644 --- a/pkgs/development/libraries/libstdc++5/default.nix +++ b/pkgs/development/libraries/libstdc++5/default.nix @@ -64,7 +64,7 @@ stdenv.mkDerivation rec { # being generated to make sure that they use our glibc. EXTRA_FLAGS="-I$NIX_FIXINC_DUMMY $(cat $NIX_CC/nix-support/libc-cflags) -O2" - extraLDFlags="-L$glibc_libdir -rpath $glibc_libdir $(cat $NIX_CC/nix-support/libc-ldflags) $(cat $NIX_CC/nix-support/libc-ldflags-before)" + extraLDFlags="-L$glibc_libdir -rpath $glibc_libdir $(cat $NIX_BINTOOLS/nix-support/libc-ldflags) $(cat $NIX_BINTOOLS/nix-support/libc-ldflags-before)" for i in $extraLDFlags; do EXTRA_FLAGS="$EXTRA_FLAGS -Wl,$i" done From 84fb59e0be30504e16ed428c34f1b321f6187fbe Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 13 Dec 2017 16:03:13 -0500 Subject: [PATCH 23/40] clang multi: Fix post bintools wrapper --- pkgs/development/compilers/llvm/multi.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkgs/development/compilers/llvm/multi.nix b/pkgs/development/compilers/llvm/multi.nix index 0fa0eb3404d8..b4f2f8f9d6f6 100644 --- a/pkgs/development/compilers/llvm/multi.nix +++ b/pkgs/development/compilers/llvm/multi.nix @@ -36,6 +36,10 @@ let # Most of the magic is done by setting the --gcc-toolchain option below libc = gcc_multi_sysroot; + bintools = clang.bintools.override { + libc = gcc_multi_sysroot; + }; + extraBuildCommands = '' sed -e '$a --gcc-toolchain=${gcc_multi_sysroot}' -i $out/nix-support/libc-cflags ''; From fe61c3b84e8e81a8ec2bf6b3ed2a0e8652cea190 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Thu, 14 Dec 2017 00:53:23 +0000 Subject: [PATCH 24/40] bloaty: update path to c++filt after #29396 --- pkgs/development/tools/bloaty/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/development/tools/bloaty/default.nix b/pkgs/development/tools/bloaty/default.nix index e61b7f78302b..0dbe1aa78c50 100644 --- a/pkgs/development/tools/bloaty/default.nix +++ b/pkgs/development/tools/bloaty/default.nix @@ -19,7 +19,7 @@ stdenv.mkDerivation rec { preConfigure = '' substituteInPlace src/bloaty.cc \ --replace "c++filt" \ - "${stdenv.lib.getBin binutils}/bin/c++filt" + "${binutils.bintools}/bin/c++filt" ''; doCheck = true; From fa3d6c322e3d26c2b7b0c7df09a48a426d9629ad Mon Sep 17 00:00:00 2001 From: Bob van der Linden Date: Thu, 14 Dec 2017 15:37:00 +0100 Subject: [PATCH 25/40] nodejs: 9.2.0 -> 9.3.0 --- pkgs/development/web/nodejs/v9.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/web/nodejs/v9.nix b/pkgs/development/web/nodejs/v9.nix index 8a1cd2d148d1..1a2184d4cb9a 100644 --- a/pkgs/development/web/nodejs/v9.nix +++ b/pkgs/development/web/nodejs/v9.nix @@ -5,7 +5,7 @@ let in buildNodejs { inherit enableNpm; - version = "9.2.0"; - sha256 = "1hmvwfbavk2axqz9kin8b5zsld25gznhvlz55h3yl6nwx9iz5jk4"; + version = "9.3.0"; + sha256 = "1kap1hi4am5advfp6yb3bd5nhd2wx2j72cjq8qqg7yh95xg0g25j"; patches = lib.optionals stdenv.isDarwin [ ./no-xcode-v7.patch ]; } From aa86d135f873254048aea0894cf49d9332cb56b9 Mon Sep 17 00:00:00 2001 From: Bob van der Linden Date: Thu, 14 Dec 2017 23:28:27 +0100 Subject: [PATCH 26/40] libuv: 1.16.1 -> 0.18.0 --- pkgs/development/libraries/libuv/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/libuv/default.nix b/pkgs/development/libraries/libuv/default.nix index ba745010504b..4075505f8dd8 100644 --- a/pkgs/development/libraries/libuv/default.nix +++ b/pkgs/development/libraries/libuv/default.nix @@ -2,14 +2,14 @@ , ApplicationServices, CoreServices }: stdenv.mkDerivation rec { - version = "1.16.1"; + version = "1.18.0"; name = "libuv-${version}"; src = fetchFromGitHub { owner = "libuv"; repo = "libuv"; rev = "v${version}"; - sha256 = "06p3xy276spqbr9xzbs7qlpdk34qsn87s2qmp6xn4j7v3bnqja7z"; + sha256 = "0s71c2y4ll3vp463hsdk74q4hr7wprkxc2a4agw3za2hhzcb95pd"; }; postPatch = let From 1e60ccdf475c64d8766f3eeab3e47be1e1f576c9 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Thu, 14 Dec 2017 10:53:43 +0100 Subject: [PATCH 27/40] =?UTF-8?q?meson:=200.43.0=20=E2=86=92=200.44.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkgs/development/tools/build-managers/meson/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/tools/build-managers/meson/default.nix b/pkgs/development/tools/build-managers/meson/default.nix index 8092e9b16f1a..5db0bce21f79 100644 --- a/pkgs/development/tools/build-managers/meson/default.nix +++ b/pkgs/development/tools/build-managers/meson/default.nix @@ -1,12 +1,12 @@ { lib, python3Packages }: python3Packages.buildPythonApplication rec { - version = "0.43.0"; + version = "0.44.0"; pname = "meson"; name = "${pname}-${version}"; src = python3Packages.fetchPypi { inherit pname version; - sha256 = "0qn5hyzvam3rimn7g3671s1igj7fbkwdnf5nc8jr4d5swy25mq61"; + sha256 = "1rpqp9iwbvr4xvfdh3iyfh1ha274hbb66jbgw3pa5a73x4d4ilqn"; }; postFixup = '' From dbeffe38e805355f76a9db9a711298c01d41c2ad Mon Sep 17 00:00:00 2001 From: Gabriel Ebner Date: Fri, 15 Dec 2017 19:07:56 +0100 Subject: [PATCH 28/40] perl generic builder: recognize #!/usr/bin/env perl --- pkgs/development/perl-modules/generic/builder.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkgs/development/perl-modules/generic/builder.sh b/pkgs/development/perl-modules/generic/builder.sh index 09b50e564110..1b8888dd3ceb 100644 --- a/pkgs/development/perl-modules/generic/builder.sh +++ b/pkgs/development/perl-modules/generic/builder.sh @@ -17,10 +17,7 @@ preConfigure() { first=$(dd if="$fn" count=2 bs=1 2> /dev/null) if test "$first" = "#!"; then echo "patching $fn..." - sed < "$fn" > "$fn".tmp \ - -e "s|^#\!\(.*/perl.*\)$|#\! \1$perlFlags|" - if test -x "$fn"; then chmod +x "$fn".tmp; fi - mv "$fn".tmp "$fn" + sed -i "$fn" -e "s|^#\!\(.*[ /]perl.*\)$|#\!\1$perlFlags|" fi fi done From 0990b2c7fd0f42ae0a31caf6d64343fe3f0aaa81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Fri, 15 Dec 2017 22:10:12 +0100 Subject: [PATCH 29/40] Revert "Reverting #32599" This reverts commit 15d3d68a5ea819dd82784a9a44cfe26ed5eb74cd. The PR is moved from master to staging. --- .../libraries/libva-utils/default.nix | 29 +++++++++++++++ pkgs/development/libraries/libva/default.nix | 35 +++++++++++-------- .../libraries/vaapi-intel/default.nix | 16 +++++---- pkgs/top-level/all-packages.nix | 1 + 4 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 pkgs/development/libraries/libva-utils/default.nix diff --git a/pkgs/development/libraries/libva-utils/default.nix b/pkgs/development/libraries/libva-utils/default.nix new file mode 100644 index 000000000000..fad721059124 --- /dev/null +++ b/pkgs/development/libraries/libva-utils/default.nix @@ -0,0 +1,29 @@ +{ stdenv, lib, fetchFromGitHub, autoreconfHook, pkgconfig +, libdrm, libva +}: + +stdenv.mkDerivation rec { + name = "libva-utils-${version}"; + inherit (libva) version; + + src = fetchFromGitHub { + owner = "01org"; + repo = "libva-utils"; + rev = version; + sha256 = "02n51cvp8bzzjk4fargwvgh7z71y8spg24hqgaawbp3p3ahh7xxi"; + }; + + nativeBuildInputs = [ autoreconfHook pkgconfig ]; + + buildInputs = [ libdrm libva ]; + + enableParallelBuilding = true; + + meta = with stdenv.lib; { + description = "VAAPI tools: Video Acceleration API"; + homepage = http://www.freedesktop.org/wiki/Software/vaapi; + license = licenses.mit; + maintainers = with maintainers; [ garbas ]; + platforms = platforms.unix; + }; +} diff --git a/pkgs/development/libraries/libva/default.nix b/pkgs/development/libraries/libva/default.nix index 031ac781651c..dca548a6f9d0 100644 --- a/pkgs/development/libraries/libva/default.nix +++ b/pkgs/development/libraries/libva/default.nix @@ -1,36 +1,43 @@ -{ stdenv, lib, fetchurl, libX11, pkgconfig, libXext, libdrm, libXfixes, wayland, libffi +{ stdenv, lib, fetchFromGitHub, autoreconfHook, pkgconfig +, libXext, libdrm, libXfixes, wayland, libffi, libX11 , mesa_noglu , minimal ? true, libva }: stdenv.mkDerivation rec { - name = "libva-${version}"; - version = "1.7.3"; + name = "libva-${lib.optionalString (!minimal) "full-"}${version}"; + version = "2.0.0"; - src = fetchurl { - url = "http://www.freedesktop.org/software/vaapi/releases/libva/${name}.tar.bz2"; - sha256 = "1ndrf136rlw03xag7j1xpmf9015d1h0dpnv6v587jnh6k2a17g12"; + src = fetchFromGitHub { + owner = "01org"; + repo = "libva"; + rev = version; + sha256 = "1x8rlmv5wfqjz3j87byrxb4d9vp5b4lrrin2fx254nwl3aqy15hy"; }; - outputs = [ "bin" "dev" "out" ]; + outputs = [ "dev" "out" ]; - nativeBuildInputs = [ pkgconfig ]; + nativeBuildInputs = [ autoreconfHook pkgconfig ]; buildInputs = [ libdrm ] ++ lib.optionals (!minimal) [ libva libX11 libXext libXfixes wayland libffi mesa_noglu ]; # TODO: share libs between minimal and !minimal - perhaps just symlink them - configureFlags = - [ "--with-drivers-path=${mesa_noglu.driverLink}/lib/dri" ] ++ - lib.optionals (!minimal) [ "--enable-glx" ]; + enableParallelBuilding = true; - installFlags = [ "dummy_drv_video_ladir=$(out)/lib/dri" ]; + configureFlags = [ + "--with-drivers-path=${mesa_noglu.driverLink}/lib/dri" + ] ++ lib.optionals (!minimal) [ "--enable-glx" ]; + + installFlags = [ + "dummy_drv_video_ladir=$(out)/lib/dri" + ]; meta = with stdenv.lib; { + description = "VAAPI library: Video Acceleration API"; homepage = http://www.freedesktop.org/wiki/Software/vaapi; license = licenses.mit; - description = "VAAPI library: Video Acceleration API"; - platforms = platforms.unix; maintainers = with maintainers; [ garbas ]; + platforms = platforms.unix; }; } diff --git a/pkgs/development/libraries/vaapi-intel/default.nix b/pkgs/development/libraries/vaapi-intel/default.nix index 49f638a7bc56..edb2a8214dde 100644 --- a/pkgs/development/libraries/vaapi-intel/default.nix +++ b/pkgs/development/libraries/vaapi-intel/default.nix @@ -1,14 +1,16 @@ -{ stdenv, fetchurl, gnum4, pkgconfig, python2 +{ stdenv, fetchFromGitHub, autoreconfHook, gnum4, pkgconfig, python2 , intel-gpu-tools, libdrm, libva, libX11, mesa_noglu, wayland, libXext }: stdenv.mkDerivation rec { name = "intel-vaapi-driver-${version}"; - version = "1.8.2"; + inherit (libva) version; - src = fetchurl { - url = "http://www.freedesktop.org/software/vaapi/releases/libva-intel-driver/${name}.tar.bz2"; - sha256 = "00mpcvininwr5c4wyhp16s4bddg7vclxxjm2sfq5h7lifjcxyv46"; + src = fetchFromGitHub { + owner = "01org"; + repo = "libva-intel-driver"; + rev = version; + sha256 = "1832nnva3d33wv52bj59bv62q7a807sdxjqqq0my7l9x7a4qdkzz"; }; patchPhase = '' @@ -25,10 +27,12 @@ stdenv.mkDerivation rec { "--enable-wayland" ]; - nativeBuildInputs = [ gnum4 pkgconfig python2 ]; + nativeBuildInputs = [ autoreconfHook gnum4 pkgconfig python2 ]; buildInputs = [ intel-gpu-tools libdrm libva libX11 libXext mesa_noglu wayland ]; + enableParallelBuilding = true; + meta = with stdenv.lib; { homepage = http://cgit.freedesktop.org/vaapi/intel-driver/; license = licenses.mit; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index af802c6794a5..6ac786b419c2 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9835,6 +9835,7 @@ with pkgs; libva = callPackage ../development/libraries/libva { }; libva-full = libva.override { minimal = false; }; + libva-utils = callPackage ../development/libraries/libva-utils { }; libvdpau = callPackage ../development/libraries/libvdpau { }; From 0f2a1e9ef9ac15fc025c5e7b1c46ea8c8815dd39 Mon Sep 17 00:00:00 2001 From: Gabriel Ebner Date: Sat, 16 Dec 2017 14:23:22 +0100 Subject: [PATCH 30/40] biber: remove sed workaround This was fixed by #32717. --- pkgs/tools/typesetting/biber/default.nix | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pkgs/tools/typesetting/biber/default.nix b/pkgs/tools/typesetting/biber/default.nix index 99ef60b399dc..12ea90fa725b 100644 --- a/pkgs/tools/typesetting/biber/default.nix +++ b/pkgs/tools/typesetting/biber/default.nix @@ -30,10 +30,6 @@ buildPerlModule rec { # Tests seem to be broken doCheck = false; - postUnpack = '' - sed '1s/env perl/perl/' -i */bin/biber - ''; - meta = { description = "Backend for BibLaTeX"; license = with stdenv.lib.licenses; [ artistic1 gpl1Plus ]; From 07d3bfc4b4cd9897f2527236f2b025c31ea3b692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Sat, 16 Dec 2017 17:25:39 +0100 Subject: [PATCH 31/40] libjpeg(-turbo): 1.5.2 -> 1.5.3 --- pkgs/development/libraries/libjpeg-turbo/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/libjpeg-turbo/default.nix b/pkgs/development/libraries/libjpeg-turbo/default.nix index 77f9d999de44..bf626df28eac 100644 --- a/pkgs/development/libraries/libjpeg-turbo/default.nix +++ b/pkgs/development/libraries/libjpeg-turbo/default.nix @@ -4,11 +4,11 @@ stdenv.mkDerivation rec { name = "libjpeg-turbo-${version}"; - version = "1.5.2"; + version = "1.5.3"; src = fetchurl { url = "mirror://sourceforge/libjpeg-turbo/${name}.tar.gz"; - sha256 = "0a5m0psfp5952y5vrcs0nbdz1y9wqzg2ms0xwrx752034wxr964h"; + sha256 = "08r5b5mywwrxv4axvq80dm31cklz81grczlzlxr2xqa6pgi90j5j"; }; # github releases still need autotools, surprisingly patches = From 21ba964f0ba4f7c662b871f063c8990a7a042c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Sat, 16 Dec 2017 17:51:17 +0100 Subject: [PATCH 32/40] mesa: maintenance 17.2.6 -> 17.2.7 --- pkgs/development/libraries/mesa/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/mesa/default.nix b/pkgs/development/libraries/mesa/default.nix index 2fe872701b70..fca99550a3ca 100644 --- a/pkgs/development/libraries/mesa/default.nix +++ b/pkgs/development/libraries/mesa/default.nix @@ -66,7 +66,7 @@ let in let - version = "17.2.6"; + version = "17.2.7"; branch = head (splitString "." version); driverLink = "/run/opengl-driver" + optionalString stdenv.isi686 "-32"; in @@ -81,7 +81,7 @@ stdenv.mkDerivation { "ftp://ftp.freedesktop.org/pub/mesa/older-versions/${branch}.x/${version}/mesa-${version}.tar.xz" "https://mesa.freedesktop.org/archive/mesa-${version}.tar.xz" ]; - sha256 = "1pihiymglf3bf6w2vphac65v64hv71wgrj38mckbwc03c8j55n3a"; + sha256 = "0s3slgjxnx482yw0knn4a6alsy2cq28rah6hnjbmf12mvyldxksh"; }; prePatch = "patchShebangs ."; From fc5756ea5e4a73624e0cfbb0e3eef247fc312547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= Date: Sat, 16 Dec 2017 17:51:52 +0100 Subject: [PATCH 33/40] cairo: bugfix 1.14.10 -> 1.14.12 --- pkgs/development/libraries/cairo/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/cairo/default.nix b/pkgs/development/libraries/cairo/default.nix index 7c0e36d40689..5487d889ce69 100644 --- a/pkgs/development/libraries/cairo/default.nix +++ b/pkgs/development/libraries/cairo/default.nix @@ -12,11 +12,11 @@ assert glSupport -> mesa_noglu != null; let inherit (stdenv.lib) optional optionals; in stdenv.mkDerivation rec { - name = "cairo-1.14.10"; + name = "cairo-1.14.12"; src = fetchurl { url = "http://cairographics.org/releases/${name}.tar.xz"; - sha256 = "02banr0wxckq62nbhc3mqidfdh2q956i2r7w2hd9bjgjb238g1vy"; + sha256 = "05mzyxkvsfc1annjw2dja8vka01ampp9pp93lg09j8hba06g144c"; }; patches = [ From 951c5d3b7d2b448d25bfde96f0c1a6e6a5b7c6c5 Mon Sep 17 00:00:00 2001 From: Yegor Timoshenko Date: Fri, 15 Dec 2017 23:04:53 +0000 Subject: [PATCH 34/40] fribidi: update source The old site redirects to GitHub. --- pkgs/development/libraries/fribidi/default.nix | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pkgs/development/libraries/fribidi/default.nix b/pkgs/development/libraries/fribidi/default.nix index bdfbb97f0218..a107c9a478f2 100644 --- a/pkgs/development/libraries/fribidi/default.nix +++ b/pkgs/development/libraries/fribidi/default.nix @@ -1,22 +1,26 @@ -{stdenv, fetchurl}: +{ stdenv, fetchFromGitHub, autoreconfHook, pkgconfig }: stdenv.mkDerivation rec { name = "fribidi-${version}"; version = "0.19.7"; - src = fetchurl { - url = "http://fribidi.org/download/${name}.tar.bz2"; - sha256 = "13jsb5qadlhsaxkbrb49nqslmbh904vvzhsm5mm2ghmv29i2l8h8"; + src = fetchFromGitHub { + owner = "fribidi"; + repo = "fribidi"; + rev = version; + sha256 = "10q5jfch5qzrj2w4fbkr086ank66plx8hp7ra9a01irj80pbk96d"; }; - hardeningDisable = [ "format" ]; + nativeBuildInputs = [ autoreconfHook pkgconfig ]; + + # Configure script checks for glib, but it is only used for tests. outputs = [ "out" "devdoc" ]; meta = with stdenv.lib; { - homepage = http://fribidi.org/; + homepage = https://github.com/fribidi/fribidi; description = "GNU implementation of the Unicode Bidirectional Algorithm (bidi)"; - license = licenses.gpl2; + license = licenses.lgpl21; platforms = platforms.unix; }; } From b29c78df662dcd4b2a4022603a5340f2da2c1a68 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Mon, 18 Dec 2017 16:17:50 +0000 Subject: [PATCH 35/40] gst_all_1.gst-vaapi: 1.12.3 -> 1.12.4 --- pkgs/development/libraries/gstreamer/vaapi/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/gstreamer/vaapi/default.nix b/pkgs/development/libraries/gstreamer/vaapi/default.nix index 2ccf3b2f6f6c..2033c07d9527 100644 --- a/pkgs/development/libraries/gstreamer/vaapi/default.nix +++ b/pkgs/development/libraries/gstreamer/vaapi/default.nix @@ -5,11 +5,11 @@ stdenv.mkDerivation rec { name = "gst-vaapi-${version}"; - version = "1.12.3"; + version = "1.12.4"; src = fetchurl { url = "${meta.homepage}/src/gstreamer-vaapi/gstreamer-vaapi-${version}.tar.xz"; - sha256 = "0kbl2c4zv004qwhm9mc0jlhz2pc3dqrng2vwj68a81lnzpcazkgl"; + sha256 = "1jg9nvc8000yi2bcl3wn2yh2hwl7yvlwldj6778w8c0z5qj7fb8w"; }; outputs = [ "out" "dev" ]; From 745be0cb61447c182bd6d1ee53faf159996d7075 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Mon, 18 Dec 2017 16:43:24 +0000 Subject: [PATCH 36/40] mpv: fix build with libva 2 --- pkgs/applications/video/mpv/default.nix | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkgs/applications/video/mpv/default.nix b/pkgs/applications/video/mpv/default.nix index 680cad1ec252..7aaa1b65fc45 100644 --- a/pkgs/applications/video/mpv/default.nix +++ b/pkgs/applications/video/mpv/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, fetchFromGitHub, makeWrapper +{ stdenv, fetchurl, fetchFromGitHub, fetchpatch, makeWrapper , docutils, perl, pkgconfig, python3, which, ffmpeg , freefont_ttf, freetype, libass, libpthreadstubs , lua, lua5_sockets, libuchardet, libiconv ? null, darwin @@ -90,7 +90,14 @@ in stdenv.mkDerivation rec { sha256 = "0746kmsg69675y5c70vn8imcr9d1zpjz97f27xr1vx00yjpd518v"; }; - patchPhase = '' + patches = [ + (fetchpatch { + url = "https://github.com/mpv-player/mpv/commit/2ecf240b1cd20875991a5b18efafbe799864ff7f.patch"; + sha256 = "1sr0770rvhsgz8d7ysr9qqp4g9gwdhgj8g3rgnz90wl49lgrykhb"; + }) + ]; + + postPatch = '' patchShebangs ./TOOLS/ ''; From 5b6c5964b088997d9600dd8b4f21033aefb5f067 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Mon, 18 Dec 2017 18:16:57 +0000 Subject: [PATCH 37/40] Revert "cairo: bugfix 1.14.10 -> 1.14.12" This reverts commit fc5756ea5e4a73624e0cfbb0e3eef247fc312547. It hangs in cairo_image_surface_create_from_png_stream consuming 100% CPU when png is malformed: https://github.com/NixOS/nixpkgs/commit/fc5756ea5e4a73624e0cfbb0e3eef247fc312547 --- pkgs/development/libraries/cairo/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/libraries/cairo/default.nix b/pkgs/development/libraries/cairo/default.nix index 5487d889ce69..7c0e36d40689 100644 --- a/pkgs/development/libraries/cairo/default.nix +++ b/pkgs/development/libraries/cairo/default.nix @@ -12,11 +12,11 @@ assert glSupport -> mesa_noglu != null; let inherit (stdenv.lib) optional optionals; in stdenv.mkDerivation rec { - name = "cairo-1.14.12"; + name = "cairo-1.14.10"; src = fetchurl { url = "http://cairographics.org/releases/${name}.tar.xz"; - sha256 = "05mzyxkvsfc1annjw2dja8vka01ampp9pp93lg09j8hba06g144c"; + sha256 = "02banr0wxckq62nbhc3mqidfdh2q956i2r7w2hd9bjgjb238g1vy"; }; patches = [ From 170a96481526b398fee4da83422fcc462057c647 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Tue, 19 Dec 2017 01:41:31 +0000 Subject: [PATCH 38/40] makeSetupHook: make the default name "hook" overridable for occasional convenience while looking at drv paths, such as in the output of nix-build and nix-diff. --- pkgs/build-support/trivial-builders.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/build-support/trivial-builders.nix b/pkgs/build-support/trivial-builders.nix index 7d44feb5ca65..9664abeb4651 100644 --- a/pkgs/build-support/trivial-builders.nix +++ b/pkgs/build-support/trivial-builders.nix @@ -95,8 +95,8 @@ rec { # Make a package that just contains a setup hook with the given contents. - makeSetupHook = { deps ? [], substitutions ? {} }: script: - runCommand "hook" substitutions + makeSetupHook = { name ? "hook", deps ? [], substitutions ? {} }: script: + runCommand name substitutions ('' mkdir -p $out/nix-support cp ${script} $out/nix-support/setup-hook From e2c8655405307bac689eaaf864b3504ac91cbc99 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Tue, 19 Dec 2017 01:45:42 +0000 Subject: [PATCH 39/40] ld-is-cc-hook: init This hook sets LD to CC, for use with software that works as if LD=$CC when LD is unset, and does not work when LD=ld. --- pkgs/build-support/setup-hooks/ld-is-cc-hook.sh | 5 +++++ pkgs/top-level/all-packages.nix | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 pkgs/build-support/setup-hooks/ld-is-cc-hook.sh diff --git a/pkgs/build-support/setup-hooks/ld-is-cc-hook.sh b/pkgs/build-support/setup-hooks/ld-is-cc-hook.sh new file mode 100644 index 000000000000..b53e184b0956 --- /dev/null +++ b/pkgs/build-support/setup-hooks/ld-is-cc-hook.sh @@ -0,0 +1,5 @@ +ld-is-cc-hook() { + LD=$CC +} + +preConfigureHooks+=(ld-is-cc-hook) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index c0ce9f7c98c7..0f2af1f92d42 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -287,6 +287,9 @@ with pkgs; inherit url; }; + ld-is-cc-hook = makeSetupHook { name = "ld-is-cc-hook"; } + ../build-support/setup-hooks/ld-is-cc-hook.sh; + libredirect = callPackage ../build-support/libredirect { }; madonctl = callPackage ../applications/misc/madonctl { }; From 69345ec37b8da3de94d4262b81bfa08000d35427 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Tue, 19 Dec 2017 01:56:47 +0000 Subject: [PATCH 40/40] perlPackages: use ld-is-cc-hook to fix build after #29396 removed `-L path/to/dir/of/libstdc++.so` from ld flags See https://github.com/NixOS/nixpkgs/pull/29396#issuecomment-352600129 Module::Build build helper works correctly when LD is unset (taking LD from Perl config to be `cc`). However, we can not unset LD because this goes contrary to the cross compilation effort, and we can not make it propagate ld-is-cc-hook because it breaks e.g. the build of `libguestfs`. However, #29396 makes LD=ld incompatible with just 3 perl packages; they are individually fixed by this commit. --- pkgs/top-level/perl-packages.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/top-level/perl-packages.nix b/pkgs/top-level/perl-packages.nix index 7b5f3519f2b6..d56b4a289a7c 100644 --- a/pkgs/top-level/perl-packages.nix +++ b/pkgs/top-level/perl-packages.nix @@ -4849,6 +4849,7 @@ let self = _self // overrides; _self = with self; { url = "mirror://cpan/authors/id/J/JG/JGMYERS/${name}.tar.gz"; sha256 = "834d893aa7db6ce3f158afbd0e432d6ed15a276e0940db0a74be13fd9c4bbbf1"; }; + nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; propagatedBuildInputs = [ ModuleBuild ]; meta = { description = "An Encode::Encoding subclass that detects the encoding of data"; @@ -5162,6 +5163,7 @@ let self = _self // overrides; _self = with self; { url = "mirror://cpan/modules/by-module/ExtUtils/${name}.tar.gz"; sha256 = "1a77hxf2pa8ia9na72rijv1yhpn2bjrdsybwk2dj2l938pl3xn0w"; }; + nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; propagatedBuildInputs = [ CaptureTiny ]; }; @@ -8488,6 +8490,7 @@ let self = _self // overrides; _self = with self; { url = "mirror://cpan/modules/by-module/Math/${name}.tar.gz"; sha256 = "0i9wzvig7ayijc9nvh5x5rryk1jrcj1hcvfmlcj449rnnxx24dav"; }; + nativeBuildInputs = [ pkgs.ld-is-cc-hook ]; propagatedBuildInputs = [ ModuleBuildWithXSpp ExtUtilsXSpp ExtUtilsTypemapsDefault TestDeep ]; };