2021-01-22 18:25:31 +07:00
|
|
|
{
|
|
|
|
lib,
|
|
|
|
stdenv,
|
2019-11-10 15:58:19 -05:00
|
|
|
targetPackages,
|
2025-04-01 20:10:43 +02:00
|
|
|
|
2023-06-16 14:45:50 -07:00
|
|
|
withoutTargetLibc,
|
|
|
|
libcCross,
|
2022-11-06 19:53:50 +01:00
|
|
|
threadsCross,
|
2019-11-10 15:58:19 -05:00
|
|
|
version,
|
2025-04-01 20:10:43 +02:00
|
|
|
|
2024-08-29 21:50:47 -04:00
|
|
|
apple-sdk,
|
|
|
|
binutils,
|
|
|
|
gmp,
|
|
|
|
mpfr,
|
|
|
|
libmpc,
|
|
|
|
isl,
|
2025-04-01 20:10:43 +02:00
|
|
|
|
2019-11-10 16:11:57 -05:00
|
|
|
enableLTO,
|
2019-11-10 15:58:19 -05:00
|
|
|
enableMultilib,
|
2019-11-10 16:11:57 -05:00
|
|
|
enablePlugin,
|
2023-02-13 14:36:08 -08:00
|
|
|
disableGdbPlugin ? !enablePlugin,
|
2019-11-10 15:58:19 -05:00
|
|
|
enableShared,
|
2025-04-01 20:10:43 +02:00
|
|
|
|
2019-11-10 15:58:19 -05:00
|
|
|
langC,
|
|
|
|
langCC,
|
2019-09-20 12:05:57 +02:00
|
|
|
langD ? false,
|
2019-11-10 15:58:19 -05:00
|
|
|
langFortran,
|
2019-05-11 23:16:17 +02:00
|
|
|
langAda ? false,
|
2019-11-10 15:58:19 -05:00
|
|
|
langGo,
|
|
|
|
langObjC,
|
|
|
|
langObjCpp,
|
2020-05-05 22:26:01 -05:00
|
|
|
langJit,
|
2024-08-06 16:15:00 +02:00
|
|
|
langRust ? false,
|
2025-03-13 11:30:45 +01:00
|
|
|
disableBootstrap ? (!lib.systems.equals stdenv.targetPlatform stdenv.hostPlatform),
|
2019-11-10 15:58:19 -05:00
|
|
|
}:
|
|
|
|
|
2023-02-23 22:47:58 -08:00
|
|
|
assert !enablePlugin -> disableGdbPlugin;
|
2019-11-10 15:58:19 -05:00
|
|
|
|
2020-06-08 12:40:38 +08:00
|
|
|
# Note [Windows Exception Handling]
|
|
|
|
# sjlj (short jump long jump) exception handling makes no sense on x86_64,
|
|
|
|
# it's forcably slowing programs down as it produces a constant overhead.
|
|
|
|
# On x86_64 we have SEH (Structured Exception Handling) and we should use
|
|
|
|
# that. On i686, we do not have SEH, and have to use sjlj with dwarf2.
|
|
|
|
# Hence it's now conditional on x86_32 (i686 is 32bit).
|
|
|
|
#
|
|
|
|
# ref: https://stackoverflow.com/questions/15670169/what-is-difference-between-sjlj-vs-dwarf-vs-seh
|
|
|
|
|
2019-11-10 15:58:19 -05:00
|
|
|
let
|
|
|
|
inherit (stdenv)
|
2021-01-27 12:44:43 +07:00
|
|
|
buildPlatform
|
|
|
|
hostPlatform
|
|
|
|
targetPlatform
|
|
|
|
;
|
2019-11-10 15:58:19 -05:00
|
|
|
|
2023-04-07 13:50:35 -07:00
|
|
|
# See https://github.com/NixOS/nixpkgs/pull/209870#issuecomment-1500550903
|
2023-04-27 10:52:46 +03:00
|
|
|
disableBootstrap' = disableBootstrap && !langFortran && !langGo;
|
2023-04-07 13:50:35 -07:00
|
|
|
|
2025-03-13 11:30:45 +01:00
|
|
|
crossMingw = (!lib.systems.equals targetPlatform hostPlatform) && targetPlatform.isMinGW;
|
|
|
|
crossDarwin =
|
|
|
|
(!lib.systems.equals targetPlatform hostPlatform) && targetPlatform.libc == "libSystem";
|
2019-11-10 15:58:19 -05:00
|
|
|
|
2025-03-13 11:30:45 +01:00
|
|
|
targetPrefix = lib.optionalString (
|
|
|
|
!lib.systems.equals stdenv.targetPlatform stdenv.hostPlatform
|
2021-04-16 17:39:04 +02:00
|
|
|
) "${stdenv.targetPlatform.config}-";
|
|
|
|
|
2019-11-10 15:58:19 -05:00
|
|
|
crossConfigureFlags =
|
|
|
|
# Ensure that -print-prog-name is able to find the correct programs.
|
|
|
|
[
|
2023-01-19 21:40:06 +00:00
|
|
|
"--with-as=${
|
|
|
|
if targetPackages.stdenv.cc.bintools.isLLVM then binutils else targetPackages.stdenv.cc.bintools
|
|
|
|
}/bin/${targetPlatform.config}-as"
|
2019-11-10 15:58:19 -05:00
|
|
|
"--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld"
|
|
|
|
]
|
2023-06-16 14:45:50 -07:00
|
|
|
++ (
|
|
|
|
if withoutTargetLibc then
|
|
|
|
[
|
2019-11-10 15:58:19 -05:00
|
|
|
"--disable-libssp"
|
|
|
|
"--disable-nls"
|
|
|
|
"--without-headers"
|
|
|
|
"--disable-threads"
|
|
|
|
"--disable-libgomp"
|
|
|
|
"--disable-libquadmath"
|
2023-06-27 18:43:42 -07:00
|
|
|
(lib.enableFeature enableShared "shared")
|
2019-11-10 15:58:19 -05:00
|
|
|
"--disable-libatomic" # requires libc
|
|
|
|
"--disable-decimal-float" # requires libc
|
|
|
|
"--disable-libmpx" # requires libc
|
|
|
|
]
|
|
|
|
++ lib.optionals crossMingw [
|
2019-11-11 00:08:45 -05:00
|
|
|
"--with-headers=${lib.getDev libcCross}/include"
|
2019-11-10 15:58:19 -05:00
|
|
|
"--with-gcc"
|
|
|
|
"--with-gnu-as"
|
|
|
|
"--with-gnu-ld"
|
|
|
|
"--disable-debug"
|
|
|
|
"--disable-win32-registry"
|
2020-06-08 12:43:58 +08:00
|
|
|
"--enable-hash-synchronization"
|
|
|
|
"--enable-libssp"
|
|
|
|
"--disable-nls"
|
|
|
|
# To keep ABI compatibility with upstream mingw-w64
|
2020-10-26 15:19:52 +01:00
|
|
|
"--enable-fully-dynamic-string"
|
2020-06-05 23:34:38 -03:00
|
|
|
]
|
|
|
|
++ lib.optionals (crossMingw && targetPlatform.isx86_32) [
|
2020-06-08 12:40:38 +08:00
|
|
|
# See Note [Windows Exception Handling]
|
2020-06-05 23:34:38 -03:00
|
|
|
"--enable-sjlj-exceptions"
|
2020-06-08 12:40:38 +08:00
|
|
|
"--with-dwarf2"
|
2019-11-10 15:58:19 -05:00
|
|
|
]
|
|
|
|
else
|
|
|
|
[
|
|
|
|
(
|
|
|
|
if crossDarwin then
|
|
|
|
"--with-sysroot=${lib.getLib libcCross}/share/sysroot"
|
|
|
|
else
|
|
|
|
"--with-headers=${lib.getDev libcCross}${libcCross.incdir or "/include"}"
|
|
|
|
)
|
|
|
|
"--enable-__cxa_atexit"
|
|
|
|
"--enable-long-long"
|
|
|
|
"--enable-threads=${
|
|
|
|
if targetPlatform.isUnix then
|
|
|
|
"posix"
|
2022-11-06 19:53:50 +01:00
|
|
|
else if targetPlatform.isWindows then
|
|
|
|
(threadsCross.model or "win32")
|
2019-11-10 15:58:19 -05:00
|
|
|
else
|
|
|
|
"single"
|
|
|
|
}"
|
|
|
|
"--enable-nls"
|
|
|
|
]
|
|
|
|
++ lib.optionals (targetPlatform.libc == "uclibc" || targetPlatform.libc == "musl") [
|
|
|
|
# libsanitizer requires netrom/netrom.h which is not
|
|
|
|
# available in uclibc.
|
|
|
|
"--disable-libsanitizer"
|
2022-07-20 16:39:49 +08:00
|
|
|
]
|
|
|
|
++ lib.optional (
|
|
|
|
targetPlatform.libc == "newlib" || targetPlatform.libc == "newlib-nano"
|
|
|
|
) "--with-newlib"
|
2019-11-10 15:58:19 -05:00
|
|
|
++ lib.optional (targetPlatform.libc == "avrlibc") "--with-avrlibc"
|
|
|
|
);
|
|
|
|
|
|
|
|
configureFlags =
|
|
|
|
# Basic dependencies
|
|
|
|
[
|
|
|
|
"--with-gmp-include=${gmp.dev}/include"
|
|
|
|
"--with-gmp-lib=${gmp.out}/lib"
|
|
|
|
"--with-mpfr-include=${mpfr.dev}/include"
|
|
|
|
"--with-mpfr-lib=${mpfr.out}/lib"
|
|
|
|
"--with-mpc=${libmpc}"
|
|
|
|
]
|
2023-06-16 14:45:50 -07:00
|
|
|
++ lib.optionals (!withoutTargetLibc) [
|
2022-07-18 13:11:48 +01:00
|
|
|
(
|
|
|
|
if libcCross == null then
|
2024-08-29 21:50:47 -04:00
|
|
|
(
|
|
|
|
# GCC will search for the headers relative to SDKROOT on Darwin, so it will find them in the store.
|
|
|
|
if targetPlatform.isDarwin then
|
|
|
|
"--with-native-system-header-dir=/usr/include"
|
|
|
|
else
|
|
|
|
"--with-native-system-header-dir=${lib.getDev stdenv.cc.libc}/include"
|
|
|
|
)
|
2022-07-18 13:11:48 +01:00
|
|
|
else
|
|
|
|
"--with-native-system-header-dir=${lib.getDev libcCross}${libcCross.incdir or "/include"}"
|
|
|
|
)
|
|
|
|
# gcc builds for cross-compilers (build != host) or cross-built
|
|
|
|
# gcc (host != target) always apply the offset prefix to disentangle
|
|
|
|
# target headers from build or host headers:
|
|
|
|
# ${with_build_sysroot}${native_system_header_dir}
|
|
|
|
# or ${test_exec_prefix}/${target_noncanonical}/sys-include
|
|
|
|
# or ${with_sysroot}${native_system_header_dir}
|
|
|
|
# While native build (build == host == target) uses passed headers
|
|
|
|
# path as is:
|
2023-01-31 21:35:12 -08:00
|
|
|
# ${with_build_sysroot}${native_system_header_dir}
|
2022-07-18 13:11:48 +01:00
|
|
|
#
|
|
|
|
# Nixpkgs uses flat directory structure for both native and cross
|
|
|
|
# cases. As a result libc headers don't get found for cross case
|
|
|
|
# and many modern features get disabled (libssp is used instead of
|
|
|
|
# target-specific implementations and similar). More details at:
|
|
|
|
# https://github.com/NixOS/nixpkgs/pull/181802#issuecomment-1186822355
|
|
|
|
#
|
|
|
|
# We pick "/" path to effectively avoid sysroot offset and make it work
|
|
|
|
# as a native case.
|
2024-08-29 21:50:47 -04:00
|
|
|
# Darwin requires using the SDK as the sysroot for `SDKROOT` to work correctly.
|
|
|
|
"--with-build-sysroot=${if targetPlatform.isDarwin then apple-sdk.sdkroot else "/"}"
|
2023-06-29 09:11:55 +10:00
|
|
|
# Same with the stdlibc++ headers embedded in the gcc output
|
|
|
|
"--with-gxx-include-dir=${placeholder "out"}/include/c++/${version}/"
|
2022-07-18 13:11:48 +01:00
|
|
|
]
|
2019-11-10 15:58:19 -05:00
|
|
|
|
|
|
|
# Basic configuration
|
|
|
|
++ [
|
2021-04-16 17:39:04 +02:00
|
|
|
# Force target prefix. The behavior if `--target` and `--host`
|
|
|
|
# are specified is inconsistent: Sometimes specifying `--target`
|
|
|
|
# always causes a prefix to be generated, sometimes it's only
|
|
|
|
# added if the `--host` and `--target` differ. This means that
|
|
|
|
# sometimes there may be a prefix even though nixpkgs doesn't
|
|
|
|
# expect one and sometimes there may be none even though nixpkgs
|
|
|
|
# expects one (since not all information is serialized into the
|
|
|
|
# config attribute). The easiest way out of these problems is to
|
|
|
|
# always set the program prefix, so gcc will conform to our
|
|
|
|
# expectations.
|
|
|
|
"--program-prefix=${targetPrefix}"
|
|
|
|
|
2019-11-10 16:11:57 -05:00
|
|
|
(lib.enableFeature enableLTO "lto")
|
2019-11-10 15:58:19 -05:00
|
|
|
"--disable-libstdcxx-pch"
|
|
|
|
"--without-included-gettext"
|
|
|
|
"--with-system-zlib"
|
|
|
|
"--enable-static"
|
|
|
|
"--enable-languages=${
|
2021-08-28 11:18:03 -04:00
|
|
|
lib.concatStringsSep "," (
|
2019-11-10 15:58:19 -05:00
|
|
|
lib.optional langC "c"
|
|
|
|
++ lib.optional langCC "c++"
|
2019-09-20 12:05:57 +02:00
|
|
|
++ lib.optional langD "d"
|
2019-11-10 15:58:19 -05:00
|
|
|
++ lib.optional langFortran "fortran"
|
2019-05-11 23:16:17 +02:00
|
|
|
++ lib.optional langAda "ada"
|
2019-11-10 15:58:19 -05:00
|
|
|
++ lib.optional langGo "go"
|
|
|
|
++ lib.optional langObjC "objc"
|
|
|
|
++ lib.optional langObjCpp "obj-c++"
|
|
|
|
++ lib.optionals crossDarwin [
|
|
|
|
"objc"
|
|
|
|
"obj-c++"
|
|
|
|
]
|
2020-05-05 22:26:01 -05:00
|
|
|
++ lib.optional langJit "jit"
|
2024-08-06 16:15:00 +02:00
|
|
|
++ lib.optional langRust "rust"
|
2019-11-10 15:58:19 -05:00
|
|
|
)
|
|
|
|
}"
|
|
|
|
]
|
|
|
|
|
|
|
|
++ (
|
|
|
|
if (enableMultilib || targetPlatform.isAvr) then
|
|
|
|
[
|
|
|
|
"--enable-multilib"
|
|
|
|
"--disable-libquadmath"
|
|
|
|
]
|
|
|
|
else
|
|
|
|
[ "--disable-multilib" ]
|
|
|
|
)
|
|
|
|
++ lib.optional (!enableShared) "--disable-shared"
|
2023-02-13 14:36:08 -08:00
|
|
|
++ lib.singleton (lib.enableFeature enablePlugin "plugin")
|
|
|
|
# Libcc1 is the GCC cc1 plugin for the GDB debugger which is only used by gdb
|
|
|
|
++ lib.optional disableGdbPlugin "--disable-libcc1"
|
2019-11-10 15:58:19 -05:00
|
|
|
|
2021-08-16 19:42:10 -07:00
|
|
|
# Support -m32 on powerpc64le/be
|
2021-02-11 17:33:24 -08:00
|
|
|
++ lib.optional (targetPlatform.system == "powerpc64le-linux") "--enable-targets=powerpcle-linux"
|
2021-08-16 19:42:10 -07:00
|
|
|
++ lib.optional (targetPlatform.system == "powerpc64-linux") "--enable-targets=powerpc-linux"
|
|
|
|
|
|
|
|
# Fix "unknown long double size, cannot define BFP_FMT"
|
|
|
|
++ lib.optional (targetPlatform.isPower && targetPlatform.isMusl) "--disable-decimal-float"
|
2021-02-11 17:33:24 -08:00
|
|
|
|
2019-11-10 15:58:19 -05:00
|
|
|
# Optional features
|
|
|
|
++ lib.optional (isl != null) "--with-isl=${isl}"
|
|
|
|
|
2021-07-22 19:06:15 +02:00
|
|
|
# Ada options, gcc can't build the runtime library for a cross compiler
|
|
|
|
++ lib.optional langAda (
|
2025-03-13 11:30:45 +01:00
|
|
|
if lib.systems.equals hostPlatform targetPlatform then "--enable-libada" else "--disable-libada"
|
2021-07-22 19:06:15 +02:00
|
|
|
)
|
2019-05-11 23:16:17 +02:00
|
|
|
|
2023-04-08 12:55:40 -06:00
|
|
|
++ import ../common/platform-flags.nix {
|
|
|
|
inherit (stdenv) targetPlatform;
|
|
|
|
inherit lib;
|
|
|
|
}
|
2025-03-13 11:30:45 +01:00
|
|
|
++ lib.optionals (!lib.systems.equals targetPlatform hostPlatform) crossConfigureFlags
|
2023-04-07 13:50:35 -07:00
|
|
|
++ lib.optional disableBootstrap' "--disable-bootstrap"
|
2019-11-10 15:58:19 -05:00
|
|
|
|
|
|
|
# Platform-specific flags
|
2025-03-13 11:30:45 +01:00
|
|
|
++ lib.optional (
|
|
|
|
lib.systems.equals targetPlatform hostPlatform && targetPlatform.isx86_32
|
|
|
|
) "--with-arch=${stdenv.hostPlatform.parsed.cpu.name}"
|
2021-04-19 14:11:05 +00:00
|
|
|
++ lib.optional targetPlatform.isNetBSD "--disable-libssp" # Provided by libc.
|
2019-11-10 15:58:19 -05:00
|
|
|
++ lib.optionals hostPlatform.isSunOS [
|
|
|
|
"--enable-long-long"
|
|
|
|
"--enable-libssp"
|
|
|
|
"--enable-threads=posix"
|
|
|
|
"--disable-nls"
|
|
|
|
"--enable-__cxa_atexit"
|
|
|
|
# On Illumos/Solaris GNU as is preferred
|
|
|
|
"--with-gnu-as"
|
|
|
|
"--without-gnu-ld"
|
|
|
|
]
|
2021-02-12 20:38:38 +01:00
|
|
|
++
|
|
|
|
lib.optional (targetPlatform.libc == "musl")
|
|
|
|
# musl at least, disable: https://git.buildroot.net/buildroot/commit/?id=873d4019f7fb00f6a80592224236b3ba7d657865
|
|
|
|
"--disable-libmpx"
|
2025-03-13 11:30:45 +01:00
|
|
|
++ lib.optionals (lib.systems.equals targetPlatform hostPlatform && targetPlatform.libc == "musl") [
|
2019-11-10 15:58:19 -05:00
|
|
|
"--disable-libsanitizer"
|
|
|
|
"--disable-symvers"
|
|
|
|
"libat_cv_have_ifunc=no"
|
|
|
|
"--disable-gnu-indirect-function"
|
2020-10-26 15:19:52 +01:00
|
|
|
]
|
2020-05-24 10:03:22 +02:00
|
|
|
++ lib.optionals langJit [
|
|
|
|
"--enable-host-shared"
|
2020-10-26 15:19:52 +01:00
|
|
|
]
|
2019-09-20 12:05:57 +02:00
|
|
|
++ lib.optionals (langD) [
|
|
|
|
"--with-target-system-zlib=yes"
|
|
|
|
]
|
2023-06-14 19:40:25 +01:00
|
|
|
# On mips64-unknown-linux-gnu libsanitizer defines collide with
|
|
|
|
# glibc's definitions and fail the build. It was fixed in gcc-13+.
|
2023-08-23 14:31:45 -07:00
|
|
|
++
|
|
|
|
lib.optionals
|
|
|
|
(
|
|
|
|
targetPlatform.isMips
|
|
|
|
&& targetPlatform.parsed.abi.name == "gnu"
|
|
|
|
&& lib.versions.major version == "12"
|
|
|
|
)
|
|
|
|
[
|
2023-06-14 19:40:25 +01:00
|
|
|
"--disable-libsanitizer"
|
|
|
|
]
|
2023-12-20 11:33:55 +00:00
|
|
|
++ lib.optionals targetPlatform.isAlpha [
|
|
|
|
# Workaround build failures like:
|
|
|
|
# cc1: error: fp software completion requires '-mtrap-precision=i' [-Werror]
|
|
|
|
"--disable-werror"
|
2019-11-10 15:58:19 -05:00
|
|
|
];
|
|
|
|
|
|
|
|
in
|
|
|
|
configureFlags
|