Merge pull request #31292 from bgamari/gcc-refactor

gcc: Refactor treatment of configure flags
This commit is contained in:
John Ericson 2017-11-15 11:26:32 -05:00 committed by GitHub
commit cbc346f1f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 1257 additions and 1210 deletions

View File

@ -67,55 +67,54 @@ let version = "4.5.4";
gccArch = stdenv.lib.attrByPath [ "gcc" "arch" ] null targetPlatform; gccArch = stdenv.lib.attrByPath [ "gcc" "arch" ] null targetPlatform;
gccCpu = stdenv.lib.attrByPath [ "gcc" "cpu" ] null targetPlatform; gccCpu = stdenv.lib.attrByPath [ "gcc" "cpu" ] null targetPlatform;
gccAbi = stdenv.lib.attrByPath [ "gcc" "abi" ] null targetPlatform; gccAbi = stdenv.lib.attrByPath [ "gcc" "abi" ] null targetPlatform;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
crossMingw = (targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"); crossMingw = (targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt");
crossConfigureFlags = crossConfigureFlags =
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libmudflap " + "--disable-threads"
" --disable-libgomp " + "--disable-libmudflap"
" --disable-shared" + "--disable-libgomp"
" --disable-decimal-float" # libdecnumber requires libc "--disable-shared"
else "--disable-decimal-float" # libdecnumber requires libc
" --with-headers=${libcCross}/include" + ] else [
" --enable-__cxa_atexit" + "--with-headers=${libcCross}/include"
" --enable-long-long" + "--enable-__cxa_atexit"
(if crossMingw then "--enable-long-long"
" --enable-threads=win32" + ] ++
" --enable-sjlj-exceptions" + (if crossMingw then [
" --enable-hash-synchronization" + "--enable-threads=win32"
" --enable-version-specific-runtime-libs" + "--enable-sjlj-exceptions"
" --disable-libssp" + "--enable-hash-synchronization"
" --disable-nls" + "--enable-version-specific-runtime-libs"
" --with-dwarf2" "--disable-libssp"
else "--disable-nls"
" --enable-threads=posix" + "--with-dwarf2"
" --enable-nls" + ] else [
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-threads=posix"
); "--enable-nls"
"--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else stageNameAddon = if crossStageStatic then "-stage-static" else
"-stage-final"; "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -241,28 +240,21 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if enableMultilib then "" else "--disable-multilib"} # Basic dependencies
${if enableShared then "" else "--disable-shared"} [
${if ppl != null then "--with-ppl=${ppl}" else ""} "--with-gmp=${gmp.dev}"
${if cloogppl != null then "--with-cloog=${cloogppl}" else ""} "--with-mpfr=${mpfr.dev}"
${if langJava then "--with-mpc=${libmpc}"
"--with-ecj-jar=${javaEcj} " + ] ++
optional (libelf != null) "--with-libelf=${libelf}" ++
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--disable-libstdcxx-pch"
else ""} "--without-included-gettext"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--with-system-zlib"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--enable-languages=${
--with-gmp=${gmp.dev}
--with-mpfr=${mpfr.dev}
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -272,13 +264,38 @@ stdenv.mkDerivation ({
++ optional langVhdl "vhdl" ++ optional langVhdl "vhdl"
) )
) )
} }"
${ # Trick that should be taken out once we have a mips64el-linux not loongson2f ] ++
if targetPlatform == hostPlatform && stdenv.system == "mips64el-linux" then "--with-arch=loongson2f" else ""} optional (!enableMultilib) "--disable-multilib" ++
${if langAda then " --enable-libada" else ""} optional (!enableShared) "--disable-shared" ++
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""}
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} # Optional features
"; optional (cloogppl != null) "--with-cloog=${cloogppl}" ++
optional (ppl != null) "--with-ppl=${ppl}" ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross-compilation
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
# Trick that should be taken out once we have a mips64el-linux not loongson2f
optional (targetPlatform == hostPlatform && stdenv.system == "mips64el-linux") "--with-arch=loongson2f"
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -295,21 +312,23 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, cross != null # If we are making a cross compiler, cross != null
NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc; NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc;
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if ppl != null then "--with-ppl=${ppl.crossDrv}" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if cloogppl != null then "--with-cloog=${cloogppl.crossDrv}" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional (ppl != null) "--with-ppl=${ppl.crossDrv}" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (cloogppl != null) "--with-cloog=${cloogppl.crossDrv}" ++
--with-gmp=${gmp.crossDrv}
--with-mpfr=${mpfr.crossDrv} [
--with-mpc=${libmpc.crossDrv} "--with-gmp=${gmp.crossDrv}"
--disable-libstdcxx-pch "--with-mpfr=${mpfr.crossDrv}"
--without-included-gettext "--with-mpc=${libmpc.crossDrv}"
--with-system-zlib "--disable-libstdcxx-pch"
--enable-languages=${ "--without-included-gettext"
"--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -317,13 +336,15 @@ stdenv.mkDerivation ({
++ optional langJava "java" ++ optional langJava "java"
++ optional langAda "ada" ++ optional langAda "ada"
++ optional langVhdl "vhdl" ++ optional langVhdl "vhdl"
++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${if targetplatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} optional langAda "--enable-libada" ++
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
''; optional (targetPlatform != hostPlatform) crossConfigureFlags
;
}; };

View File

