mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-02-22 03:53:47 +00:00
gcc: factor out forceLibgccToBuildCrtStuff
This commit is contained in:
parent
383d62d94c
commit
92186a49bf
@ -3,7 +3,13 @@
|
||||
, enableMultilib
|
||||
}:
|
||||
|
||||
let
|
||||
forceLibgccToBuildCrtStuff =
|
||||
import ./libgcc-buildstuff.nix { inherit lib stdenv; };
|
||||
in
|
||||
|
||||
originalAttrs: (stdenv.mkDerivation (finalAttrs: originalAttrs // {
|
||||
passthru = (originalAttrs.passthru or {}) // { inherit forceLibgccToBuildCrtStuff; };
|
||||
preUnpack = ''
|
||||
oldOpts="$(shopt -po nounset)" || true
|
||||
set -euo pipefail
|
||||
|
37
pkgs/development/compilers/gcc/common/libgcc-buildstuff.nix
Normal file
37
pkgs/development/compilers/gcc/common/libgcc-buildstuff.nix
Normal file
@ -0,0 +1,37 @@
|
||||
{ lib
|
||||
, stdenv
|
||||
}:
|
||||
|
||||
# Trick to build a gcc that is capable of emitting shared libraries *without* having the
|
||||
# targetPlatform libc available beforehand. Taken from:
|
||||
# https://web.archive.org/web/20170222224855/http://frank.harvard.edu/~coldwell/toolchain/
|
||||
# https://web.archive.org/web/20170224235700/http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff
|
||||
let
|
||||
# crt{i,n}.o are the first and last (respectively) object file
|
||||
# linked when producing an executable. Traditionally these
|
||||
# files are delivered as part of the C library, but on GNU
|
||||
# systems they are in fact built by GCC. Since libgcc needs to
|
||||
# build before glibc, we can't wait for them to be copied by
|
||||
# glibc. At this early pre-glibc stage these files sometimes
|
||||
# have different names.
|
||||
crtstuff-ofiles =
|
||||
if stdenv.targetPlatform.isPower
|
||||
then "ecrti.o ecrtn.o ncrti.o ncrtn.o"
|
||||
else "crti.o crtn.o";
|
||||
|
||||
# Normally, `SHLIB_LC` is set to `-lc`, which means that
|
||||
# `libgcc_s.so` cannot be built until `libc.so` is available.
|
||||
# The assignment below clobbers this variable, removing the
|
||||
# `-lc`.
|
||||
#
|
||||
# On PowerPC we add `-mnewlib`, which means "libc has not been
|
||||
# built yet". This causes libgcc's Makefile to use the
|
||||
# gcc-built `{e,n}crt{n,i}.o` instead of failing to find the
|
||||
# versions which have been repackaged in libc as `crt{n,i}.o`
|
||||
#
|
||||
SHLIB_LC = lib.optionalString stdenv.targetPlatform.isPower "-mnewlib";
|
||||
|
||||
in ''
|
||||
echo 'libgcc.a: ${crtstuff-ofiles}' >> libgcc/Makefile.in
|
||||
echo 'SHLIB_LC=${SHLIB_LC}' >> libgcc/Makefile.in
|
||||
''
|
@ -44,14 +44,14 @@ lib.optional (lib.versionAtLeast version "11.0")
|
||||
!langJit &&
|
||||
!stdenv.hostPlatform.isDarwin &&
|
||||
enableShared
|
||||
;
|
||||
;
|
||||
|
||||
# For some reason libgcc_s.so has major-version "2" on m68k but
|
||||
# "1" everywhere else. Might be worth changing this to "*".
|
||||
libgcc_s-version-major =
|
||||
if targetPlatform.isM68k
|
||||
then "2"
|
||||
else "1";
|
||||
# For some reason libgcc_s.so has major-version "2" on m68k but
|
||||
# "1" everywhere else. Might be worth changing this to "*".
|
||||
libgcc_s-version-major =
|
||||
if targetPlatform.isM68k
|
||||
then "2"
|
||||
else "1";
|
||||
|
||||
in
|
||||
(pkg: pkg.overrideAttrs (previousAttrs: lib.optionalAttrs ((!langC) || langJit || enableLibGccOutput) {
|
||||
|
@ -112,39 +112,5 @@ in lib.optionalString (hostPlatform.isSunOS && hostPlatform.is64bit) ''
|
||||
export inhibit_libc=true
|
||||
''
|
||||
|
||||
# Trick to build a gcc that is capable of emitting shared libraries *without* having the
|
||||
# targetPlatform libc available beforehand. Taken from:
|
||||
# https://web.archive.org/web/20170222224855/http://frank.harvard.edu/~coldwell/toolchain/
|
||||
# https://web.archive.org/web/20170224235700/http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff
|
||||
+ lib.optionalString (targetPlatform != hostPlatform && withoutTargetLibc && enableShared)
|
||||
(let
|
||||
|
||||
# crt{i,n}.o are the first and last (respectively) object file
|
||||
# linked when producing an executable. Traditionally these
|
||||
# files are delivered as part of the C library, but on GNU
|
||||
# systems they are in fact built by GCC. Since libgcc needs to
|
||||
# build before glibc, we can't wait for them to be copied by
|
||||
# glibc. At this early pre-glibc stage these files sometimes
|
||||
# have different names.
|
||||
crtstuff-ofiles =
|
||||
if targetPlatform.isPower
|
||||
then "ecrti.o ecrtn.o ncrti.o ncrtn.o"
|
||||
else "crti.o crtn.o";
|
||||
|
||||
# Normally, `SHLIB_LC` is set to `-lc`, which means that
|
||||
# `libgcc_s.so` cannot be built until `libc.so` is available.
|
||||
# The assignment below clobbers this variable, removing the
|
||||
# `-lc`.
|
||||
#
|
||||
# On PowerPC we add `-mnewlib`, which means "libc has not been
|
||||
# built yet". This causes libgcc's Makefile to use the
|
||||
# gcc-built `{e,n}crt{n,i}.o` instead of failing to find the
|
||||
# versions which have been repackaged in libc as `crt{n,i}.o`
|
||||
#
|
||||
SHLIB_LC = lib.optionalString targetPlatform.isPower "-mnewlib";
|
||||
|
||||
in ''
|
||||
echo 'libgcc.a: ${crtstuff-ofiles}' >> libgcc/Makefile.in
|
||||
echo 'SHLIB_LC=${SHLIB_LC}' >> libgcc/Makefile.in
|
||||
'')
|
||||
|
||||
(import ./libgcc-buildstuff.nix { inherit lib stdenv; })
|
||||
|
Loading…
Reference in New Issue
Block a user