diff --git a/pkgs/development/compilers/gcc/13/Added-mcf-thread-model-support-from-mcfgthread.patch b/pkgs/development/compilers/gcc/13/Added-mcf-thread-model-support-from-mcfgthread.patch new file mode 100644 index 000000000000..77202438e47d --- /dev/null +++ b/pkgs/development/compilers/gcc/13/Added-mcf-thread-model-support-from-mcfgthread.patch @@ -0,0 +1,306 @@ +From 86f2f767ddffd9f7c6f1470b987ae7b0d251b988 Mon Sep 17 00:00:00 2001 +From: Liu Hao +Date: Wed, 25 Apr 2018 21:54:19 +0800 +Subject: [PATCH] Added 'mcf' thread model support from mcfgthread. + +Signed-off-by: Liu Hao +--- + config/gthr.m4 | 1 + + gcc/config.gcc | 3 +++ + gcc/config/i386/mingw-mcfgthread.h | 1 + + gcc/config/i386/mingw-w64.h | 2 +- + gcc/config/i386/mingw32.h | 11 ++++++++++- + gcc/configure | 2 +- + gcc/configure.ac | 2 +- + libatomic/configure.tgt | 2 +- + libgcc/config.host | 6 ++++++ + libgcc/config/i386/gthr-mcf.h | 1 + + libgcc/config/i386/t-mingw-mcfgthread | 2 ++ + libgcc/configure | 1 + + libstdc++-v3/configure | 1 + + libstdc++-v3/libsupc++/atexit_thread.cc | 18 ++++++++++++++++++ + libstdc++-v3/libsupc++/guard.cc | 23 +++++++++++++++++++++++ + libstdc++-v3/src/c++11/thread.cc | 9 +++++++++ + 16 files changed, 80 insertions(+), 5 deletions(-) + create mode 100644 gcc/config/i386/mingw-mcfgthread.h + create mode 100644 libgcc/config/i386/gthr-mcf.h + create mode 100644 libgcc/config/i386/t-mingw-mcfgthread + +diff --git a/config/gthr.m4 b/config/gthr.m4 +index 7b29f1f3327..82e21fe1709 100644 +--- a/config/gthr.m4 ++++ b/config/gthr.m4 +@@ -21,6 +21,7 @@ case $1 in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + AC_SUBST(thread_header) + ]) +diff --git a/gcc/config.gcc b/gcc/config.gcc +index 46a9029acec..112c24e95a3 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1758,6 +1758,9 @@ i[34567]86-*-mingw* | x86_64-*-mingw*) + if test x$enable_threads = xposix ; then + tm_file="${tm_file} i386/mingw-pthread.h" + fi ++ if test x$enable_threads = xmcf ; then ++ tm_file="${tm_file} i386/mingw-mcfgthread.h" ++ fi + tm_file="${tm_file} i386/mingw32.h" + # This makes the logic if mingw's or the w64 feature set has to be used + case ${target} in +diff --git a/gcc/config/i386/mingw-mcfgthread.h b/gcc/config/i386/mingw-mcfgthread.h +new file mode 100644 +index 00000000000..ec381a7798f +--- /dev/null ++++ b/gcc/config/i386/mingw-mcfgthread.h +@@ -0,0 +1 @@ ++#define TARGET_USE_MCFGTHREAD 1 +diff --git a/gcc/config/i386/mingw-w64.h b/gcc/config/i386/mingw-w64.h +index 484dc7a9e9f..a15bbeea500 100644 +--- a/gcc/config/i386/mingw-w64.h ++++ b/gcc/config/i386/mingw-w64.h +@@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + #undef SPEC_32 + #undef SPEC_64 +diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h +index 0612b87199a..76cea94f3b7 100644 +--- a/gcc/config/i386/mingw32.h ++++ b/gcc/config/i386/mingw32.h +@@ -32,6 +32,14 @@ along with GCC; see the file COPYING3. If not see + | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE \ + | MASK_MS_BITFIELD_LAYOUT) + ++#ifndef TARGET_USE_MCFGTHREAD ++#define CPP_MCFGTHREAD() ((void)0) ++#define LIB_MCFGTHREAD "" ++#else ++#define CPP_MCFGTHREAD() (builtin_define("__USING_MCFGTHREAD__")) ++#define LIB_MCFGTHREAD " -lmcfgthread " ++#endif ++ + /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS + is for compatibility with native compiler. */ + #define EXTRA_OS_CPP_BUILTINS() \ +@@ -50,6 +58,7 @@ along with GCC; see the file COPYING3. If not see + builtin_define_std ("WIN64"); \ + builtin_define ("_WIN64"); \ + } \ ++ CPP_MCFGTHREAD(); \ + } \ + while (0) + +@@ -93,7 +102,7 @@ along with GCC; see the file COPYING3. If not see + "%{mwindows:-lgdi32 -lcomdlg32} " \ + "%{fvtable-verify=preinit:-lvtv -lpsapi; \ + fvtable-verify=std:-lvtv -lpsapi} " \ +- "-ladvapi32 -lshell32 -luser32 -lkernel32" ++ LIB_MCFGTHREAD "-ladvapi32 -lshell32 -luser32 -lkernel32" + + /* Weak symbols do not get resolved if using a Windows dll import lib. + Make the unwind registration references strong undefs. */ +diff --git a/gcc/configure b/gcc/configure +index 6121e163259..52f0e00efe6 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -11693,7 +11693,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/gcc/configure.ac b/gcc/configure.ac +index b066cc609e1..4ecdba88de7 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1612,7 +1612,7 @@ case ${enable_threads} in + target_thread_file='single' + ;; + aix | dce | lynx | mipssde | posix | rtems | \ +- single | tpf | vxworks | win32) ++ single | tpf | vxworks | win32 | mcf) + target_thread_file=${enable_threads} + ;; + *) +diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt +index ea8c34f8c71..23134ad7363 100644 +--- a/libatomic/configure.tgt ++++ b/libatomic/configure.tgt +@@ -145,7 +145,7 @@ case "${target}" in + *-*-mingw*) + # OS support for atomic primitives. + case ${target_thread_file} in +- win32) ++ win32 | mcf) + config_path="${config_path} mingw" + ;; + posix) +diff --git a/libgcc/config.host b/libgcc/config.host +index 11b4acaff55..9fbd38650bd 100644 +--- a/libgcc/config.host ++++ b/libgcc/config.host +@@ -737,6 +737,9 @@ i[34567]86-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +@@ -761,6 +764,9 @@ x86_64-*-mingw*) + posix) + tmake_file="i386/t-mingw-pthread $tmake_file" + ;; ++ mcf) ++ tmake_file="i386/t-mingw-mcfgthread $tmake_file" ++ ;; + esac + # This has to match the logic for DWARF2_UNWIND_INFO in gcc/config/i386/cygming.h + if test x$ac_cv_sjlj_exceptions = xyes; then +diff --git a/libgcc/config/i386/gthr-mcf.h b/libgcc/config/i386/gthr-mcf.h +new file mode 100644 +index 00000000000..5ea2908361f +--- /dev/null ++++ b/libgcc/config/i386/gthr-mcf.h +@@ -0,0 +1 @@ ++#include +diff --git a/libgcc/config/i386/t-mingw-mcfgthread b/libgcc/config/i386/t-mingw-mcfgthread +new file mode 100644 +index 00000000000..4b9b10e32d6 +--- /dev/null ++++ b/libgcc/config/i386/t-mingw-mcfgthread +@@ -0,0 +1,2 @@ ++SHLIB_PTHREAD_CFLAG = ++SHLIB_PTHREAD_LDFLAG = -lmcfgthread +diff --git a/libgcc/configure b/libgcc/configure +index b2f3f870844..eff889dc3b3 100644 +--- a/libgcc/configure ++++ b/libgcc/configure +@@ -5451,6 +5451,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure +index ba094be6f15..979a5ab9ace 100755 +--- a/libstdc++-v3/configure ++++ b/libstdc++-v3/configure +@@ -15187,6 +15187,7 @@ case $target_thread_file in + tpf) thread_header=config/s390/gthr-tpf.h ;; + vxworks) thread_header=config/gthr-vxworks.h ;; + win32) thread_header=config/i386/gthr-win32.h ;; ++ mcf) thread_header=config/i386/gthr-mcf.h ;; + esac + + +diff --git a/libstdc++-v3/libsupc++/atexit_thread.cc b/libstdc++-v3/libsupc++/atexit_thread.cc +index de920d714c6..665fb74bd6b 100644 +--- a/libstdc++-v3/libsupc++/atexit_thread.cc ++++ b/libstdc++-v3/libsupc++/atexit_thread.cc +@@ -25,6 +25,22 @@ + #include + #include + #include "bits/gthr.h" ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++namespace __cxxabiv1 { ++extern "C" int ++__cxa_thread_atexit (void (_GLIBCXX_CDTOR_CALLABI *dtor)(void *), ++ void *obj, void *dso_handle) ++ _GLIBCXX_NOTHROW ++{ ++ return ::_MCFCRT_AtThreadExit((void (*)(_MCFCRT_STD intptr_t))dtor, (_MCFCRT_STD intptr_t)obj) ? 0 : -1; ++ (void)dso_handle; ++} ++} ++#else // __USING_MCFGTHREAD__ ++ + #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 + #define WIN32_LEAN_AND_MEAN + #include +@@ -167,3 +183,5 @@ __cxxabiv1::__cxa_thread_atexit (void (*dtor)(void *), void *obj, void */*dso_ha + } + + #endif /* _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL */ ++ ++#endif // __USING_MCFGTHREAD__ +diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc +index 3a2ec3ad0d6..8b4cc96199b 100644 +--- a/libstdc++-v3/libsupc++/guard.cc ++++ b/libstdc++-v3/libsupc++/guard.cc +@@ -28,6 +28,27 @@ + #include + #include + #include ++ ++#ifdef __USING_MCFGTHREAD__ ++ ++#include ++ ++namespace __cxxabiv1 { ++ ++extern "C" int __cxa_guard_acquire(__guard *g){ ++ return ::_MCFCRT_WaitForOnceFlagForever((::_MCFCRT_OnceFlag *)g) == ::_MCFCRT_kOnceResultInitial; ++} ++extern "C" void __cxa_guard_abort(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsAborted((::_MCFCRT_OnceFlag *)g); ++} ++extern "C" void __cxa_guard_release(__guard *g) throw() { ++ ::_MCFCRT_SignalOnceFlagAsFinished((::_MCFCRT_OnceFlag *)g); ++} ++ ++} ++ ++#else // __USING_MCFGTHREAD__ ++ + #include + #include + #include +@@ -425,3 +446,5 @@ namespace __cxxabiv1 + #endif + } + } ++ ++#endif +diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc +index 8238817c2e9..0c6a1f85f6f 100644 +--- a/libstdc++-v3/src/c++11/thread.cc ++++ b/libstdc++-v3/src/c++11/thread.cc +@@ -55,6 +55,15 @@ static inline int get_nprocs() + #elif defined(_GLIBCXX_USE_SC_NPROC_ONLN) + # include + # define _GLIBCXX_NPROCS sysconf(_SC_NPROC_ONLN) ++#elif defined(_WIN32) ++# include ++static inline int get_nprocs() ++{ ++ SYSTEM_INFO sysinfo; ++ GetSystemInfo(&sysinfo); ++ return (int)sysinfo.dwNumberOfProcessors; ++} ++# define _GLIBCXX_NPROCS get_nprocs() + #else + # define _GLIBCXX_NPROCS 0 + #endif +-- +2.17.0 + diff --git a/pkgs/development/compilers/gcc/13/default.nix b/pkgs/development/compilers/gcc/13/default.nix new file mode 100644 index 000000000000..230910c19402 --- /dev/null +++ b/pkgs/development/compilers/gcc/13/default.nix @@ -0,0 +1,357 @@ +{ lib, stdenv, targetPackages, fetchurl, fetchpatch, noSysDirs +, langC ? true, langCC ? true, langFortran ? false +, langAda ? false +, langObjC ? stdenv.targetPlatform.isDarwin +, langObjCpp ? stdenv.targetPlatform.isDarwin +, langD ? false +, langGo ? false +, reproducibleBuild ? true +, profiledCompiler ? false +, langJit ? false +, staticCompiler ? false +, enableShared ? !stdenv.targetPlatform.isStatic +, enableLTO ? !stdenv.hostPlatform.isStatic +, texinfo ? null +, perl ? null # optional, for texi2pod (then pod2man) +, gmp, mpfr, libmpc, gettext, which, patchelf, binutils +, isl ? null # optional, for the Graphite optimization framework. +, zlib ? null +, libucontext ? null +, gnat-bootstrap ? null +, enableMultilib ? false +, enablePlugin ? stdenv.hostPlatform == stdenv.buildPlatform # Whether to support user-supplied plug-ins +, name ? "gcc" +, libcCross ? null +, threadsCross ? null # for MinGW +, crossStageStatic ? false +, gnused ? null +, cloog # unused; just for compat with gcc4, as we override the parameter on some places +, buildPackages +, libxcrypt +, disableGdbPlugin ? !enablePlugin +, nukeReferences +, callPackage +}: + +# Make sure we get GNU sed. +assert stdenv.buildPlatform.isDarwin -> gnused != null; + +# The go frontend is written in c++ +assert langGo -> langCC; +assert langAda -> gnat-bootstrap != null; + +# TODO: fixup D bootstapping, probably by using gdc11 (and maybe other changes). +# error: GDC is required to build d +assert !langD; + +# threadsCross is just for MinGW +assert threadsCross != {} -> stdenv.targetPlatform.isWindows; + +# profiledCompiler builds inject non-determinism in one of the compilation stages. +# If turned on, we can't provide reproducible builds anymore +assert reproducibleBuild -> profiledCompiler == false; + +with lib; +with builtins; + +let majorVersion = "13"; + version = "${majorVersion}.1.0"; + disableBootstrap = !stdenv.hostPlatform.isDarwin && !profiledCompiler; + + inherit (stdenv) buildPlatform hostPlatform targetPlatform; + + patches = + optional (targetPlatform != hostPlatform) ../libstdc++-target.patch + ++ optional noSysDirs ../gcc-12-no-sys-dirs.patch + ++ optional noSysDirs ../no-sys-dirs-riscv.patch + ++ [ + ../gnat-cflags-11.patch + ../gcc-12-gfortran-driving.patch + ../ppc-musl.patch + ] + # We only apply this patch when building a native toolchain for aarch64-darwin, as it breaks building + # a foreign one: https://github.com/iains/gcc-12-branch/issues/18 + ++ optional (stdenv.isDarwin && stdenv.isAarch64 && buildPlatform == hostPlatform && hostPlatform == targetPlatform) (fetchpatch { + name = "gcc-13-darwin-aarch64-support.patch"; + url = "https://github.com/Homebrew/formula-patches/raw/5c206c47e2a08d522ec9795bb314346fff5fc4c5/gcc/gcc-13.1.0.diff"; + sha256 = "sha256-sMgA7nwE2ULa54t5g6VE6eJQYa69XvQrefi9U9f2t4g="; + }) + ++ optional langD ../libphobos.patch + + # backport fixes to build gccgo with musl libc + ++ optionals (langGo && stdenv.hostPlatform.isMusl) [ + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/cf79b1117bd177d3d4c6ed24b6fa243c3628ac2d.diff"; + hash = "sha256-mS5ZiYi5D8CpGXrWg3tXlbhp4o86ew1imCTwaHLfl+I="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/7f195a2270910a6ed08bd76e3a16b0a6503f9faf.diff"; + hash = "sha256-Ze/cFM0dQofKH00PWPDoklXUlwWhwA1nyTuiDAZ6FKo="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/762fd5e5547e464e25b4bee435db6df4eda0de90.diff"; + hash = "sha256-o28upwTcHAnHG2Iq0OewzwSBEhHs+XpBGdIfZdT81pk="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/e73d9fcafbd07bc3714fbaf8a82db71d50015c92.diff"; + hash = "sha256-1SjYCVHLEUihdON2TOC3Z2ufM+jf2vH0LvYtZL+c1Fo="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/b6c6a3d64f2e4e9347733290aca3c75898c44b2e.diff"; + hash = "sha256-RycJ3YCHd3MXtYFjxP0zY2Wuw7/C4bWoBAQtTKJZPOQ="; + }) + (fetchpatch { + excludes = [ "gcc/go/gofrontend/MERGE" ]; + url = "https://github.com/gcc-mirror/gcc/commit/2b1a604a9b28fbf4f382060bebd04adb83acc2f9.diff"; + hash = "sha256-WiBQG0Xbk75rHk+AMDvsbrm+dc7lDH0EONJXSdEeMGE="; + }) + (fetchpatch { + url = "https://github.com/gcc-mirror/gcc/commit/c86b726c048eddc1be320c0bf64a897658bee13d.diff"; + hash = "sha256-QSIlqDB6JRQhbj/c3ejlmbfWz9l9FurdSWxpwDebnlI="; + }) + ] + + # Fix detection of bootstrap compiler Ada support (cctools as) on Nix Darwin + ++ optional (stdenv.isDarwin && langAda) ../ada-cctools-as-detection-configure.patch + + # Use absolute path in GNAT dylib install names on Darwin + ++ optional (stdenv.isDarwin && langAda) ../gnat-darwin-dylib-install-name.patch + + # Obtain latest patch with ../update-mcfgthread-patches.sh + ++ optional (!crossStageStatic && targetPlatform.isMinGW && threadsCross.model == "mcf") ./Added-mcf-thread-model-support-from-mcfgthread.patch; + + /* Cross-gcc settings (build == host != target) */ + crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; + stageNameAddon = if crossStageStatic then "stage-static" else "stage-final"; + crossNameAddon = optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-${stageNameAddon}-"; + + callFile = lib.callPackageWith { + # lets + inherit + majorVersion + version + buildPlatform + hostPlatform + targetPlatform + patches + crossMingw + stageNameAddon + crossNameAddon + ; + # inherit generated with 'nix eval --json --impure --expr "with import ./. {}; lib.attrNames (lib.functionArgs gcc13.cc.override)" | jq '.[]' --raw-output' + inherit + binutils + buildPackages + cloog + crossStageStatic + disableBootstrap + disableGdbPlugin + enableLTO + enableMultilib + enablePlugin + enableShared + fetchpatch + fetchurl + gettext + gmp + gnat-bootstrap + gnused + isl + langAda + langC + langCC + langD + langFortran + langGo + langJit + langObjC + langObjCpp + lib + libcCross + libmpc + libucontext + libxcrypt + mpfr + name + noSysDirs + nukeReferences + patchelf + perl + profiledCompiler + reproducibleBuild + staticCompiler + stdenv + targetPackages + texinfo + threadsCross + which + zip + zlib + ; + }; + +in + +lib.pipe (stdenv.mkDerivation ({ + pname = "${crossNameAddon}${name}"; + inherit version; + + builder = ../builder.sh; + + src = fetchurl { + url = "mirror://gcc/releases/gcc-${version}/gcc-${version}.tar.xz"; + sha256 = "sha256-YdaE8Kpedqxlha2ImKJCeq3ol57V5/hUkihsTfwT7oY="; + }; + + inherit patches; + + outputs = [ "out" "man" "info" ] ++ lib.optional (!langJit) "lib"; + setOutputFlags = false; + NIX_NO_SELF_RPATH = true; + + libc_dev = stdenv.cc.libc_dev; + + hardeningDisable = [ "format" "pie" ]; + + postPatch = '' + configureScripts=$(find . -name configure) + for configureScript in $configureScripts; do + patchShebangs $configureScript + done + '' + # This should kill all the stdinc frameworks that gcc and friends like to + # insert into default search paths. + + lib.optionalString hostPlatform.isDarwin '' + substituteInPlace gcc/config/darwin-c.cc \ + --replace 'if (stdinc)' 'if (0)' + + substituteInPlace libgcc/config/t-slibgcc-darwin \ + --replace "-install_name @shlib_slibdir@/\$(SHLIB_INSTALL_NAME)" "-install_name ''${!outputLib}/lib/\$(SHLIB_INSTALL_NAME)" + + substituteInPlace libgfortran/configure \ + --replace "-install_name \\\$rpath/\\\$soname" "-install_name ''${!outputLib}/lib/\\\$soname" + '' + + ( + lib.optionalString (targetPlatform != hostPlatform || stdenv.cc.libc != null) + # On NixOS, use the right path to the dynamic linker instead of + # `/lib/ld*.so'. + (let + libc = if libcCross != null then libcCross else stdenv.cc.libc; + in + ( + '' echo "fixing the \`GLIBC_DYNAMIC_LINKER', \`UCLIBC_DYNAMIC_LINKER', and \`MUSL_DYNAMIC_LINKER' macros..." + for header in "gcc/config/"*-gnu.h "gcc/config/"*"/"*.h + do + grep -q _DYNAMIC_LINKER "$header" || continue + echo " fixing \`$header'..." + sed -i "$header" \ + -e 's|define[[:blank:]]*\([UCG]\+\)LIBC_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define \1LIBC_DYNAMIC_LINKER\2 "${libc.out}\3"|g' \ + -e 's|define[[:blank:]]*MUSL_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define MUSL_DYNAMIC_LINKER\1 "${libc.out}\2"|g' + done + '' + + lib.optionalString (targetPlatform.libc == "musl") + '' + sed -i gcc/config/linux.h -e '1i#undef LOCAL_INCLUDE_DIR' + '' + ) + )) + + lib.optionalString targetPlatform.isAvr '' + makeFlagsArray+=( + '-s' # workaround for hitting hydra log limit + 'LIMITS_H_TEST=false' + ) + ''; + + inherit noSysDirs staticCompiler crossStageStatic + libcCross crossMingw; + + inherit (callFile ../common/dependencies.nix { }) depsBuildBuild nativeBuildInputs depsBuildTarget buildInputs depsTargetTarget; + + NIX_LDFLAGS = lib.optionalString hostPlatform.isSunOS "-lm"; + + + preConfigure = (callFile ../common/pre-configure.nix { }) + '' + ln -sf ${libxcrypt}/include/crypt.h libsanitizer/sanitizer_common/crypt.h + ''; + + dontDisableStatic = true; + + configurePlatforms = [ "build" "host" "target" ]; + + configureFlags = callFile ../common/configure-flags.nix { }; + + targetConfig = if targetPlatform != hostPlatform then targetPlatform.config else null; + + buildFlags = + # we do not yet have Nix-driven profiling + assert profiledCompiler -> !disableBootstrap; + let target = + lib.optionalString (profiledCompiler) "profiled" + + lib.optionalString (targetPlatform == hostPlatform && hostPlatform == buildPlatform && !disableBootstrap) "bootstrap"; + in lib.optional (target != "") target; + + inherit (callFile ../common/strip-attributes.nix { }) + stripDebugList + stripDebugListTarget + preFixup; + + # https://gcc.gnu.org/install/specific.html#x86-64-x-solaris210 + ${if hostPlatform.system == "x86_64-solaris" then "CC" else null} = "gcc -m64"; + + # Setting $CPATH and $LIBRARY_PATH to make sure both `gcc' and `xgcc' find the + # library headers and binaries, regarless of the language being compiled. + # + # Likewise, the LTO code doesn't find zlib. + # + # Cross-compiling, we need gcc not to read ./specs in order to build the g++ + # compiler (after the specs for the cross-gcc are created). Having + # LIBRARY_PATH= makes gcc read the specs from ., and the build breaks. + + CPATH = optionals (targetPlatform == hostPlatform) (makeSearchPathOutput "dev" "include" ([] + ++ optional (zlib != null) zlib + )); + + LIBRARY_PATH = optionals (targetPlatform == hostPlatform) (makeLibraryPath (optional (zlib != null) zlib)); + + inherit (callFile ../common/extra-target-flags.nix { }) + EXTRA_FLAGS_FOR_TARGET + EXTRA_LDFLAGS_FOR_TARGET + ; + + passthru = { + inherit langC langCC langObjC langObjCpp langAda langFortran langGo langD version; + isGNU = true; + }; + + enableParallelBuilding = true; + inherit enableShared enableMultilib; + + meta = { + inherit (callFile ../common/meta.nix { }) + homepage + license + description + longDescription + platforms + maintainers + ; + }; +} + +// optionalAttrs (targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt" && crossStageStatic) { + makeFlags = [ "all-gcc" "all-target-libgcc" ]; + installTargets = "install-gcc install-target-libgcc"; +} + +// optionalAttrs (enableMultilib) { dontMoveLib64 = true; } +)) +[ + (callPackage ../common/libgcc.nix { inherit langC langCC langJit; }) + (callPackage ../common/checksum.nix { inherit langC langCC; }) +] + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index ab50b431497e..beeb7e1c4372 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -14812,6 +14812,7 @@ with pkgs; gcc10Stdenv = overrideCC gccStdenv buildPackages.gcc10; gcc11Stdenv = overrideCC gccStdenv buildPackages.gcc11; gcc12Stdenv = overrideCC gccStdenv buildPackages.gcc12; + gcc13Stdenv = overrideCC gccStdenv buildPackages.gcc13; # Meant for packages that fail with newer than gcc10. gcc10StdenvCompat = if stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "11" then gcc10Stdenv else stdenv; @@ -15025,7 +15026,19 @@ with pkgs; isl = if !stdenv.isDarwin then isl_0_20 else null; })); - gcc_latest = gcc12; + gcc13 = lowPrio (wrapCC (callPackage ../development/compilers/gcc/13 { + inherit noSysDirs; + + reproducibleBuild = true; + profiledCompiler = false; + + libcCross = if stdenv.targetPlatform != stdenv.buildPlatform then libcCross else null; + threadsCross = if stdenv.targetPlatform != stdenv.buildPlatform then threadsCross else { }; + + isl = if !stdenv.isDarwin then isl_0_20 else null; + })); + + gcc_latest = gcc13; # Use the same GCC version as the one from stdenv by default gfortran = wrapCC (gcc.cc.override { @@ -15108,6 +15121,14 @@ with pkgs; profiledCompiler = false; }); + gfortran13 = wrapCC (gcc13.cc.override { + name = "gfortran"; + langFortran = true; + langCC = false; + langC = false; + profiledCompiler = false; + }); + libgccjit = gcc.cc.override { name = "libgccjit"; langFortran = false; @@ -15171,6 +15192,29 @@ with pkgs; else stdenv; }); + gnat13 = wrapCC (gcc13.cc.override { + name = "gnat"; + langC = true; + langCC = false; + langAda = true; + profiledCompiler = false; + # As per upstream instructions building a cross compiler + # should be done with a (native) compiler of the same version. + # If we are cross-compiling GNAT, we may as well do the same. + gnat-bootstrap = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + then buildPackages.gnat-bootstrap12 + else buildPackages.gnat13; + stdenv = + if stdenv.hostPlatform == stdenv.targetPlatform + && stdenv.buildPlatform == stdenv.hostPlatform + && stdenv.buildPlatform.isDarwin + && stdenv.buildPlatform.isx86_64 + then overrideCC stdenv gnat-bootstrap12 + else stdenv; + }); + gnat-bootstrap = gnat-bootstrap12; gnat-bootstrap11 = wrapCC (callPackage ../development/compilers/gnat-bootstrap { majorVersion = "11"; }); gnat-bootstrap12 = wrapCCWith ({ @@ -15205,6 +15249,18 @@ with pkgs; meta.broken = stdenv.hostPlatform.isDarwin; }); + gccgo13 = wrapCC (gcc13.cc.override { + name = "gccgo"; + langCC = true; #required for go. + langC = true; + langGo = true; + langJit = true; + profiledCompiler = false; + } // { + # not supported on darwin: https://github.com/golang/go/issues/463 + meta.broken = stdenv.hostPlatform.isDarwin; + }); + ghdl = ghdl-mcode; ghdl-mcode = callPackage ../development/compilers/ghdl {