@ -108,102 +108,81 @@ let version = "4.8.5";
javaAwtGtk = langJava && x11Support; javaAwtGtk = langJava && x11Support;
/* Platform flags */ /* Platform flags */
platformFlags = let mkPlatformFlags = platform: let
gccArch = stdenv.platform.gcc.arch or null; gccArch = platform.gcc.arch or null;
gccCpu = stdenv.platform.gcc.cpu or null; gccCpu = platform.gcc.cpu or null;
gccAbi = stdenv.platform.gcc.abi or null; gccAbi = platform.gcc.abi or null;
gccFpu = stdenv.platform.gcc.fpu or null; gccFpu = platform.gcc.fpu or null;
gccFloat = stdenv.platform.gcc.float or null; gccFloat = platform.gcc.float or null;
gccMode = stdenv.platform.gcc.mode or null; gccMode = platform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in in
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFpu + optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withFloat + optional (gccFloat != null) "--with-float=${gccFloat}" ++
withMode; optional (gccMode != null) "--with-mode=${gccMode}";
/* Cross-gcc settings */ /* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem";
crossConfigureFlags = let crossConfigureFlags =
gccArch = targetPlatform.gcc.arch or null; mkPlatformFlags targetPlatform ++
gccCpu = targetPlatform.gcc.cpu or null;
gccAbi = targetPlatform.gcc.abi or null;
gccFpu = targetPlatform.gcc.fpu or null;
gccFloat = targetPlatform.gcc.float or null;
gccMode = targetPlatform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libmudflap " + "--disable-threads"
" --disable-libgomp " + "--disable-libgomp"
" --disable-libquadmath" + "--disable-libquadmath"
" --disable-shared" + "--disable-shared"
" --disable-libatomic " + # libatomic requires libc "--disable-libatomic" # libatomic requires libc
" --disable-decimal-float" # libdecnumber requires libc "--disable-decimal-float" # libdecnumber requires libc
else ] else [
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot" (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
else " --with-headers=${libcCross.dev}/include") + else "--with-headers=${getDev libcCross}/include")
# Ensure that -print-prog-name is able to find the correct programs. "--enable-__cxa_atexit"
" --enable-__cxa_atexit" + "--enable-long-long"
" --enable-long-long" + ] ++
(if crossMingw then (if crossMingw then [
" --enable-threads=win32" + "--enable-threads=win32"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-hash-synchronization" + "--enable-hash-synchronization"
" --disable-libssp" + "--disable-libssp"
" --disable-nls" + "--disable-nls"
" --with-dwarf2" + "--with-dwarf2"
# I think noone uses shared gcc libs in mingw, so we better do the same. # I think noone uses shared gcc libs in mingw, so we better do the same.
# In any case, mingw32 g++ linking is broken by default with shared libs, # In any case, mingw32 g++ linking is broken by default with shared libs,
# unless adding "-lsupc++" to any linking command. I don't know why. # unless adding "-lsupc++" to any linking command. I don't know why.
" --disable-shared" + "--disable-shared"
# To keep ABI compatibility with upstream mingw-w64 # To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string" "--enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then ] else
optionals (targetPlatform.libc == "uclibc") [
# In uclibc cases, libgomp needs an additional '-ldl' # In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp. # and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") + "--disable-libgomp"
" --enable-threads=posix" + ] ++ [
" --enable-nls" + "--enable-threads=posix"
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-nls"
); "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -329,38 +308,25 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if hostPlatform.isSunOS then # Basic dependencies
" --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " + [
# On Illumos/Solaris GNU as is preferred "--with-gmp-include=${gmp.dev}/include"
" --with-gnu-as --without-gnu-ld " "--with-gmp-lib=${gmp.out}/lib"
else ""} "--with-mpfr-include=${mpfr.dev}/include"
--enable-lto "--with-mpfr-lib=${mpfr.out}/lib"
${if enableMultilib then "--disable-libquadmath" else "--disable-multilib"} "--with-mpc=${libmpc}"
${if enableShared then "" else "--disable-shared"} ] ++
${if enablePlugin then "--enable-plugin" else "--disable-plugin"} optional (libelf != null) "--with-libelf=${libelf}" ++
${optionalString (isl != null) "--with-isl=${isl}"}
${optionalString (cloog != null) "--with-cloog=${cloog} --disable-cloog-version-check --enable-cloog-backend=isl"}
${if langJava then
"--with-ecj-jar=${javaEcj} " +
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-lto"
else ""} "--disable-libstdcxx-pch"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--without-included-gettext"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--with-system-zlib"
--with-gmp-include=${gmp.dev}/include "--enable-static"
--with-gmp-lib=${gmp.out}/lib "--enable-languages=${
--with-mpfr-include=${mpfr.dev}/include
--with-mpfr-lib=${mpfr.out}/lib
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-static
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -374,18 +340,60 @@ stdenv.mkDerivation ({
++ optionals crossDarwin [ "objc" "obj-c++" ] ++ optionals crossDarwin [ "objc" "obj-c++" ]
) )
) )
} }"
${if targetPlatform == hostPlatform ] ++
then if hostPlatform.isDarwin
then " --with-native-system-header-dir=${darwin.usr-include}" # Optional features
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include" optional (isl != null) "--with-isl=${isl}" ++
else ""} optionals (cloog != null) [
${if langAda then " --enable-libada" else ""} "--with-cloog=${cloog}"
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} "--disable-cloog-version-check"
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} "--enable-cloog-backend=isl"
${if !bootstrap then "--disable-bootstrap" else ""} ] ++
${if targetPlatform == hostPlatform then platformFlags else ""}
"; (if enableMultilib
then ["--enable-multilib" "--disable-libquadmath"]
else ["--disable-multilib"]) ++
optional (!enableShared) "--disable-shared" ++
(if enablePlugin
then ["--enable-plugin"]
else ["--disable-plugin"]) ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross-compilation
optional (targetPlatform == hostPlatform) (
let incDir = if hostPlatform.isDarwin
then "${darwin.usr-include}"
else "${getDev stdenv.cc.libc}/include";
in "--with-native-system-header-dir=${incDir}"
) ++
optional (targetPlatform == hostPlatform) (mkPlatformFlags stdenv.platform) ++
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
optional (!bootstrap) "--disable-bootstrap" ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
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"
]
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -404,11 +412,6 @@ stdenv.mkDerivation ({
xgccAbi = targetPlatform.gcc.abi or null; xgccAbi = targetPlatform.gcc.abi or null;
xgccFpu = targetPlatform.gcc.fpu or null; xgccFpu = targetPlatform.gcc.fpu or null;
xgccFloat = targetPlatform.gcc.float or null; xgccFloat = targetPlatform.gcc.float or null;
xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
in { in {
AR = "${targetPlatform.config}-ar"; AR = "${targetPlatform.config}-ar";
LD = "${targetPlatform.config}-ld"; LD = "${targetPlatform.config}-ld";
@ -422,20 +425,21 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, cross != null # If we are making a cross compiler, cross != null
NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc; NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc;
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if cloog != null then "--with-cloog=${cloog.crossDrv} --enable-cloog-backend=isl" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (cloog != null) "--with-cloog=${cloog.crossDrv} --enable-cloog-backend=isl" ++
--with-gmp=${gmp.crossDrv} [
--with-mpfr=${mpfr.crossDrv} "--with-gmp=${gmp.crossDrv}"
--with-mpc=${libmpc.crossDrv} "--with-mpfr=${mpfr.crossDrv}"
--disable-libstdcxx-pch "--with-mpc=${libmpc.crossDrv}"
--without-included-gettext "--disable-libstdcxx-pch"
--with-system-zlib "--without-included-gettext"
--enable-languages=${ "--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -446,14 +450,15 @@ stdenv.mkDerivation ({
++ optional langGo "go" ++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${xwithArch} optional langAda "--enable-libada" ++
${xwithCpu} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithAbi} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithFpu} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFloat} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
''; optional (xgccFloat != null) "--with-float=${xgccFloat}"
;
buildFlags = ""; buildFlags = "";
}; };

View File

@ -99,103 +99,84 @@ let version = "4.9.4";
javaAwtGtk = langJava && x11Support; javaAwtGtk = langJava && x11Support;
/* Platform flags */ /* Platform flags */
platformFlags = let mkPlatformFlags = platform: let
gccArch = stdenv.platform.gcc.arch or null; gccArch = platform.gcc.arch or null;
gccCpu = stdenv.platform.gcc.cpu or null; gccCpu = platform.gcc.cpu or null;
gccAbi = stdenv.platform.gcc.abi or null; gccAbi = platform.gcc.abi or null;
gccFpu = stdenv.platform.gcc.fpu or null; gccFpu = platform.gcc.fpu or null;
gccFloat = stdenv.platform.gcc.float or null; gccFloat = platform.gcc.float or null;
gccMode = stdenv.platform.gcc.mode or null; gccMode = platform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in in
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFpu + optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withFloat + optional (gccFloat != null) "--with-float=${gccFloat}" ++
withMode; optional (gccMode != null) "--with-mode=${gccMode}";
/* Cross-gcc settings */ /* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem";
crossConfigureFlags = let crossConfigureFlags =
gccArch = targetPlatform.gcc.arch or null; mkPlatformFlags targetPlatform ++
gccCpu = targetPlatform.gcc.cpu or null;
gccAbi = targetPlatform.gcc.abi or null;
gccFpu = targetPlatform.gcc.fpu or null;
gccFloat = targetPlatform.gcc.float or null;
gccMode = targetPlatform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libgomp " + "--disable-threads"
" --disable-libquadmath" + "--disable-libgomp"
" --disable-shared" + "--disable-libquadmath"
" --disable-libatomic " + # libatomic requires libc "--disable-shared"
" --disable-decimal-float" # libdecnumber requires libc "--disable-libatomic" # libatomic requires libc
else "--disable-decimal-float" # libdecnumber requires libc
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot" ] else [
else " --with-headers=${libcCross.dev}/include") + (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
" --enable-__cxa_atexit" + else "--with-headers=${getDev libcCross}/include")
" --enable-long-long" + "--enable-__cxa_atexit"
(if crossMingw then "--enable-long-long"
" --enable-threads=win32" + ] ++
" --enable-sjlj-exceptions" + (if crossMingw then [
" --enable-hash-synchronization" + "--enable-threads=win32"
" --disable-libssp" + "--enable-sjlj-exceptions"
" --disable-nls" + "--enable-hash-synchronization"
" --with-dwarf2" + "--disable-libssp"
"--disable-nls"
"--with-dwarf2"
# I think noone uses shared gcc libs in mingw, so we better do the same. # I think noone uses shared gcc libs in mingw, so we better do the same.
# In any case, mingw32 g++ linking is broken by default with shared libs, # In any case, mingw32 g++ linking is broken by default with shared libs,
# unless adding "-lsupc++" to any linking command. I don't know why. # unless adding "-lsupc++" to any linking command. I don't know why.
" --disable-shared" + "--disable-shared"
# To keep ABI compatibility with upstream mingw-w64 # To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string" "--enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then ] else
optionals (targetPlatform.libc == "uclibc") [
# libsanitizer requires netrom/netrom.h which is not # libsanitizer requires netrom/netrom.h which is not
# available in uclibc. # available in uclibc.
" --disable-libsanitizer" + "--disable-libsanitizer"
# In uclibc cases, libgomp needs an additional '-ldl' # In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp. # and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") + "--disable-libgomp"
" --enable-threads=posix" + ] ++ [
" --enable-nls" + "--enable-threads=posix"
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-nls"
); "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -326,36 +307,24 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if hostPlatform.isSunOS then # Basic dependencies
" --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " + [
# On Illumos/Solaris GNU as is preferred "--with-gmp-include=${gmp.dev}/include"
" --with-gnu-as --without-gnu-ld " "--with-gmp-lib=${gmp.out}/lib"
else ""} "--with-mpfr=${mpfr.dev}"
--enable-lto "--with-mpc=${libmpc}"
${if enableMultilib then "--enable-multilib --disable-libquadmath" else "--disable-multilib"} ] ++
${if enableShared then "" else "--disable-shared"} optional (libelf != null) "--with-libelf=${libelf}" ++
${if enablePlugin then "--enable-plugin" else "--disable-plugin"}
${optionalString (isl != null) "--with-isl=${isl}"}
${optionalString (cloog != null) "--with-cloog=${cloog} --disable-cloog-version-check --enable-cloog-backend=isl"}
${if langJava then
"--with-ecj-jar=${javaEcj} " +
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-lto"
else ""} "--disable-libstdcxx-pch"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--without-included-gettext"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--with-system-zlib"
--with-gmp=${gmp.dev} "--enable-static"
--with-mpfr=${mpfr.dev} "--enable-languages=${
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-static
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -369,18 +338,60 @@ stdenv.mkDerivation ({
++ optionals crossDarwin [ "objc" "obj-c++" ] ++ optionals crossDarwin [ "objc" "obj-c++" ]
) )
) )
} }"
${if targetPlatform == hostPlatform ] ++
then if hostPlatform.isDarwin
then " --with-native-system-header-dir=${darwin.usr-include}" (if enableMultilib
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include" then ["--enable-multilib" "--disable-libquadmath"]
else ""} else ["--disable-multilib"]) ++
${if langAda then " --enable-libada" else ""} optional (!enableShared) "--disable-shared" ++
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} (if enablePlugin
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} then ["--enable-plugin"]
${if !bootstrap then "--disable-bootstrap" else ""} else ["--disable-plugin"]) ++
${if targetPlatform == hostPlatform then platformFlags else ""}
"; # Optional features
optional (isl != null) "--with-isl=${isl}" ++
optionals (cloog != null) [
"--with-cloog=${cloog}"
"--disable-cloog-version-check"
"--enable-cloog-backend=isl"
] ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross-compilation
optional (targetPlatform == hostPlatform) (
let incDir = if hostPlatform.isDarwin
then "${darwin.usr-include}"
else "${getDev stdenv.cc.libc}/include";
in "--with-native-system-header-dir=${incDir}"
) ++
optional (targetPlatform == hostPlatform) (mkPlatformFlags stdenv.platform) ++
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
optional (!bootstrap) "--disable-bootstrap" ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
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"
]
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -393,17 +404,13 @@ stdenv.mkDerivation ({
then "install-strip" then "install-strip"
else "install"; else "install";
/* For cross-built gcc (build != host == target) */
crossAttrs = let crossAttrs = let
xgccArch = targetPlatform.gcc.arch or null; xgccArch = targetPlatform.gcc.arch or null;
xgccCpu = targetPlatform.gcc.cpu or null; xgccCpu = targetPlatform.gcc.cpu or null;
xgccAbi = targetPlatform.gcc.abi or null; xgccAbi = targetPlatform.gcc.abi or null;
xgccFpu = targetPlatform.gcc.fpu or null; xgccFpu = targetPlatform.gcc.fpu or null;
xgccFloat = targetPlatform.gcc.float or null; xgccFloat = targetPlatform.gcc.float or null;
xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
in { in {
AR = "${targetPlatform.config}-ar"; AR = "${targetPlatform.config}-ar";
LD = "${targetPlatform.config}-ld"; LD = "${targetPlatform.config}-ld";
@ -417,20 +424,21 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, cross != null # If we are making a cross compiler, cross != null
NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc; NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc;
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if cloog != null then "--with-cloog=${cloog.crossDrv} --enable-cloog-backend=isl" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (cloog != null) "--with-cloog=${cloog.crossDrv}" "--enable-cloog-backend=isl" ++
--with-gmp=${gmp.crossDrv} [
--with-mpfr=${mpfr.crossDrv} "--with-gmp=${gmp.crossDrv}"
--with-mpc=${libmpc.crossDrv} "--with-mpfr=${mpfr.crossDrv}"
--disable-libstdcxx-pch "--with-mpc=${libmpc.crossDrv}"
--without-included-gettext "--disable-libstdcxx-pch"
--with-system-zlib "--without-included-gettext"
--enable-languages=${ "--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -441,14 +449,15 @@ stdenv.mkDerivation ({
++ optional langGo "go" ++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${xwithArch} optional langAda "--enable-libada" ++
${xwithCpu} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithAbi} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithFpu} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFloat} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
''; optional (xgccFloat != null) "--with-float=${xgccFloat}"
;
buildFlags = ""; buildFlags = "";
}; };

