From 1085403acdbaa7337d6074074f69ec6698226474 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 30 Jun 2020 15:04:10 +0000 Subject: [PATCH 1/2] {cc,bintools}-wrapper: Comments no longer spliced This means we can freely keep the comments up to date without the penalty of a mass rebuild. --- .../bintools-wrapper/default.nix | 73 ++++++------ pkgs/build-support/cc-wrapper/default.nix | 110 +++++++++--------- 2 files changed, 91 insertions(+), 92 deletions(-) diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix index 9e31ca6a8a21..31373d6b2392 100644 --- a/pkgs/build-support/bintools-wrapper/default.nix +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -132,15 +132,15 @@ stdenv.mkDerivation { ldPath="${bintools_bin}/bin" '' + # Solaris needs an additional ld wrapper. + 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). + '' - # Create a symlink to as (the assembler). if [ -e $ldPath/${targetPrefix}as ]; then ln -s $ldPath/${targetPrefix}as $out/bin/${targetPrefix}as fi @@ -200,26 +200,28 @@ stdenv.mkDerivation { ]; postFixup = + ## + ## General libc support + ## optionalString (libc != null) ('' - ## - ## General libc support - ## - echo "-L${libc_lib}${libc.libdir or "/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 - ## - + ## + ## 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 + # Expand globs to fill array of options + + '' dynamicLinker=($dynamicLinker) case ''${#dynamicLinker[@]} in @@ -241,45 +243,45 @@ stdenv.mkDerivation { 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). + '' + # 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 '') + # Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID. + optionalString stdenv.targetPlatform.isMacOS '' - # Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID. echo "-macosx_version_min 10.12 -sdk_version 10.12 -no_uuid" >> $out/nix-support/libc-ldflags-before '' - + optionalString (!nativeTools) '' - ## - ## User env support - ## + ## + ## User env support + ## - # Propagate the underling unwrapped bintools so that if you - # install the wrapper, you get tools like objdump (same for any - # binaries of libc). + # Propagate the underling unwrapped bintools so that if you + # install the wrapper, you get tools like objdump (same for any + # binaries of libc). + + optionalString (!nativeTools) '' printWords ${bintools_bin} ${if libc == null then "" else libc_bin} > $out/nix-support/propagated-user-env-packages '' + ## + ## Man page and info support + ## + optionalString propagateDoc ('' - ## - ## Man page and info support - ## - ln -s ${bintools.man} $man '' + optionalString (bintools ? info) '' ln -s ${bintools.info} $info '') - + '' - ## - ## Hardening support - ## + ## + ## Hardening support + ## - # some linkers on some platforms don't support specific -z flags + # 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" @@ -307,12 +309,11 @@ stdenv.mkDerivation { substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash - - ## - ## Extra custom steps - ## '' + ## + ## Extra custom steps + ## + extraBuildCommands; inherit dynamicLinker expand-response-params; diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index e23d1c6dd4e6..159324e0205e 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -154,16 +154,18 @@ stdenv.mkDerivation { ccPath="${cc}/bin" '') + # Create symlinks to everything in the bintools wrapper. + '' - # 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 - # version. + # We export environment variables pointing to the wrapped nonstandard + # cmds, lest some lousy configure script use those to guess compiler + # version. + + '' export named_cc=${targetPrefix}cc export named_cxx=${targetPrefix}c++ @@ -228,12 +230,12 @@ stdenv.mkDerivation { ]; postFixup = + # 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. '' - # 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 @@ -242,40 +244,40 @@ stdenv.mkDerivation { fi '' + ## + ## General Clang support + ## + optionalString isClang '' - ## - ## General Clang support - ## echo "-target ${targetPlatform.config}" >> $out/nix-support/cc-cflags '' + ## + ## GCC libs for non-GCC support + ## + optionalString (isClang && libcxx == null && cc ? gcc) '' - ## - ## GCC libs for non-GCC support - ## echo "-B${cc.gcc}/lib/gcc/${targetPlatform.config}/${cc.gcc.version}" >> $out/nix-support/cc-cflags echo "-L${cc.gcc}/lib/gcc/${targetPlatform.config}/${cc.gcc.version}" >> $out/nix-support/cc-ldflags echo "-L${cc.gcc.lib}/${targetPlatform.config}/lib" >> $out/nix-support/cc-ldflags '' - + optionalString (libc != null) ('' - ## - ## General libc support - ## + ## + ## General libc support + ## - # The "-B${libc_lib}/lib/" flag is a quick hack to force gcc to link - # against the crt1.o from our own glibc, rather than the one in - # /usr/lib. (This is only an issue when using an `impure' - # compiler/linker, i.e., one that searches /usr/lib and so on.) - # - # Unfortunately, setting -B appears to override the default search - # path. Thus, the gcc-specific "../includes-fixed" directory is - # now longer searched and glibc's header fails to - # 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. + # The "-B${libc_lib}/lib/" flag is a quick hack to force gcc to link + # against the crt1.o from our own glibc, rather than the one in + # /usr/lib. (This is only an issue when using an `impure' + # compiler/linker, i.e., one that searches /usr/lib and so on.) + # + # Unfortunately, setting -B appears to override the default search + # path. Thus, the gcc-specific "../includes-fixed" directory is + # now longer searched and glibc's header fails to + # 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. + + optionalString (libc != null) ('' echo "-B${libc_lib}${libc.libdir or "/lib/"}" >> $out/nix-support/libc-cflags '' + optionalString (!(cc.langD or false)) '' echo "-idirafter ${libc_dev}${libc.incdir or "/include"}" >> $out/nix-support/libc-cflags @@ -289,12 +291,9 @@ stdenv.mkDerivation { echo "${libc_dev}" > $out/nix-support/orig-libc-dev '') - + '' - ## - ## General libc++ support - ## - - '' + ## + ## General libc++ support + ## + optionalString (libcxx == null && cc ? gcc) '' for dir in ${cc.gcc}/include/c++/*; do echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags @@ -310,15 +309,15 @@ stdenv.mkDerivation { echo "-lc++abi" >> $out/nix-support/libcxx-ldflags '') - + optionalString (!nativeTools) '' - ## - ## Initial CFLAGS - ## + ## + ## Initial CFLAGS + ## - # GCC shows ${cc_solib}/lib in `gcc -print-search-dirs', but not - # ${cc_solib}/lib64 (even though it does actually search there...).. - # This confuses libtool. So add it to the compiler tool search - # path explicitly. + # GCC shows ${cc_solib}/lib in `gcc -print-search-dirs', but not + # ${cc_solib}/lib64 (even though it does actually search there...).. + # This confuses libtool. So add it to the compiler tool search + # path explicitly. + + optionalString (!nativeTools) '' if [ -e "${cc_solib}/lib64" -a ! -L "${cc_solib}/lib64" ]; then ccLDFlags+=" -L${cc_solib}/lib64" ccCFlags+=" -B${cc_solib}/lib64" @@ -337,22 +336,22 @@ stdenv.mkDerivation { echo "$ccCFlags" > $out/nix-support/cc-cflags '' + optionalString (targetPlatform.isDarwin && (libcxx != null) && (cc.isClang or false)) '' echo " -L${libcxx}/lib" >> $out/nix-support/cc-ldflags - '' + optionalString propagateDoc '' - ## - ## Man page and info support - ## + '' + ## + ## Man page and info support + ## + + optionalString propagateDoc '' ln -s ${cc.man} $man ln -s ${cc.info} $info '' + optionalString (cc.langD or false) '' echo "-B${zlib}${zlib.libdir or "/lib/"}" >> $out/nix-support/libc-cflags '' + ## + ## Hardening support + ## + '' - ## - ## Hardening support - ## - export hardening_unsupported_flags="${builtins.concatStringsSep " " (cc.hardeningUnsupportedFlags or [])}" '' @@ -427,12 +426,11 @@ stdenv.mkDerivation { substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash - - ## - ## Extra custom steps - ## '' + ## + ## Extra custom steps + ## + extraBuildCommands; inherit expand-response-params; From 704daf7a6e4e5f26c5b0ad67ed8bd1b2090aa8ed Mon Sep 17 00:00:00 2001 From: John Ericson Date: Tue, 30 Jun 2020 18:26:37 +0000 Subject: [PATCH 2/2] {bintools,cc}-wrapper: Ensure nix-support/*-flags files exist This will unbreak firefox and a few other packages which try to grab some of the libcxx flags. --- .../bintools-wrapper/default.nix | 25 +++++++++------- pkgs/build-support/cc-wrapper/default.nix | 29 +++++++++++++++---- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix index 31373d6b2392..786f0f9c5983 100644 --- a/pkgs/build-support/bintools-wrapper/default.nix +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -204,7 +204,8 @@ stdenv.mkDerivation { ## General libc support ## optionalString (libc != null) ('' - echo "-L${libc_lib}${libc.libdir or "/lib"}" > $out/nix-support/libc-ldflags + touch "$out/nix-support/libc-ldflags" + echo "-L${libc_lib}${libc.libdir or "/lib"}" >> $out/nix-support/libc-ldflags echo "${libc_lib}" > $out/nix-support/orig-libc echo "${libc_dev}" > $out/nix-support/orig-libc-dev @@ -230,25 +231,23 @@ stdenv.mkDerivation { *) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'." >&2;; esac - if [ -n "''${dynamicLinker:-}" ]; then + 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 '' + '' 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") + '' + # 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). + + '' + echo -dynamic-linker "$dynamicLinker" >> $out/nix-support/libc-ldflags-before '') + '' 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 '') # Ensure consistent LC_VERSION_MIN_MACOSX and remove LC_UUID. @@ -306,6 +305,10 @@ stdenv.mkDerivation { '' + '' + for flags in "$out/nix-support"/*flags*; do + substituteInPlace "$flags" --replace $'\n' ' ' + done + substituteAll ${./add-flags.sh} $out/nix-support/add-flags.sh substituteAll ${./add-hardening.sh} $out/nix-support/add-hardening.sh substituteAll ${../wrapper-common/utils.bash} $out/nix-support/utils.bash diff --git a/pkgs/build-support/cc-wrapper/default.nix b/pkgs/build-support/cc-wrapper/default.nix index 159324e0205e..1fef3c459086 100644 --- a/pkgs/build-support/cc-wrapper/default.nix +++ b/pkgs/build-support/cc-wrapper/default.nix @@ -230,12 +230,19 @@ stdenv.mkDerivation { ]; postFixup = + # Ensure flags files exists, as some other programs cat them. (That these + # are considered an exposed interface is a bit dubious, but fine for now.) + '' + touch "$out/nix-support/cc-cflags" + touch "$out/nix-support/cc-ldflags" + '' + # 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 @@ -278,6 +285,8 @@ stdenv.mkDerivation { # limits.h file in ../includes-fixed. To remedy the problem, # another -idirafter is necessary to add that directory again. + optionalString (libc != null) ('' + touch "$out/nix-support/libc-cflags" + touch "$out/nix-support/libc-ldflags" echo "-B${libc_lib}${libc.libdir or "/lib/"}" >> $out/nix-support/libc-cflags '' + optionalString (!(cc.langD or false)) '' echo "-idirafter ${libc_dev}${libc.incdir or "/include"}" >> $out/nix-support/libc-cflags @@ -294,7 +303,13 @@ stdenv.mkDerivation { ## ## General libc++ support ## - + optionalString (libcxx == null && cc ? gcc) '' + + # We have a libc++ directly, we have one via "smuggled" GCC, or we have one + # bundled with the C compiler because it is GCC + + optionalString (libcxx != null || cc.gcc.langCC or false || (isGNU && cc.langCC or false)) '' + touch "$out/nix-support/libcxx-cxxflags" + touch "$out/nix-support/libcxx-ldflags" + '' + optionalString (libcxx == null && cc ? gcc) '' for dir in ${cc.gcc}/include/c++/*; do echo "-isystem $dir" >> $out/nix-support/libcxx-cxxflags done @@ -326,14 +341,16 @@ stdenv.mkDerivation { ccCFlags+=" -B${cc_solib}/lib" '' + optionalString cc.langAda or false '' + touch "$out/nix-support/gnat-cflags" + touch "$out/nix-support/gnat-ldflags" basePath=$(echo $cc/lib/*/*/*) ccCFlags+=" -B$basePath -I$basePath/adainclude" gnatCFlags="-I$basePath/adainclude -I$basePath/adalib" - echo "$gnatCFlags" > $out/nix-support/gnat-cflags + echo "$gnatCFlags" >> $out/nix-support/gnat-cflags '' + '' - echo "$ccLDFlags" > $out/nix-support/cc-ldflags - echo "$ccCFlags" > $out/nix-support/cc-cflags + echo "$ccLDFlags" >> $out/nix-support/cc-ldflags + echo "$ccCFlags" >> $out/nix-support/cc-cflags '' + optionalString (targetPlatform.isDarwin && (libcxx != null) && (cc.isClang or false)) '' echo " -L${libcxx}/lib" >> $out/nix-support/cc-ldflags '' @@ -419,7 +436,7 @@ stdenv.mkDerivation { # There are a few tools (to name one libstdcxx5) which do not work # well with multi line flags, so make the flags single line again + '' - for flags in "$out/nix-support"/*flags; do + for flags in "$out/nix-support"/*flags*; do substituteInPlace "$flags" --replace $'\n' ' ' done