diff --git a/pkgs/development/compilers/gcc/10/default.nix b/pkgs/development/compilers/gcc/10/default.nix index 1b9f542894e0..fed9194e7c1c 100644 --- a/pkgs/development/compilers/gcc/10/default.nix +++ b/pkgs/development/compilers/gcc/10/default.nix @@ -24,9 +24,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -86,7 +83,7 @@ let majorVersion = "10"; in stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -231,9 +228,11 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; - - installTargets = optional stripped "install-strip"; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -274,8 +273,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/11/default.nix b/pkgs/development/compilers/gcc/11/default.nix index 1dc9ed0a2679..e6b910a3edff 100644 --- a/pkgs/development/compilers/gcc/11/default.nix +++ b/pkgs/development/compilers/gcc/11/default.nix @@ -24,9 +24,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -92,7 +89,7 @@ let majorVersion = "11"; in stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -239,9 +236,11 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; - - installTargets = optional stripped "install-strip"; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -282,8 +281,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/12/default.nix b/pkgs/development/compilers/gcc/12/default.nix index 20bc9dcf44bb..f8eaf8f73437 100644 --- a/pkgs/development/compilers/gcc/12/default.nix +++ b/pkgs/development/compilers/gcc/12/default.nix @@ -24,9 +24,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -89,7 +86,7 @@ let majorVersion = "12"; in stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -234,9 +231,11 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; - - installTargets = optional stripped "install-strip"; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -277,8 +276,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/4.8/default.nix b/pkgs/development/compilers/gcc/4.8/default.nix index 8cd0d3c9ce80..bd42252c32f9 100644 --- a/pkgs/development/compilers/gcc/4.8/default.nix +++ b/pkgs/development/compilers/gcc/4.8/default.nix @@ -28,9 +28,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform == stdenv.buildPlatform - && stdenv.targetPlatform == stdenv.hostPlatform , gnused ? null , buildPackages }: @@ -124,7 +121,7 @@ in assert x11Support -> (filter (x: x == null) ([ gtk2 libart_lgpl ] ++ xlibs)) == []; stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -238,12 +235,14 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; doCheck = false; # requires a lot of tools, causes a dependency cycle for stdenv - installTargets = optional stripped "install-strip"; - # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -297,8 +296,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/4.9/default.nix b/pkgs/development/compilers/gcc/4.9/default.nix index 571d0b023124..0f1947c6364e 100644 --- a/pkgs/development/compilers/gcc/4.9/default.nix +++ b/pkgs/development/compilers/gcc/4.9/default.nix @@ -28,9 +28,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform == stdenv.buildPlatform - && stdenv.targetPlatform == stdenv.hostPlatform , gnused ? null , buildPackages }: @@ -140,7 +137,7 @@ in assert x11Support -> (filter (x: x == null) ([ gtk2 libart_lgpl ] ++ xlibs)) == []; stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -258,12 +255,14 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; doCheck = false; # requires a lot of tools, causes a dependency cycle for stdenv - installTargets = optional stripped "install-strip"; - # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -316,8 +315,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/6/default.nix b/pkgs/development/compilers/gcc/6/default.nix index 62b46df1ab00..a45b940a8611 100644 --- a/pkgs/development/compilers/gcc/6/default.nix +++ b/pkgs/development/compilers/gcc/6/default.nix @@ -31,9 +31,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -121,7 +118,7 @@ in assert x11Support -> (filter (x: x == null) ([ gtk2 libart_lgpl ] ++ xlibs)) == []; stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -270,12 +267,14 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; doCheck = false; # requires a lot of tools, causes a dependency cycle for stdenv - installTargets = optional stripped "install-strip"; - # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -328,8 +327,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/7/default.nix b/pkgs/development/compilers/gcc/7/default.nix index 1abf14c8a8c7..c9b09ce31c5e 100644 --- a/pkgs/development/compilers/gcc/7/default.nix +++ b/pkgs/development/compilers/gcc/7/default.nix @@ -21,9 +21,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -94,7 +91,7 @@ let majorVersion = "7"; in stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -237,12 +234,14 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; doCheck = false; # requires a lot of tools, causes a dependency cycle for stdenv - installTargets = optional stripped "install-strip"; - # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -282,8 +281,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/8/default.nix b/pkgs/development/compilers/gcc/8/default.nix index 2dd265b648ce..8109586cd3ec 100644 --- a/pkgs/development/compilers/gcc/8/default.nix +++ b/pkgs/development/compilers/gcc/8/default.nix @@ -21,9 +21,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -78,7 +75,7 @@ let majorVersion = "8"; in stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -218,9 +215,11 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; - - installTargets = optional stripped "install-strip"; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -261,8 +260,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/9/default.nix b/pkgs/development/compilers/gcc/9/default.nix index 30ae18e49173..12c67df68803 100644 --- a/pkgs/development/compilers/gcc/9/default.nix +++ b/pkgs/development/compilers/gcc/9/default.nix @@ -24,9 +24,6 @@ , libcCross ? null , threadsCross ? null # for MinGW , crossStageStatic ? false -, # Strip kills static libs of other archs (hence no cross) - stripped ? stdenv.hostPlatform.system == stdenv.buildPlatform.system - && stdenv.targetPlatform.system == stdenv.hostPlatform.system , gnused ? null , cloog # unused; just for compat with gcc4, as we override the parameter on some places , buildPackages @@ -89,7 +86,7 @@ let majorVersion = "9"; in stdenv.mkDerivation ({ - pname = "${crossNameAddon}${name}${if stripped then "" else "-debug"}"; + pname = "${crossNameAddon}${name}"; inherit version; builder = ../builder.sh; @@ -233,9 +230,11 @@ stdenv.mkDerivation ({ (targetPlatform == hostPlatform && hostPlatform == buildPlatform) (if profiledCompiler then "profiledbootstrap" else "bootstrap"); - dontStrip = !stripped; - - installTargets = optional stripped "install-strip"; + inherit + (import ../common/strip-attributes.nix { inherit stdenv; }) + stripDebugList + stripDebugListTarget + preFixup; # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; @@ -276,8 +275,7 @@ stdenv.mkDerivation ({ meta = { homepage = "https://gcc.gnu.org/"; license = lib.licenses.gpl3Plus; # runtime support libraries are typically LGPLv3+ - description = "GNU Compiler Collection, version ${version}" - + (if stripped then "" else " (with debugging info)"); + description = "GNU Compiler Collection, version ${version}"; longDescription = '' The GNU Compiler Collection includes compiler front ends for C, C++, diff --git a/pkgs/development/compilers/gcc/builder.sh b/pkgs/development/compilers/gcc/builder.sh index 9d0514f17590..89f3f562ee83 100644 --- a/pkgs/development/compilers/gcc/builder.sh +++ b/pkgs/development/compilers/gcc/builder.sh @@ -147,11 +147,6 @@ if test "$noSysDirs" = "1"; then fi fi -if [ -n "${targetConfig-}" ]; then - # if stripping gcc, include target directory too - stripDebugList="${stripDebugList-lib lib32 lib64 libexec bin sbin} $targetConfig" -fi - eval "$oldOpts" providedPreConfigure="$preConfigure"; diff --git a/pkgs/development/compilers/gcc/common/strip-attributes.nix b/pkgs/development/compilers/gcc/common/strip-attributes.nix new file mode 100644 index 000000000000..997c068cba62 --- /dev/null +++ b/pkgs/development/compilers/gcc/common/strip-attributes.nix @@ -0,0 +1,53 @@ +{ stdenv }: + +{ + # Note [Cross-compiler stripping] + # gcc requires delicate stripping as it installs ELF files for both + # HOST and TARGET platforms. It requires according strip tool otherwise + # strip could remove sections it's not aware of. + # Example ARM breakage by x86_64 strip: https://bugs.gentoo.org/697428 + # + # Let's recap the file layout for directories with object files for a + # cross-compiler (host != target): + # `- bin: HOST + # lib/*.{a,o}: HOST + # `- gcc///*.{a,o}: TARGET + # `- plugin/: HOST + # `- lib{,32,64,x32}: symlink to lib or identical layout + # `- libexec/: HOST + # `- /: TARGET + # + # (host == target) has identical directory layout. + + # The rest of stripDebugList{Host,Target} will be populated in + # postInstall. + stripDebugList = [ "bin" "libexec" ]; + stripDebugListTarget = [ stdenv.targetPlatform.config ]; + + preFixup = '' + # Populate most delicated lib/ part of stripDebugList{,Target} + updateDebugListPaths() { + local oldOpts + oldOpts="$(shopt -p nullglob)" || true + shopt -s nullglob + + pushd $out + + local -ar hostFiles=( + lib{,32,64}/*.{a.o} + lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/plugin + ) + local -ar targetFiles=( + lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/*.{a.o} + ) + + stripDebugList="$stripDebugList ''${hostFiles[*]}" + stripDebugListTarget="$stripDebugListTarget ''${targetFiles[*]}" + + popd + + eval "$oldOpts" + } + updateDebugListPaths + ''; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 480c5ab77043..45ab884f4234 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -12955,9 +12955,9 @@ with pkgs; clangMultiStdenv = overrideCC stdenv buildPackages.clang_multi; multiStdenv = if stdenv.cc.isClang then clangMultiStdenv else gccMultiStdenv; - gcc_debug = lowPrio (wrapCC (gcc.cc.override { - stripped = false; - })); + gcc_debug = lowPrio (wrapCC (gcc.cc.overrideAttrs (_: { + dontStrip = true; + }))); gccCrossLibcStdenv = overrideCC stdenv buildPackages.gccCrossStageStatic;