View File

@ -103,103 +103,84 @@ let version = "5.5.0";
javaAwtGtk = langJava && x11Support; javaAwtGtk = langJava && x11Support;
/* Platform flags */ /* Platform flags */
platformFlags = let mkPlatformFlags = platform: let
gccArch = stdenv.platform.gcc.arch or null; gccArch = platform.gcc.arch or null;
gccCpu = stdenv.platform.gcc.cpu or null; gccCpu = platform.gcc.cpu or null;
gccAbi = stdenv.platform.gcc.abi or null; gccAbi = platform.gcc.abi or null;
gccFpu = stdenv.platform.gcc.fpu or null; gccFpu = platform.gcc.fpu or null;
gccFloat = stdenv.platform.gcc.float or null; gccFloat = platform.gcc.float or null;
gccMode = stdenv.platform.gcc.mode or null; gccMode = platform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in in
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFpu + optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withFloat + optional (gccFloat != null) "--with-float=${gccFloat}" ++
withMode; optional (gccMode != null) "--with-mode=${gccMode}";
/* Cross-gcc settings */ /* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem";
crossConfigureFlags = let crossConfigureFlags =
gccArch = targetPlatform.gcc.arch or null; mkPlatformFlags targetPlatform ++
gccCpu = targetPlatform.gcc.cpu or null;
gccAbi = targetPlatform.gcc.abi or null;
gccFpu = targetPlatform.gcc.fpu or null;
gccFloat = targetPlatform.gcc.float or null;
gccMode = targetPlatform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libgomp " + "--disable-threads"
" --disable-libquadmath" + "--disable-libgomp"
" --disable-shared" + "--disable-libquadmath"
" --disable-libatomic " + # libatomic requires libc "--disable-shared"
" --disable-decimal-float" # libdecnumber requires libc "--disable-libatomic" # libatomic requires libc
else "--disable-decimal-float" # libdecnumber requires libc
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot" ] else [
else " --with-headers=${getDev libcCross}/include") + (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
" --enable-__cxa_atexit" + else "--with-headers=${getDev libcCross}/include")
" --enable-long-long" + "--enable-__cxa_atexit"
(if crossMingw then "--enable-long-long"
" --enable-threads=win32" + ] ++
" --enable-sjlj-exceptions" + (if crossMingw then [
" --enable-hash-synchronization" + "--enable-threads=win32"
" --disable-libssp" + "--enable-sjlj-exceptions"
" --disable-nls" + "--enable-hash-synchronization"
" --with-dwarf2" + "--disable-libssp"
"--disable-nls"
"--with-dwarf2"
# I think noone uses shared gcc libs in mingw, so we better do the same. # I think noone uses shared gcc libs in mingw, so we better do the same.
# In any case, mingw32 g++ linking is broken by default with shared libs, # In any case, mingw32 g++ linking is broken by default with shared libs,
# unless adding "-lsupc++" to any linking command. I don't know why. # unless adding "-lsupc++" to any linking command. I don't know why.
" --disable-shared" + "--disable-shared"
# To keep ABI compatibility with upstream mingw-w64 # To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string" "--enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then ] else
optionals (targetPlatform.libc == "uclibc") [
# libsanitizer requires netrom/netrom.h which is not # libsanitizer requires netrom/netrom.h which is not
# available in uclibc. # available in uclibc.
" --disable-libsanitizer" + "--disable-libsanitizer"
# In uclibc cases, libgomp needs an additional '-ldl' # In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp. # and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") + "--disable-libgomp"
" --enable-threads=posix" + ] ++ [
" --enable-nls" + "--enable-threads=posix"
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-nls"
); "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -340,37 +321,25 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if hostPlatform.isSunOS then # Basic dependencies
" --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " + [
# On Illumos/Solaris GNU as is preferred "--with-gmp-include=${gmp.dev}/include"
" --with-gnu-as --without-gnu-ld " "--with-gmp-lib=${gmp.out}/lib"
else ""} "--with-mpfr-include=${mpfr.dev}/include"
--enable-lto "--with-mpfr-lib=${mpfr.out}/lib"
${if enableMultilib then "--enable-multilib --disable-libquadmath" else "--disable-multilib"} "--with-mpc=${libmpc}"
${if enableShared then "" else "--disable-shared"} ] ++
${if enablePlugin then "--enable-plugin" else "--disable-plugin"} optional (libelf != null) "--with-libelf=${libelf}" ++
${optionalString (isl != null) "--with-isl=${isl}"}
${if langJava then
"--with-ecj-jar=${javaEcj} " +
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-lto"
else ""} "--disable-libstdcxx-pch"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--without-included-gettext"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--with-system-zlib"
--with-gmp-include=${gmp.dev}/include "--enable-static"
--with-gmp-lib=${gmp.out}/lib "--enable-languages=${
--with-mpfr-include=${mpfr.dev}/include
--with-mpfr-lib=${mpfr.out}/lib
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-static
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -384,18 +353,55 @@ stdenv.mkDerivation ({
++ optionals crossDarwin [ "objc" "obj-c++" ] ++ optionals crossDarwin [ "objc" "obj-c++" ]
) )
) )
} }"
${if targetPlatform == hostPlatform ] ++
then if hostPlatform.isDarwin
then " --with-native-system-header-dir=${darwin.usr-include}" # Optional features
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include" optional (isl != null) "--with-isl=${isl}" ++
else ""}
${if langAda then " --enable-libada" else ""} (if enableMultilib
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} then ["--enable-multilib" "--disable-libquadmath"]
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} else ["--disable-multilib"]) ++
${if !bootstrap then "--disable-bootstrap" else ""} optional (!enableShared) "--disable-shared" ++
${if targetPlatform == hostPlatform then platformFlags else ""} (if enablePlugin
"; then ["--enable-plugin"]
else ["--disable-plugin"]) ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross-compilation
optional (targetPlatform == hostPlatform) (
let incDir = if hostPlatform.isDarwin
then "${darwin.usr-include}"
else "${getDev stdenv.cc.libc}/include";
in "--with-native-system-header-dir=${incDir}"
) ++
optional (targetPlatform == hostPlatform) (mkPlatformFlags stdenv.platform) ++
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
optional (!bootstrap) "--disable-bootstrap" ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
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"
]
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -408,17 +414,13 @@ stdenv.mkDerivation ({
then "install-strip" then "install-strip"
else "install"; else "install";
/* For cross-built gcc (build != host == target) */
crossAttrs = let crossAttrs = let
xgccArch = targetPlatform.gcc.arch or null; xgccArch = targetPlatform.gcc.arch or null;
xgccCpu = targetPlatform.gcc.cpu or null; xgccCpu = targetPlatform.gcc.cpu or null;
xgccAbi = targetPlatform.gcc.abi or null; xgccAbi = targetPlatform.gcc.abi or null;
xgccFpu = targetPlatform.gcc.fpu or null; xgccFpu = targetPlatform.gcc.fpu or null;
xgccFloat = targetPlatform.gcc.float or null; xgccFloat = targetPlatform.gcc.float or null;
xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
in { in {
AR = "${targetPlatform.config}-ar"; AR = "${targetPlatform.config}-ar";
LD = "${targetPlatform.config}-ld"; LD = "${targetPlatform.config}-ld";
@ -432,19 +434,20 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, cross != null # If we are making a cross compiler, cross != null
NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc; NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc;
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
--with-gmp=${gmp.crossDrv} [
--with-mpfr=${mpfr.crossDrv} "--with-gmp=${gmp.crossDrv}"
--with-mpc=${libmpc.crossDrv} "--with-mpfr=${mpfr.crossDrv}"
--disable-libstdcxx-pch "--with-mpc=${libmpc.crossDrv}"
--without-included-gettext "--disable-libstdcxx-pch"
--with-system-zlib "--without-included-gettext"
--enable-languages=${ "--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -455,14 +458,15 @@ stdenv.mkDerivation ({
++ optional langGo "go" ++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${xwithArch} optional langAda "--enable-libada" ++
${xwithCpu} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithAbi} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithFpu} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFloat} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
''; optional (xgccFloat != null) "--with-float=${xgccFloat}"
;
buildFlags = ""; buildFlags = "";
}; };

