From a81e3dcd759ffb44348186bdc3751af9ea2f1005 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Fri, 8 Sep 2023 14:29:39 +0800 Subject: [PATCH 1/2] treewide: replace libc == "msvcrt" with isMinGW msvcrt is only one of the libcs in MinGW. We therefore replace explictly testing for msvcrt with the isMinGW predicate. This lays the foundation for ucrt64 support. --- pkgs/development/compilers/gcc/common/configure-flags.nix | 2 +- pkgs/development/compilers/gcc/common/libgcc.nix | 2 +- pkgs/development/compilers/gcc/default.nix | 2 +- pkgs/development/libraries/boost/generic.nix | 6 +++--- pkgs/development/libraries/libiconv/default.nix | 2 +- pkgs/development/libraries/libjpeg-turbo/default.nix | 2 +- pkgs/development/libraries/libxml2/default.nix | 2 +- pkgs/development/libraries/zlib/default.nix | 8 ++++---- pkgs/top-level/all-packages.nix | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pkgs/development/compilers/gcc/common/configure-flags.nix b/pkgs/development/compilers/gcc/common/configure-flags.nix index 7d59eee55f25..cbe38f1127f3 100644 --- a/pkgs/development/compilers/gcc/common/configure-flags.nix +++ b/pkgs/development/compilers/gcc/common/configure-flags.nix @@ -47,7 +47,7 @@ let # See https://github.com/NixOS/nixpkgs/pull/209870#issuecomment-1500550903 disableBootstrap' = disableBootstrap && !langFortran && !langGo; - crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; + crossMingw = targetPlatform != hostPlatform && targetPlatform.isMinGW; crossDarwin = targetPlatform != hostPlatform && targetPlatform.libc == "libSystem"; targetPrefix = lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform) diff --git a/pkgs/development/compilers/gcc/common/libgcc.nix b/pkgs/development/compilers/gcc/common/libgcc.nix index 4ab6eb2b3b44..977d2c75d22a 100644 --- a/pkgs/development/compilers/gcc/common/libgcc.nix +++ b/pkgs/development/compilers/gcc/common/libgcc.nix @@ -19,7 +19,7 @@ drv: lib.pipe drv (pkg: pkg.overrideAttrs (previousAttrs: lib.optionalAttrs ( targetPlatform != hostPlatform && - (enableShared || targetPlatform.libc == "msvcrt") && + (enableShared || targetPlatform.isMinGW) && withoutTargetLibc ) { makeFlags = [ "all-gcc" "all-target-libgcc" ]; diff --git a/pkgs/development/compilers/gcc/default.nix b/pkgs/development/compilers/gcc/default.nix index f467aa32f7d1..12af17cef5cb 100644 --- a/pkgs/development/compilers/gcc/default.nix +++ b/pkgs/development/compilers/gcc/default.nix @@ -115,7 +115,7 @@ let inherit version; patches = callFile ./patches {}; /* Cross-gcc settings (build == host != target) */ - crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; + crossMingw = targetPlatform != hostPlatform && targetPlatform.isMinGW; stageNameAddon = if withoutTargetLibc then "stage-static" else "stage-final"; crossNameAddon = optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-${stageNameAddon}-"; diff --git a/pkgs/development/libraries/boost/generic.nix b/pkgs/development/libraries/boost/generic.nix index f3994e4dc14e..f989d285916a 100644 --- a/pkgs/development/libraries/boost/generic.nix +++ b/pkgs/development/libraries/boost/generic.nix @@ -9,7 +9,7 @@ , enableDebug ? false , enableSingleThreaded ? false , enableMultiThreaded ? true -, enableShared ? !(with stdenv.hostPlatform; isStatic || libc == "msvcrt") # problems for now +, enableShared ? !(with stdenv.hostPlatform; isStatic || isMinGW) # problems for now , enableStatic ? !enableShared , enablePython ? false , enableNumpy ? false @@ -91,7 +91,7 @@ let ++ lib.optional (!enablePython) "--without-python" ++ lib.optional needUserConfig "--user-config=user-config.jam" ++ lib.optional (stdenv.buildPlatform.isDarwin && stdenv.hostPlatform.isLinux) "pch=off" - ++ lib.optionals (stdenv.hostPlatform.libc == "msvcrt") [ + ++ lib.optionals stdenv.hostPlatform.isMinGW [ "threadapi=win32" ] ++ extraB2Args ); @@ -252,7 +252,7 @@ stdenv.mkDerivation { # Make boost header paths relative so that they are not runtime dependencies cd "$dev" && find include \( -name '*.hpp' -or -name '*.h' -or -name '*.ipp' \) \ -exec sed '1s/^\xef\xbb\xbf//;1i#line 1 "{}"' -i '{}' \; - '' + lib.optionalString (stdenv.hostPlatform.libc == "msvcrt") '' + '' + lib.optionalString stdenv.hostPlatform.isMinGW '' $RANLIB "$out/lib/"*.a ''; diff --git a/pkgs/development/libraries/libiconv/default.nix b/pkgs/development/libraries/libiconv/default.nix index 91b0df75f87b..0f0e7405d766 100644 --- a/pkgs/development/libraries/libiconv/default.nix +++ b/pkgs/development/libraries/libiconv/default.nix @@ -23,7 +23,7 @@ stdenv.mkDerivation rec { ]; postPatch = - lib.optionalString ((stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.libc == "msvcrt") || stdenv.cc.nativeLibc) + lib.optionalString ((stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.isMinGW) || stdenv.cc.nativeLibc) '' sed '/^_GL_WARN_ON_USE (gets/d' -i srclib/stdio.in.h '' diff --git a/pkgs/development/libraries/libjpeg-turbo/default.nix b/pkgs/development/libraries/libjpeg-turbo/default.nix index b6902050b5d5..27d4fda2ddc6 100644 --- a/pkgs/development/libraries/libjpeg-turbo/default.nix +++ b/pkgs/development/libraries/libjpeg-turbo/default.nix @@ -42,7 +42,7 @@ stdenv.mkDerivation rec { # This is needed by freeimage patches = [ ./0001-Compile-transupp.c-as-part-of-the-library.patch ] - ++ lib.optional (stdenv.hostPlatform.libc or null == "msvcrt") + ++ lib.optional stdenv.hostPlatform.isMinGW ./mingw-boolean.patch; outputs = [ "bin" "dev" "dev_private" "out" "man" "doc" ]; diff --git a/pkgs/development/libraries/libxml2/default.nix b/pkgs/development/libraries/libxml2/default.nix index d670f8e96984..3f2f81183ca2 100644 --- a/pkgs/development/libraries/libxml2/default.nix +++ b/pkgs/development/libraries/libxml2/default.nix @@ -17,7 +17,7 @@ (stdenv.hostPlatform == stdenv.buildPlatform || stdenv.hostPlatform.isCygwin || stdenv.hostPlatform.isLinux || stdenv.hostPlatform.isWasi) , icuSupport ? false , icu -, enableShared ? stdenv.hostPlatform.libc != "msvcrt" && !stdenv.hostPlatform.isStatic +, enableShared ? !stdenv.hostPlatform.isMinGW && !stdenv.hostPlatform.isStatic , enableStatic ? !enableShared , gnome }: diff --git a/pkgs/development/libraries/zlib/default.nix b/pkgs/development/libraries/zlib/default.nix index 051a55df8e49..baef243cbdc6 100644 --- a/pkgs/development/libraries/zlib/default.nix +++ b/pkgs/development/libraries/zlib/default.nix @@ -51,7 +51,7 @@ stdenv.mkDerivation (finalAttrs: { setOutputFlags = false; outputDoc = "dev"; # single tiny man3 page - dontConfigure = stdenv.hostPlatform.libc == "msvcrt"; + dontConfigure = stdenv.hostPlatform.isMinGW; preConfigure = lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' export CHOST=${stdenv.hostPlatform.config} @@ -96,7 +96,7 @@ stdenv.mkDerivation (finalAttrs: { '' # Non-typical naming confuses libtool which then refuses to use zlib's DLL # in some cases, e.g. when compiling libpng. - + lib.optionalString (stdenv.hostPlatform.libc == "msvcrt" && shared) '' + + lib.optionalString (stdenv.hostPlatform.isMinGW && shared) '' ln -s zlib1.dll $out/bin/libz.dll ''; @@ -109,7 +109,7 @@ stdenv.mkDerivation (finalAttrs: { dontStrip = stdenv.hostPlatform != stdenv.buildPlatform && static; configurePlatforms = []; - installFlags = lib.optionals (stdenv.hostPlatform.libc == "msvcrt") [ + installFlags = lib.optionals stdenv.hostPlatform.isMinGW [ "BINARY_PATH=$(out)/bin" "INCLUDE_PATH=$(dev)/include" "LIBRARY_PATH=$(out)/lib" @@ -120,7 +120,7 @@ stdenv.mkDerivation (finalAttrs: { makeFlags = [ "PREFIX=${stdenv.cc.targetPrefix}" - ] ++ lib.optionals (stdenv.hostPlatform.libc == "msvcrt") [ + ] ++ lib.optionals stdenv.hostPlatform.isMinGW [ "-f" "win32/Makefile.gcc" ] ++ lib.optionals shared [ # Note that as of writing (zlib 1.2.11), this flag only has an effect diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 79f9fd3b51c1..fb8c59f624a0 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -21741,7 +21741,7 @@ with pkgs; # These are used when buiding compiler-rt / libgcc, prior to building libc. preLibcCrossHeaders = let inherit (stdenv.targetPlatform) libc; - in if libc == "msvcrt" then targetPackages.windows.mingw_w64_headers or windows.mingw_w64_headers + in if stdenv.targetPlatform.isMinGW then targetPackages.windows.mingw_w64_headers or windows.mingw_w64_headers else if libc == "nblibc" then targetPackages.netbsdCross.headers or netbsdCross.headers else if libc == "libSystem" && stdenv.targetPlatform.isAarch64 then targetPackages.darwin.LibsystemCross or darwin.LibsystemCross else null; From 1e0561d78a3d3cd84bac45ab474af82e32802120 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Fri, 8 Sep 2023 14:29:54 +0800 Subject: [PATCH 2/2] nixpkgs/systems: Add ucrt64 as MinGW libc The Minimalist Gnu for Windows distribution comes with support for the traditional msvcrt libc, as well as ucrt64 libc. The latter being the newer universal compiler runtime. We follow the msys2 environment naming convention[1]: | name | toolchain | arch | libc | libc++ | |------------|-----------|---------|--------|-----------| | mingw32 | gcc | i686 | msvcrt | libstdc++ | | mingw64 | gcc | x86_64 | msvcrt | libstdc++ | | ucrt64 | gcc | x86_64 | ucrt | libstdc++ | | clang32 | llvm | i686 | ucrt | libc++ | | clang64 | llvm | x86_64 | ucrt | libc++ | | clangarm64 | llvm | aarch64 | ucrt | libc++ | For now nixpkgs only supports the first three with this commit. -- [1]: https://www.msys2.org/docs/environments/ --- lib/systems/examples.nix | 5 +++++ pkgs/os-specific/windows/mingw-w64/default.nix | 2 ++ pkgs/top-level/all-packages.nix | 1 + 3 files changed, 8 insertions(+) diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix index 8d9c09561ddb..2a067663f98c 100644 --- a/lib/systems/examples.nix +++ b/lib/systems/examples.nix @@ -313,6 +313,11 @@ rec { libc = "msvcrt"; # This distinguishes the mingw (non posix) toolchain }; + ucrt64 = { + config = "x86_64-w64-mingw32"; + libc = "ucrt"; # This distinguishes the mingw (non posix) toolchain + }; + # BSDs x86_64-freebsd = { diff --git a/pkgs/os-specific/windows/mingw-w64/default.nix b/pkgs/os-specific/windows/mingw-w64/default.nix index 221bcd8e89f2..3bfc7a58e727 100644 --- a/pkgs/os-specific/windows/mingw-w64/default.nix +++ b/pkgs/os-specific/windows/mingw-w64/default.nix @@ -36,6 +36,8 @@ in stdenv.mkDerivation { configureFlags = [ "--enable-idl" "--enable-secure-api" + ] ++ lib.optionals (stdenv.targetPlatform.libc == "ucrt") [ + "--with-default-msvcrt=ucrt" ]; enableParallelBuilding = true; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index fb8c59f624a0..deaf1bc990dd 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -21762,6 +21762,7 @@ with pkgs; else if name == "newlib-nano" then targetPackages.newlib-nanoCross or newlib-nanoCross else if name == "musl" then targetPackages.muslCross or muslCross else if name == "msvcrt" then targetPackages.windows.mingw_w64 or windows.mingw_w64 + else if name == "ucrt" then targetPackages.windows.mingw_w64 or windows.mingw_w64 else if name == "libSystem" then if stdenv.targetPlatform.useiOSPrebuilt then targetPackages.darwin.iosSdkPkgs.libraries or darwin.iosSdkPkgs.libraries