mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-29 09:04:17 +00:00
1f7186ab5c
Fixes build failure on `staging-next` introduced by commit c817efe6
("gcc: extend stripping of .a libraries and .o objects"):
...-bootstrap-stage3-stdenv-linux/setup: line 106: pushd: no other directory
Build failure happens because `libgccjit` has different `outputs` layout
compared to the rest of `gcc` derivations:
outputs = [ "out" "man" "info" ] ++ lib.optional (!langJit) "lib";
The change carves out `$lib` lib handling part to avoid `gcc` rebuild
in `staging-next`.
71 lines
2.1 KiB
Nix
71 lines
2.1 KiB
Nix
{ lib, stdenv, langJit }:
|
|
|
|
{
|
|
# 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:
|
|
#
|
|
# $out (host != target)
|
|
# `- bin: HOST
|
|
# lib/*.{a,o}: HOST
|
|
# `- gcc/<TARGET>/<VERSION>/*.{a,o}: TARGET
|
|
# `- plugin/: HOST
|
|
# `- lib{,32,64,x32}: symlink to lib or identical layout
|
|
# `- libexec/: HOST
|
|
# `- <TARGET>/: TARGET
|
|
#
|
|
# $out (host == target) has identical directory layout.
|
|
#
|
|
# $lib (host != target):
|
|
# `- <TARGET>/lib/*.{la,so}: TARGET
|
|
#
|
|
# $lib (host == target):
|
|
# `- lib/*.{la,so}: HOST
|
|
|
|
# The rest of stripDebugList{Host,Target} will be populated in
|
|
# postInstall to disambiguate lib/ object files.
|
|
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 outHostFiles=(
|
|
lib{,32,64}/*.{a,o,so*}
|
|
lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/plugin
|
|
)
|
|
local -ar outTargetFiles=(
|
|
lib{,32,64}/gcc/${stdenv.targetPlatform.config}/*/*.{a,o,so*}
|
|
)
|
|
popd
|
|
'' + lib.optionalString (!langJit) ''
|
|
${/*keep indentation*/ ""}
|
|
pushd $lib
|
|
local -ar libHostFiles=(
|
|
lib{,32,64}/*.{a,o,so*}
|
|
)
|
|
local -ar libTargetFiles=(
|
|
lib{,32,64}/${stdenv.targetPlatform.config}/*.{a,o,so*}
|
|
)
|
|
popd
|
|
|
|
'' + ''
|
|
eval "$oldOpts"
|
|
|
|
stripDebugList="$stripDebugList ''${outHostFiles[*]} ''${libHostFiles[*]}"
|
|
stripDebugListTarget="$stripDebugListTarget ''${outTargetFiles[*]} ''${libTargetFiles[*]}"
|
|
}
|
|
updateDebugListPaths
|
|
'';
|
|
}
|