View File

@ -100,103 +100,84 @@ let version = "6.4.0";
javaAwtGtk = langJava && x11Support; javaAwtGtk = langJava && x11Support;
/* Platform flags */ /* Platform flags */
platformFlags = let mkPlatformFlags = platform: let
gccArch = stdenv.platform.gcc.arch or null; gccArch = platform.gcc.arch or null;
gccCpu = stdenv.platform.gcc.cpu or null; gccCpu = platform.gcc.cpu or null;
gccAbi = stdenv.platform.gcc.abi or null; gccAbi = platform.gcc.abi or null;
gccFpu = stdenv.platform.gcc.fpu or null; gccFpu = platform.gcc.fpu or null;
gccFloat = stdenv.platform.gcc.float or null; gccFloat = platform.gcc.float or null;
gccMode = stdenv.platform.gcc.mode or null; gccMode = platform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in in
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFpu + optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withFloat + optional (gccFloat != null) "--with-float=${gccFloat}" ++
withMode; optional (gccMode != null) "--with-mode=${gccMode}";
/* Cross-gcc settings */ /* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem";
crossConfigureFlags = let crossConfigureFlags =
gccArch = targetPlatform.gcc.arch or null; mkPlatformFlags targetPlatform ++
gccCpu = targetPlatform.gcc.cpu or null;
gccAbi = targetPlatform.gcc.abi or null;
gccFpu = targetPlatform.gcc.fpu or null;
gccFloat = targetPlatform.gcc.float or null;
gccMode = targetPlatform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libgomp " + "--disable-threads"
" --disable-libquadmath" + "--disable-libgomp"
" --disable-shared" + "--disable-libquadmath"
" --disable-libatomic " + # libatomic requires libc "--disable-shared"
" --disable-decimal-float" # libdecnumber requires libc "--disable-libatomic" # libatomic requires libc
else "--disable-decimal-float" # libdecnumber requires libc
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot" ] else [
else " --with-headers=${getDev libcCross}/include") + (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
" --enable-__cxa_atexit" + else "--with-headers=${getDev libcCross}/include")
" --enable-long-long" + "--enable-__cxa_atexit"
(if crossMingw then "--enable-long-long"
" --enable-threads=win32" + ] ++
" --enable-sjlj-exceptions" + (if crossMingw then [
" --enable-hash-synchronization" + "--enable-threads=win32"
" --disable-libssp" + "--enable-sjlj-exceptions"
" --disable-nls" + "--enable-hash-synchronization"
" --with-dwarf2" + "--disable-libssp"
"--disable-nls"
"--with-dwarf2"
# I think noone uses shared gcc libs in mingw, so we better do the same. # I think noone uses shared gcc libs in mingw, so we better do the same.
# In any case, mingw32 g++ linking is broken by default with shared libs, # In any case, mingw32 g++ linking is broken by default with shared libs,
# unless adding "-lsupc++" to any linking command. I don't know why. # unless adding "-lsupc++" to any linking command. I don't know why.
" --disable-shared" + "--disable-shared"
# To keep ABI compatibility with upstream mingw-w64 # To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string" "--enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then ] else
optionals (targetPlatform.libc == "uclibc") [
# libsanitizer requires netrom/netrom.h which is not # libsanitizer requires netrom/netrom.h which is not
# available in uclibc. # available in uclibc.
" --disable-libsanitizer" + "--disable-libsanitizer"
# In uclibc cases, libgomp needs an additional '-ldl' # In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp. # and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") + "--disable-libgomp"
" --enable-threads=posix" + ] ++ [
" --enable-nls" + "--enable-threads=posix"
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-nls"
); "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -341,37 +322,25 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if hostPlatform.isSunOS then # Basic dependencies
" --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " + [
# On Illumos/Solaris GNU as is preferred "--with-gmp-include=${gmp.dev}/include"
" --with-gnu-as --without-gnu-ld " "--with-gmp-lib=${gmp.out}/lib"
else ""} "--with-mpfr-include=${mpfr.dev}/include"
--enable-lto "--with-mpfr-lib=${mpfr.out}/lib"
${if enableMultilib then "--enable-multilib --disable-libquadmath" else "--disable-multilib"} "--with-mpc=${libmpc}"
${if enableShared then "" else "--disable-shared"} ] ++
${if enablePlugin then "--enable-plugin" else "--disable-plugin"} optional (libelf != null) "--with-libelf=${libelf}" ++
${optionalString (isl != null) "--with-isl=${isl}"}
${if langJava then
"--with-ecj-jar=${javaEcj} " +
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-lto"
else ""} "--disable-libstdcxx-pch"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--without-included-gettext"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--with-system-zlib"
--with-gmp-include=${gmp.dev}/include "--enable-static"
--with-gmp-lib=${gmp.out}/lib "--enable-languages=${
--with-mpfr-include=${mpfr.dev}/include
--with-mpfr-lib=${mpfr.out}/lib
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-static
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -385,41 +354,72 @@ stdenv.mkDerivation ({
++ optionals crossDarwin [ "objc" "obj-c++" ] ++ optionals crossDarwin [ "objc" "obj-c++" ]
) )
) )
} }"
${if targetPlatform == hostPlatform ] ++
then if hostPlatform.isDarwin
then " --with-native-system-header-dir=${darwin.usr-include}" (if enableMultilib
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include" then ["--enable-multilib" "--disable-libquadmath"]
else ""} else ["--disable-multilib"]) ++
${if langAda then " --enable-libada" else ""} optional (!enableShared) "--disable-shared" ++
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} (if enablePlugin
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} then ["--enable-plugin"]
${if !bootstrap then "--disable-bootstrap" else ""} else ["--disable-plugin"]) ++
${if targetPlatform == hostPlatform then platformFlags else ""}
"; # Optional features
optional (isl != null) "--with-isl=${isl}" ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross compilation
optional (targetPlatform == hostPlatform) (
let incDir = if hostPlatform.isDarwin
then "${darwin.usr-include}"
else "${getDev stdenv.cc.libc}/include";
in "--with-native-system-header-dir=${incDir}"
) ++
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
optional (!bootstrap) "--disable-bootstrap" ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
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"
]
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
buildFlags = if bootstrap then buildFlags =
(if profiledCompiler then "profiledbootstrap" else "bootstrap") optional bootstrap (if profiledCompiler then "profiledbootstrap" else "bootstrap");
else "";
installTargets = installTargets =
if stripped if stripped
then "install-strip" then "install-strip"
else "install"; else "install";
/* For cross-built gcc (build != host == target) */
crossAttrs = let crossAttrs = let
xgccArch = targetPlatform.gcc.arch or null; xgccArch = targetPlatform.gcc.arch or null;
xgccCpu = targetPlatform.gcc.cpu or null; xgccCpu = targetPlatform.gcc.cpu or null;
xgccAbi = targetPlatform.gcc.abi or null; xgccAbi = targetPlatform.gcc.abi or null;
xgccFpu = targetPlatform.gcc.fpu or null; xgccFpu = targetPlatform.gcc.fpu or null;
xgccFloat = targetPlatform.gcc.float or null; xgccFloat = targetPlatform.gcc.float or null;
xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
in { in {
AR = "${targetPlatform.config}-ar"; AR = "${targetPlatform.config}-ar";
LD = "${targetPlatform.config}-ld"; LD = "${targetPlatform.config}-ld";
@ -433,19 +433,20 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, cross != null # If we are making a cross compiler, cross != null
NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc; NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc;
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
--with-gmp=${gmp.crossDrv} [
--with-mpfr=${mpfr.crossDrv} "--with-gmp=${gmp.crossDrv}"
--with-mpc=${libmpc.crossDrv} "--with-mpfr=${mpfr.crossDrv}"
--disable-libstdcxx-pch "--with-mpc=${libmpc.crossDrv}"
--without-included-gettext "--disable-libstdcxx-pch"
--with-system-zlib "--without-included-gettext"
--enable-languages=${ "--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -456,14 +457,15 @@ stdenv.mkDerivation ({
++ optional langGo "go" ++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${xwithArch} optional langAda "--enable-libada" ++
${xwithCpu} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithAbi} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithFpu} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFloat} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
''; optional (xgccFloat != null) "--with-float=${xgccFloat}"
;
buildFlags = ""; buildFlags = "";
}; };

