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,44 +240,62 @@ 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}" ++
# Basic configuration
[
"--disable-libstdcxx-pch"
"--without-included-gettext"
"--with-system-zlib"
"--enable-languages=${
concatStrings (intersperse ","
( optional langC "c"
++ optional langCC "c++"
++ optional langFortran "fortran"
++ optional langJava "java"
++ optional langAda "ada"
++ optional langVhdl "vhdl"
)
)
}"
] ++
optional (!enableMultilib) "--disable-multilib" ++
optional (!enableShared) "--disable-shared" ++
# 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 # Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. # <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-java-home"
else ""} "--with-java-home=\${prefix}/lib/jvm/jre"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} ] ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
--with-gmp=${gmp.dev} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
--with-mpfr=${mpfr.dev}
--with-mpc=${libmpc} # Ada
${if libelf != null then "--with-libelf=${libelf}" else ""} optional langAda "--enable-libada" ++
--disable-libstdcxx-pch
--without-included-gettext # Cross-compilation
--with-system-zlib optional (targetPlatform != hostPlatform) crossConfigureFlags ++
--enable-languages=${
concatStrings (intersperse "," # Platform-specific flags
( optional langC "c" optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
++ optional langCC "c++" # Trick that should be taken out once we have a mips64el-linux not loongson2f
++ optional langFortran "fortran" optional (targetPlatform == hostPlatform && stdenv.system == "mips64el-linux") "--with-arch=loongson2f"
++ optional langJava "java" ;
++ optional langAda "ada"
++ 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 ""}
${if langAda then " --enable-libada" else ""}
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""}
${if targetPlatform != hostPlatform then crossConfigureFlags else ""}
";
targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null;
@ -295,37 +312,41 @@ 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"
concatStrings (intersperse "," "--with-system-zlib"
( optional langC "c" "--enable-languages=${
++ optional langCC "c++" concatStrings (intersperse ","
++ optional langFortran "fortran" ( optional langC "c"
++ optional langJava "java" ++ optional langCC "c++"
++ optional langAda "ada" ++ optional langFortran "fortran"
++ optional langVhdl "vhdl" ++ optional langJava "java"
++ optional langAda "ada"
++ optional langVhdl "vhdl"
++ optional langGo "go"
)
) )
) }"
} ] ++
${if langAda then " --enable-libada" else ""} optional langAda "--enable-libada" ++
${if targetplatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""} optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
${if targetPlatform != hostPlatform then crossConfigureFlags else ""} optional (targetPlatform != hostPlatform) crossConfigureFlags
''; ;
}; };
# Needed for the cross compilation to work # Needed for the cross compilation to work
AR = "ar"; AR = "ar";

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

View File

