It is useful to make these dynamic and not bake them into gcc. This means we don’t have to rebuild gcc to change these values. Instead, we will pass cflags to gcc based on platform values. This was already done hackily for android gcc (which is multi-target), but not for our own gccs which are single target. To accomplish this, we need to add a few things: - add ‘arch’ to cpu - add NIX_CFLAGS_COMPILE_BEFORE flag (goes before args) - set -march everywhere - set mcpu, mfpu, mmode, and mtune based on targetPlatform.gcc flags cc-wrapper: only set -march when it is in the cpu type Some architectures don’t have a good mapping of -march. For instance POWER architecture doesn’t support the -march flag at all! https://gcc.gnu.org/onlinedocs/gcc/RS_002f6000-and-PowerPC-Options.html#RS_002f6000-and-PowerPC-Options
53 lines
1.8 KiB
Bash
53 lines
1.8 KiB
Bash
# N.B. It may be a surprise that the derivation-specific variables are exported,
|
|
# since this is just sourced by the wrapped binaries---the end consumers. This
|
|
# is because one wrapper binary may invoke another (e.g. cc invoking ld). In
|
|
# that case, it is cheaper/better to not repeat this step and let the forked
|
|
# wrapped binary just inherit the work of the forker's wrapper script.
|
|
|
|
var_templates_list=(
|
|
NIX+CFLAGS_COMPILE
|
|
NIX+CFLAGS_COMPILE_BEFORE
|
|
NIX+CFLAGS_LINK
|
|
NIX+CXXSTDLIB_COMPILE
|
|
NIX+CXXSTDLIB_LINK
|
|
)
|
|
var_templates_bool=(
|
|
NIX+ENFORCE_NO_NATIVE
|
|
)
|
|
|
|
accumulateRoles
|
|
|
|
# We need to mangle names for hygiene, but also take parameters/overrides
|
|
# from the environment.
|
|
for var in "${var_templates_list[@]}"; do
|
|
mangleVarList "$var" ${role_infixes[@]+"${role_infixes[@]}"}
|
|
done
|
|
for var in "${var_templates_bool[@]}"; do
|
|
mangleVarBool "$var" ${role_infixes[@]+"${role_infixes[@]}"}
|
|
done
|
|
|
|
# `-B@out@/bin' forces cc to use ld-wrapper.sh when calling ld.
|
|
NIX_@infixSalt@_CFLAGS_COMPILE="-B@out@/bin/ $NIX_@infixSalt@_CFLAGS_COMPILE"
|
|
|
|
# Export and assign separately in order that a failing $(..) will fail
|
|
# the script.
|
|
|
|
if [ -e @out@/nix-support/libc-cflags ]; then
|
|
NIX_@infixSalt@_CFLAGS_COMPILE="$(< @out@/nix-support/libc-cflags) $NIX_@infixSalt@_CFLAGS_COMPILE"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/cc-cflags ]; then
|
|
NIX_@infixSalt@_CFLAGS_COMPILE="$(< @out@/nix-support/cc-cflags) $NIX_@infixSalt@_CFLAGS_COMPILE"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/cc-ldflags ]; then
|
|
NIX_@infixSalt@_LDFLAGS+=" $(< @out@/nix-support/cc-ldflags)"
|
|
fi
|
|
|
|
if [ -e @out@/nix-support/cc-cflags-before ]; then
|
|
NIX_@infixSalt@_CFLAGS_COMPILE_BEFORE="$(< @out@/nix-support/cc-cflags-before) $NIX_@infixSalt@_CFLAGS_COMPILE_BEFORE"
|
|
fi
|
|
|
|
# That way forked processes will not extend these environment variables again.
|
|
export NIX_CC_WRAPPER_@infixSalt@_FLAGS_SET=1
|