View File

@ -98,104 +98,84 @@ let version = "7.2.0";
javaAwtGtk = langJava && x11Support; javaAwtGtk = langJava && x11Support;
/* Platform flags */ /* Platform flags */
platformFlags = let mkPlatformFlags = platform: let
gccArch = stdenv.platform.gcc.arch or null; gccArch = platform.gcc.arch or null;
gccCpu = stdenv.platform.gcc.cpu or null; gccCpu = platform.gcc.cpu or null;
gccAbi = stdenv.platform.gcc.abi or null; gccAbi = platform.gcc.abi or null;
gccFpu = stdenv.platform.gcc.fpu or null; gccFpu = platform.gcc.fpu or null;
gccFloat = stdenv.platform.gcc.float or null; gccFloat = platform.gcc.float or null;
gccMode = stdenv.platform.gcc.mode or null; gccMode = platform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in in
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFpu + optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withFloat + optional (gccFloat != null) "--with-float=${gccFloat}" ++
withMode; optional (gccMode != null) "--with-mode=${gccMode}";
/* Cross-gcc settings */ /* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem";
crossConfigureFlags = let crossConfigureFlags =
gccArch = targetPlatform.gcc.arch or null; mkPlatformFlags targetPlatform ++
gccCpu = targetPlatform.gcc.cpu or null;
gccAbi = targetPlatform.gcc.abi or null;
gccFpu = targetPlatform.gcc.fpu or null;
gccFloat = targetPlatform.gcc.float or null;
gccMode = targetPlatform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libgomp " + "--disable-threads"
" --disable-libquadmath" + "--disable-libgomp"
" --disable-shared" + "--disable-libquadmath"
" --disable-libatomic " + # libatomic requires libc "--disable-shared"
" --disable-decimal-float" # libdecnumber requires libc "--disable-libatomic" # libatomic requires libc
else "--disable-decimal-float" # libdecnumber requires libc
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot" ] else [
else " --with-headers=${getDev libcCross}/include") + (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
# Ensure that -print-prog-name is able to find the correct programs. else "--with-headers=${getDev libcCross}/include")
" --enable-__cxa_atexit" + "--enable-__cxa_atexit"
" --enable-long-long" + "--enable-long-long"
(if crossMingw then ] ++
" --enable-threads=win32" + (if crossMingw then [
" --enable-sjlj-exceptions" + "--enable-threads=win32"
" --enable-hash-synchronization" + "--enable-sjlj-exceptions"
" --disable-libssp" + "--enable-hash-synchronization"
" --disable-nls" + "--disable-libssp"
" --with-dwarf2" + "--disable-nls"
"--with-dwarf2"
# I think noone uses shared gcc libs in mingw, so we better do the same. # I think noone uses shared gcc libs in mingw, so we better do the same.
# In any case, mingw32 g++ linking is broken by default with shared libs, # In any case, mingw32 g++ linking is broken by default with shared libs,
# unless adding "-lsupc++" to any linking command. I don't know why. # unless adding "-lsupc++" to any linking command. I don't know why.
" --disable-shared" + "--disable-shared"
# To keep ABI compatibility with upstream mingw-w64 # To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string" "--enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then ] else
optionals (targetPlatform.libc == "uclibc") [
# libsanitizer requires netrom/netrom.h which is not # libsanitizer requires netrom/netrom.h which is not
# available in uclibc. # available in uclibc.
" --disable-libsanitizer" + "--disable-libsanitizer"
# In uclibc cases, libgomp needs an additional '-ldl' # In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp. # and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") + "--disable-libgomp"
" --enable-threads=posix" + ] ++ [
" --enable-nls" + "--enable-threads=posix"
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-nls"
); "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -335,37 +315,25 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if hostPlatform.isSunOS then # Basic dependencies
" --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " + [
# On Illumos/Solaris GNU as is preferred "--with-gmp-include=${gmp.dev}/include"
" --with-gnu-as --without-gnu-ld " "--with-gmp-lib=${gmp.out}/lib"
else ""} "--with-mpfr-include=${mpfr.dev}/include"
--enable-lto "--with-mpfr-lib=${mpfr.out}/lib"
${if enableMultilib then "--enable-multilib --disable-libquadmath" else "--disable-multilib"} "--with-mpc=${libmpc}"
${if enableShared then "" else "--disable-shared"} ] ++
${if enablePlugin then "--enable-plugin" else "--disable-plugin"} optional (libelf != null) "--with-libelf=${libelf}" ++
${optionalString (isl != null) "--with-isl=${isl}"}
${if langJava then
"--with-ecj-jar=${javaEcj} " +
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-lto"
else ""} "--disable-libstdcxx-pch"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--without-included-gettext"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--with-system-zlib"
--with-gmp-include=${gmp.dev}/include "--enable-static"
--with-gmp-lib=${gmp.out}/lib "--enable-languages=${
--with-mpfr-include=${mpfr.dev}/include
--with-mpfr-lib=${mpfr.out}/lib
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-static
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -379,18 +347,55 @@ stdenv.mkDerivation ({
++ optionals crossDarwin [ "objc" "obj-c++" ] ++ optionals crossDarwin [ "objc" "obj-c++" ]
) )
) )
} }"
${if targetPlatform == hostPlatform ] ++
then if hostPlatform.isDarwin
then " --with-native-system-header-dir=${darwin.usr-include}" (if enableMultilib
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include" then ["--enable-multilib" "--disable-libquadmath"]
else ""} else ["--disable-multilib"]) ++
${if langAda then " --enable-libada" else ""} optional (!enableShared) "--disable-shared" ++
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} (if enablePlugin
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} then ["--enable-plugin"]
${if !bootstrap then "--disable-bootstrap" else ""} else ["--disable-plugin"]) ++
${if targetPlatform == hostPlatform then platformFlags else ""}
"; # Optional features
optional (isl != null) "--with-isl=${isl}" ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross-compilation
optional (targetPlatform == hostPlatform) (
let incDir = if hostPlatform.isDarwin
then "${darwin.usr-include}"
else "${getDev stdenv.cc.libc}/include";
in "--with-native-system-header-dir=${incDir}"
) ++
optional (targetPlatform == hostPlatform) (mkPlatformFlags stdenv.platform) ++
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
optional (!bootstrap) "--disable-bootstrap" ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
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"
]
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -403,17 +408,13 @@ stdenv.mkDerivation ({
then "install-strip" then "install-strip"
else "install"; else "install";
/* For cross-built gcc (build != host == target) */
crossAttrs = let crossAttrs = let
xgccArch = targetPlatform.gcc.arch or null; xgccArch = targetPlatform.gcc.arch or null;
xgccCpu = targetPlatform.gcc.cpu or null; xgccCpu = targetPlatform.gcc.cpu or null;
xgccAbi = targetPlatform.gcc.abi or null; xgccAbi = targetPlatform.gcc.abi or null;
xgccFpu = targetPlatform.gcc.fpu or null; xgccFpu = targetPlatform.gcc.fpu or null;
xgccFloat = targetPlatform.gcc.float or null; xgccFloat = targetPlatform.gcc.float or null;
xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
in { in {
AR = "${targetPlatform.config}-ar"; AR = "${targetPlatform.config}-ar";
LD = "${targetPlatform.config}-ld"; LD = "${targetPlatform.config}-ld";
@ -427,19 +428,20 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, targetPlatform != hostPlatform # If we are making a cross compiler, targetPlatform != hostPlatform
NIX_CC_CROSS = if targetPlatform == hostPlatform then "${stdenv.ccCross}" else ""; NIX_CC_CROSS = if targetPlatform == hostPlatform then "${stdenv.ccCross}" else "";
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
--with-gmp=${gmp.crossDrv} [
--with-mpfr=${mpfr.crossDrv} "--with-gmp=${gmp.crossDrv}"
--with-mpc=${libmpc.crossDrv} "--with-mpfr=${mpfr.crossDrv}"
--disable-libstdcxx-pch "--with-mpc=${libmpc.crossDrv}"
--without-included-gettext "--disable-libstdcxx-pch"
--with-system-zlib "--without-included-gettext"
--enable-languages=${ "--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -450,14 +452,15 @@ stdenv.mkDerivation ({
++ optional langGo "go" ++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${xwithArch} optional langAda "--enable-libada" ++
${xwithCpu} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithAbi} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithFpu} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFloat} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
''; optional (xgccFloat != null) "--with-float=${xgccFloat}"
;
buildFlags = ""; buildFlags = "";
}; };