@ -99,107 +99,88 @@ 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 ""; in
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else ""; optional (gccArch != null) "--with-arch=${gccArch}" ++
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else ""; optional (gccCpu != null) "--with-cpu=${gccCpu}" ++
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else ""; optional (gccAbi != null) "--with-abi=${gccAbi}" ++
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else ""; optional (gccFpu != null) "--with-fpu=${gccFpu}" ++
withMode = if gccMode != null then " --with-mode=${gccMode}" else ""; optional (gccFloat != null) "--with-float=${gccFloat}" ++
in optional (gccMode != null) "--with-mode=${gccMode}";
withArch +
withCpu +
withAbi +
withFpu +
withFloat +
withMode;
/* 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; # Ensure that -print-prog-name is able to find the correct programs.
gccFpu = targetPlatform.gcc.fpu or null; [ "--with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as"
gccFloat = targetPlatform.gcc.float or null; "--with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" ] ++
gccMode = targetPlatform.gcc.mode or null; (if crossMingw && crossStageStatic then [
withArch = if gccArch != null then " --with-arch=${gccArch}" else ""; "--with-headers=${libcCross}/include"
withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else ""; "--with-gcc"
withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else ""; "--with-gnu-as"
withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else ""; "--with-gnu-ld"
withFloat = if gccFloat != null then " --with-float=${gccFloat}" else ""; "--with-gnu-ld"
withMode = if gccMode != null then " --with-mode=${gccMode}" else ""; "--disable-shared"
in "--disable-nls"
withArch + "--disable-debug"
withCpu + "--enable-sjlj-exceptions"
withAbi + "--enable-threads=win32"
withFpu + "--disable-win32-registry"
withFloat + ] else if crossStageStatic then [
withMode + "--disable-libssp"
# Ensure that -print-prog-name is able to find the correct programs. "--disable-nls"
" --with-as=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-as" + "--without-headers"
" --with-ld=${targetPackages.stdenv.cc.bintools}/bin/${targetPlatform.config}-ld" + "--disable-threads"
(if crossMingw && crossStageStatic then "--disable-libgomp"
" --with-headers=${libcCross}/include" + "--disable-libquadmath"
" --with-gcc" + "--disable-shared"
" --with-gnu-as" + "--disable-libatomic" # libatomic requires libc
" --with-gnu-ld" + "--disable-decimal-float" # libdecnumber requires libc
" --with-gnu-ld" + ] else [
" --disable-shared" + (if crossDarwin then "--with-sysroot=${getLib libcCross}/share/sysroot"
" --disable-nls" + else "--with-headers=${getDev libcCross}/include")
" --disable-debug" + "--enable-__cxa_atexit"
" --enable-sjlj-exceptions" + "--enable-long-long"
" --enable-threads=win32" + ] ++
" --disable-win32-registry" (if crossMingw then [
else if crossStageStatic then "--enable-threads=win32"
" --disable-libssp --disable-nls" + "--enable-sjlj-exceptions"
" --without-headers" + "--enable-hash-synchronization"
" --disable-threads " + "--disable-libssp"
" --disable-libgomp " + "--disable-nls"
" --disable-libquadmath" + "--with-dwarf2"
" --disable-shared" + # I think noone uses shared gcc libs in mingw, so we better do the same.
" --disable-libatomic " + # libatomic requires libc # In any case, mingw32 g++ linking is broken by default with shared libs,
" --disable-decimal-float" # libdecnumber requires libc # unless adding "-lsupc++" to any linking command. I don't know why.
else "--disable-shared"
(if crossDarwin then " --with-sysroot=${libcCross.out}/share/sysroot" # To keep ABI compatibility with upstream mingw-w64
else " --with-headers=${libcCross.dev}/include") + "--enable-fully-dynamic-string"
" --enable-__cxa_atexit" + ] else
" --enable-long-long" + optionals (targetPlatform.libc == "uclibc") [
(if crossMingw then # libsanitizer requires netrom/netrom.h which is not
" --enable-threads=win32" + # available in uclibc.
" --enable-sjlj-exceptions" + "--disable-libsanitizer"
" --enable-hash-synchronization" + # In uclibc cases, libgomp needs an additional '-ldl'
" --disable-libssp" + # and as I don't know how to pass it, I disable libgomp.
" --disable-nls" + "--disable-libgomp"
" --with-dwarf2" + ] ++ [
# I think noone uses shared gcc libs in mingw, so we better do the same. "--enable-threads=posix"
# In any case, mingw32 g++ linking is broken by default with shared libs, "--enable-nls"
# unless adding "-lsupc++" to any linking command. I don't know why. "--disable-decimal-float" # No final libdecnumber (it may work only in 386)
" --disable-shared" + ]));
# To keep ABI compatibility with upstream mingw-w64
" --enable-fully-dynamic-string"
else (if targetPlatform.libc == "uclibc" then
# libsanitizer requires netrom/netrom.h which is not
# available in uclibc.
" --disable-libsanitizer" +
# In uclibc cases, libgomp needs an additional '-ldl'
# and as I don't know how to pass it, I disable libgomp.
" --disable-libgomp" else "") +
" --enable-threads=posix" +
" --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 "";
bootstrap = targetPlatform == hostPlatform; bootstrap = targetPlatform == hostPlatform;
in in
@ -326,61 +307,91 @@ 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}"} # Basic configuration
${optionalString (cloog != null) "--with-cloog=${cloog} --disable-cloog-version-check --enable-cloog-backend=isl"} [
${if langJava then "--enable-lto"
"--with-ecj-jar=${javaEcj} " + "--disable-libstdcxx-pch"
"--without-included-gettext"
"--with-system-zlib"
"--enable-static"
"--enable-languages=${
concatStrings (intersperse ","
( optional langC "c"
++ optional langCC "c++"
++ optional langFortran "fortran"
++ optional langJava "java"
++ optional langAda "ada"
++ optional langVhdl "vhdl"
++ optional langGo "go"
++ optional langObjC "objc"
++ optional langObjCpp "obj-c++"
++ optionals crossDarwin [ "objc" "obj-c++" ]
)
)
}"
] ++
(if enableMultilib
then ["--enable-multilib" "--disable-libquadmath"]
else ["--disable-multilib"]) ++
optional (!enableShared) "--disable-shared" ++
(if enablePlugin
then ["--enable-plugin"]
else ["--disable-plugin"]) ++
# 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 # Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
# <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>. # <http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2010-April/008888.html>.
"--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre " "--enable-java-home"
else ""} "--with-java-home=\${prefix}/lib/jvm/jre"
${if javaAwtGtk then "--enable-java-awt=gtk" else ""} ] ++
${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""} optional javaAwtGtk "--enable-java-awt=gtk" ++
--with-gmp=${gmp.dev} optional (langJava && javaAntlr != null) "--with-antlr-jar=${javaAntlr}" ++
--with-mpfr=${mpfr.dev}
--with-mpc=${libmpc} # Ada
${if libelf != null then "--with-libelf=${libelf}" else ""} optional langAda "--enable-libada" ++
--disable-libstdcxx-pch
--without-included-gettext # Cross-compilation
--with-system-zlib optional (targetPlatform == hostPlatform) (
--enable-static let incDir = if hostPlatform.isDarwin
--enable-languages=${ then "${darwin.usr-include}"
concatStrings (intersperse "," else "${getDev stdenv.cc.libc}/include";
( optional langC "c" in "--with-native-system-header-dir=${incDir}"
++ optional langCC "c++" ) ++
++ optional langFortran "fortran"
++ optional langJava "java" optional (targetPlatform == hostPlatform) (mkPlatformFlags stdenv.platform) ++
++ optional langAda "ada" optional (targetPlatform != hostPlatform) crossConfigureFlags ++
++ optional langVhdl "vhdl" optional (!bootstrap) "--disable-bootstrap" ++
++ optional langGo "go"
++ optional langObjC "objc" # Platform-specific flags
++ optional langObjCpp "obj-c++" optional (targetPlatform == hostPlatform && targetPlatform.isi686) "--with-arch=i686" ++
++ optionals crossDarwin [ "objc" "obj-c++" ] 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"
${if targetPlatform == hostPlatform ]
then if hostPlatform.isDarwin ;
then " --with-native-system-header-dir=${darwin.usr-include}"
else " --with-native-system-header-dir=${getDev stdenv.cc.libc}/include"
else ""}
${if langAda then " --enable-libada" else ""}
${if targetPlatform == hostPlatform && targetPlatform.isi686 then "--with-arch=i686" else ""}
${if targetPlatform != hostPlatform then crossConfigureFlags else ""}
${if !bootstrap then "--disable-bootstrap" else ""}
${if targetPlatform == hostPlatform then platformFlags else ""}
";
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,38 +424,40 @@ 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"
concatStrings (intersperse "," "--enable-languages=${
( optional langC "c" concatStrings (intersperse ","
++ optional langCC "c++" ( optional langC "c"
++ optional langFortran "fortran" ++ optional langCC "c++"
++ optional langJava "java" ++ optional langFortran "fortran"
++ optional langAda "ada" ++ optional langJava "java"
++ optional langVhdl "vhdl" ++ optional langAda "ada"
++ optional langGo "go" ++ optional langVhdl "vhdl"
++ optional langGo "go"
)
) )
) }"
} ] ++
${if langAda then " --enable-libada" else ""} optional langAda "--enable-libada" ++
${xwithArch} optional (xgccArch != null) "--with-arch=${xgccArch}" ++
${xwithCpu} optional (xgccCpu != null) "--with-cpu=${xgccCpu}" ++
${xwithAbi} optional (xgccAbi != null) "--with-abi=${xgccAbi}" ++
${xwithFpu} optional (xgccFpu != null) "--with-fpu=${xgccFpu}" ++
${xwithFloat} optional (xgccFloat != null) "--with-float=${xgccFloat}"
''; ;
buildFlags = ""; buildFlags = "";
}; };

View File

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

View File

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

View File

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