mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-26 00:43:20 +00:00
build-support/cc-wrapper: pass in non-existent --sysroot= to untangle from libc
I would like to add an extra `gcc` build step during linux bootstrap (https://github.com/NixOS/nixpkgs/issues/208412). This makes it early bootstrap compiler linked and targeted against `bootstrapTools` `glibc` including it's headers. Without this change `gcc`'s spec files always prefer `bootstrapTools` `glibc` for header search path (passed in as --with-native-system-header-dir=). We'can't override it with: - `-I` option as it gets stacked before gcc-specific headers, we need to keep glibc headers after gcc as gcc cleans namespace up for C standard by using #include_next and by undefining system macros. - `-idirafter` option as it gets appended after existing `glibc`-includes This `--sysroot=/nix/store/does/not/exist` hack allows us to remove existing `glibc` headers and add new ones with `-idirafter`. We use `cc-cflags-before` instead of `libc-cflags` to allow user to define their own `--sysroot=` (like `firefox` does). To keep it working prerequisite cross-symlink in gcc.libs is required: https://github.com/NixOS/nixpkgs/pull/209153
This commit is contained in:
parent
3f305fab72
commit
8c80bd08b7
@ -331,11 +331,18 @@ stdenv.mkDerivation {
|
|||||||
# compile, because it uses "#include_next <limits.h>" to find the
|
# compile, because it uses "#include_next <limits.h>" to find the
|
||||||
# limits.h file in ../includes-fixed. To remedy the problem,
|
# limits.h file in ../includes-fixed. To remedy the problem,
|
||||||
# another -idirafter is necessary to add that directory again.
|
# another -idirafter is necessary to add that directory again.
|
||||||
|
#
|
||||||
|
# We use --sysroot=/nix/store/does/not/exist to drop embedded default
|
||||||
|
# path to glibc headers gcc was built against. Without it -idirafter
|
||||||
|
# only appends to the list and outdated glibc headers end up being
|
||||||
|
# used. 'cc-cflags-before' is used to allow user's --sysroot= option
|
||||||
|
# to override our default.
|
||||||
+ optionalString (libc != null) (''
|
+ optionalString (libc != null) (''
|
||||||
touch "$out/nix-support/libc-cflags"
|
touch "$out/nix-support/libc-cflags"
|
||||||
touch "$out/nix-support/libc-ldflags"
|
touch "$out/nix-support/libc-ldflags"
|
||||||
echo "-B${libc_lib}${libc.libdir or "/lib/"}" >> $out/nix-support/libc-crt1-cflags
|
echo "-B${libc_lib}${libc.libdir or "/lib/"}" >> $out/nix-support/libc-crt1-cflags
|
||||||
'' + optionalString (!(cc.langD or false)) ''
|
'' + optionalString (!(cc.langD or false)) ''
|
||||||
|
echo "--sysroot=/nix/store/does/not/exist" >> $out/nix-support/cc-cflags-before
|
||||||
echo "-idirafter ${libc_dev}${libc.incdir or "/include"}" >> $out/nix-support/libc-cflags
|
echo "-idirafter ${libc_dev}${libc.incdir or "/include"}" >> $out/nix-support/libc-cflags
|
||||||
'' + optionalString (isGNU && (!(cc.langD or false))) ''
|
'' + optionalString (isGNU && (!(cc.langD or false))) ''
|
||||||
for dir in "${cc}"/lib/gcc/*/*/include-fixed; do
|
for dir in "${cc}"/lib/gcc/*/*/include-fixed; do
|
||||||
|
Loading…
Reference in New Issue
Block a user