View File

@ -98,104 +98,84 @@ let version = "7-20170409";
javaAwtGtk = langJava && x11Support; javaAwtGtk = langJava && x11Support;
/* Platform flags */ /* Platform flags */
platformFlags = let mkPlatformFlags = platform: let
gccArch = stdenv.platform.gcc.arch or null; gccArch = platform.gcc.arch or null;
gccCpu = stdenv.platform.gcc.cpu or null; gccCpu = platform.gcc.cpu or null;
gccAbi = stdenv.platform.gcc.abi or null; gccAbi = platform.gcc.abi or null;
gccFpu = stdenv.platform.gcc.fpu or null; gccFpu = platform.gcc.fpu or null;
gccFloat = stdenv.platform.gcc.float or null; gccFloat = platform.gcc.float or null;
gccMode = stdenv.platform.gcc.mode or null; gccMode = platform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in in
withArch + optional (gccArch != null) "--with-arch=${gccArch}" ++
withCpu + optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withAbi + optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFpu + optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withFloat + optional (gccFloat != null) "--with-float=${gccFloat}" ++
withMode; optional (gccMode != null) "--with-mode=${gccMode}";
/* Cross-gcc settings */ /* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem";
crossConfigureFlags = let crossConfigureFlags =
gccArch = targetPlatform.gcc.arch or null; mkPlatformFlags targetPlatform ++
gccCpu = targetPlatform.gcc.cpu or null;
gccAbi = targetPlatform.gcc.abi or null;
gccFpu = targetPlatform.gcc.fpu or null;
gccFloat = targetPlatform.gcc.float or null;
gccMode = targetPlatform.gcc.mode or null;
withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
in
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode +
# Ensure that -print-prog-name is able to find the correct programs. # Ensure that -print-prog-name is able to find the correct programs.
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
(if crossMingw && crossStageStatic then (if crossMingw && crossStageStatic then [
" --with-headers=${libcCross}/include" + "--with-headers=${libcCross}/include"
" --with-gcc" + "--with-gcc"
" --with-gnu-as" + "--with-gnu-as"
" --with-gnu-ld" + "--with-gnu-ld"
" --with-gnu-ld" + "--with-gnu-ld"
" --disable-shared" + "--disable-shared"
" --disable-nls" + "--disable-nls"
" --disable-debug" + "--disable-debug"
" --enable-sjlj-exceptions" + "--enable-sjlj-exceptions"
" --enable-threads=win32" + "--enable-threads=win32"
" --disable-win32-registry" "--disable-win32-registry"
else if crossStageStatic then ] else if crossStageStatic then [
" --disable-libssp --disable-nls" + "--disable-libssp"
" --without-headers" + "--disable-nls"
" --disable-threads " + "--without-headers"
" --disable-libgomp " + "--disable-threads"
" --disable-libquadmath" + "--disable-libgomp"
" --disable-shared" + "--disable-libquadmath"
" --disable-libatomic " + # libatomic requires libc "--disable-shared"
" --disable-decimal-float" # libdecnumber requires libc "--disable-libatomic" # libatomic requires libc
else "--disable-decimal-float" # libdecnumber requires libc
(if crossDarwin then " --with-sysroot=${getLib libcCross}/share/sysroot" ] else [
else " --with-headers=${getDev libcCross}/include") + (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
# Ensure that -print-prog-name is able to find the correct programs. else "--with-headers=${getDev libcCross}/include")
" --enable-__cxa_atexit" + "--enable-__cxa_atexit"
" --enable-long-long" + "--enable-long-long"
(if crossMingw then ] ++
" --enable-threads=win32" + (if crossMingw then [
" --enable-sjlj-exceptions" + "--enable-threads=win32"
" --enable-hash-synchronization" + "--enable-sjlj-exceptions"
" --disable-libssp" + "--enable-hash-synchronization"
" --disable-nls" + "--disable-libssp"
" --with-dwarf2" + "--disable-nls"
"--with-dwarf2"
# I think noone uses shared gcc libs in mingw, so we better do the same. # I think noone uses shared gcc libs in mingw, so we better do the same.
# In any case, mingw32 g++ linking is broken by default with shared libs, # In any case, mingw32 g++ linking is broken by default with shared libs,
# unless adding "-lsupc++" to any linking command. I don't know why. # unless adding "-lsupc++" to any linking command. I don't know why.
" --disable-shared" + "--disable-shared"
# To keep ABI compatibility with upstream mingw-w64 # To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string" "--enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then ] else
optionals (targetPlatform.libc == "uclibc") [
# libsanitizer requires netrom/netrom.h which is not # libsanitizer requires netrom/netrom.h which is not
# available in uclibc. # available in uclibc.
" --disable-libsanitizer" + "--disable-libsanitizer"
# In uclibc cases, libgomp needs an additional '-ldl' # In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp. # and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") + "--disable-libgomp"
" --enable-threads=posix" + ] ++ [
" --enable-nls" + "--enable-threads=posix"
" --disable-decimal-float") # No final libdecnumber (it may work only in 386) "--enable-nls"
); "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
]));
stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final"; stageNameAddon = if crossStageStatic then "-stage-static" else "-stage-final";
crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else ""; crossNameAddon = if targetPlatform != hostPlatform then "-${targetPlatform.config}" + stageNameAddon else "";
@ -322,37 +302,25 @@ stdenv.mkDerivation ({
then [] then []
else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target"; else [ "build" "host" ] ++ stdenv.lib.optional (targetPlatform != hostPlatform) "target";
configureFlags = " configureFlags =
${if hostPlatform.isSunOS then # Basic dependencies
" --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " + [
# On Illumos/Solaris GNU as is preferred "--with-gmp-include=${gmp.dev}/include"
" --with-gnu-as --without-gnu-ld " "--with-gmp-lib=${gmp.out}/lib"
else ""} "--with-mpfr-include=${mpfr.dev}/include"
--enable-lto "--with-mpfr-lib=${mpfr.out}/lib"
${if enableMultilib then "--enable-multilib --disable-libquadmath" else "--disable-multilib"} "--with-mpc=${libmpc}"
${if enableShared then "" else "--disable-shared"} ] ++
${if enablePlugin then "--enable-plugin" else "--disable-plugin"} optional (libelf != null) "--with-libelf=${libelf}" ++
${optionalString (isl != null) "--with-isl=${isl}"}
${if langJava then
"--with-ecj-jar=${javaEcj} " +
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See # Basic configuration
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. [
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-lto"
else ""} "--disable-libstdcxx-pch"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} "--without-included-gettext"
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} "--with-system-zlib"
--with-gmp-include=${gmp.dev}/include "--enable-static"
--with-gmp-lib=${gmp.out}/lib "--enable-languages=${
--with-mpfr-include=${mpfr.dev}/include
--with-mpfr-lib=${mpfr.out}/lib
--with-mpc=${libmpc}
${if libelf != null then "--with-libelf=${libelf}" else ""}
--disable-libstdcxx-pch
--without-included-gettext
--with-system-zlib
--enable-static
--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -366,18 +334,55 @@ stdenv.mkDerivation ({
++ optionals crossDarwin [ "objc" "obj-c++" ] ++ optionals crossDarwin [ "objc" "obj-c++" ]
) )
) )
} }"
${if targetPlatform == hostPlatform ] ++
then if hostPlatform.isDarwin
then " --with-native-system-header-dir=${darwin.usr-include}" (if enableMultilib
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include" then ["--enable-multilib" "--disable-libquadmath"]
else ""} else ["--disable-multilib"]) ++
${if langAda then " --enable-libada" else ""} optional (!enableShared) "--disable-shared" ++
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} (if enablePlugin
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} then ["--enable-plugin"]
${if !bootstrap then "--disable-bootstrap" else ""} else ["--disable-plugin"]) ++
${if targetPlatform == hostPlatform then platformFlags else ""}
"; # Optional features
optional (isl != null) "--with-isl=${isl}" ++
# Java options
optionals langJava [
"--with-ecj-jar=${javaEcj}"
# Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home"
"--with-java-home=\${prefix}/lib/jvm/jre"
] ++
optional javaAwtGtk "--enable-java-awt=gtk" ++
optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
# Ada
optional langAda "--enable-libada" ++
# Cross-compilation
optional (targetPlatform == hostPlatform) (
let incDir = if hostPlatform.isDarwin
then "${darwin.usr-include}"
else "${getDev stdenv.cc.libc}/include";
in "--with-native-system-header-dir=${incDir}"
) ++
optional (targetPlatform == hostPlatform) (mkPlatformFlags stdenv.platform) ++
optional (targetPlatform != hostPlatform) crossConfigureFlags ++
optional (!bootstrap) "--disable-bootstrap" ++
# Platform-specific flags
optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
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"
]
;
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -390,17 +395,13 @@ stdenv.mkDerivation ({
then "install-strip" then "install-strip"
else "install"; else "install";
/* For cross-built gcc (build != host == target) */
crossAttrs = let crossAttrs = let
xgccArch = targetPlatform.gcc.arch or null; xgccArch = targetPlatform.gcc.arch or null;
xgccCpu = targetPlatform.gcc.cpu or null; xgccCpu = targetPlatform.gcc.cpu or null;
xgccAbi = targetPlatform.gcc.abi or null; xgccAbi = targetPlatform.gcc.abi or null;
xgccFpu = targetPlatform.gcc.fpu or null; xgccFpu = targetPlatform.gcc.fpu or null;
xgccFloat = targetPlatform.gcc.float or null; xgccFloat = targetPlatform.gcc.float or null;
xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
in { in {
AR = "${targetPlatform.config}-ar"; AR = "${targetPlatform.config}-ar";
LD = "${targetPlatform.config}-ld"; LD = "${targetPlatform.config}-ld";
@ -414,19 +415,20 @@ stdenv.mkDerivation ({
# If we are making a cross compiler, cross != null # If we are making a cross compiler, cross != null
NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc; NIX_CC_CROSS = optionalString (targetPlatform == hostPlatform) builtins.toString stdenv.cc;
dontStrip = true; dontStrip = true;
configureFlags = '' configureFlags =
${if enableMultilib then "" else "--disable-multilib"} optional (!enableMultilib) "--disable-multilib" ++
${if enableShared then "" else "--disable-shared"} optional (!enableShared) "--disable-shared" ++
${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""} optional langJava "--with-ecj-jar=${javaEcj.crossDrv}" ++
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr.crossDrv}" ++
--with-gmp=${gmp.crossDrv} [
--with-mpfr=${mpfr.crossDrv} "--with-gmp=${gmp.crossDrv}"
--with-mpc=${libmpc.crossDrv} "--with-mpfr=${mpfr.crossDrv}"
--disable-libstdcxx-pch "--with-mpc=${libmpc.crossDrv}"
--without-included-gettext "--disable-libstdcxx-pch"
--with-system-zlib "--without-included-gettext"
--enable-languages=${ "--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse "," concatStrings (intersperse ","
( optional langC "c" ( optional langC "c"
++ optional langCC "c++" ++ optional langCC "c++"
@ -437,14 +439,15 @@ stdenv.mkDerivation ({
++ optional langGo "go" ++ optional langGo "go"
) )
) )
} }"
${if langAda then " --enable-libada" else ""} ] ++
${xwithArch} optional langAda "--enable-libada" ++
${xwithCpu} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithAbi} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithFpu} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFloat} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
''; optional (xgccFloat != null) "--with-float=${xgccFloat}"
;
buildFlags = ""; buildFlags = "";
}; };