From 1acd8658f0912c02ff047d7415d34d744cb7b1aa Mon Sep 17 00:00:00 2001 From: David McFarland Date: Thu, 25 Sep 2025 14:52:17 -0300 Subject: [PATCH] cygwin.newlib-cygwin{,-nobin}: init at 3.6.4 --- pkgs/os-specific/cygwin/default.nix | 5 +- .../cygwin/newlib-cygwin/default.nix | 179 ++++++++++++++---- .../cygwin/newlib-cygwin/fix-cross.patch | 55 ++++++ .../cygwin/newlib-cygwin/nobin.nix | 9 + ...definitions-that-conflict-with-mingw.patch | 88 +++++++++ pkgs/os-specific/windows/default.nix | 1 + pkgs/top-level/all-packages.nix | 4 +- 7 files changed, 301 insertions(+), 40 deletions(-) create mode 100644 pkgs/os-specific/cygwin/newlib-cygwin/fix-cross.patch create mode 100644 pkgs/os-specific/cygwin/newlib-cygwin/nobin.nix create mode 100644 pkgs/os-specific/cygwin/newlib-cygwin/remove-definitions-that-conflict-with-mingw.patch diff --git a/pkgs/os-specific/cygwin/default.nix b/pkgs/os-specific/cygwin/default.nix index 66bc4dbb6f54..09f69ff9f9b2 100644 --- a/pkgs/os-specific/cygwin/default.nix +++ b/pkgs/os-specific/cygwin/default.nix @@ -17,6 +17,9 @@ makeScopeWithSplicing' { w32api = callPackage ./w32api { }; w32api-headers = callPackage ./w32api { headersOnly = true; }; - newlib-cygwin-headers = callPackage ./newlib-cygwin { }; + newlib-cygwin = callPackage ./newlib-cygwin { }; + # this is here to avoid symlinks being made to cygwin1.dll in /nix/store + newlib-cygwin-nobin = callPackage ./newlib-cygwin/nobin.nix { }; + newlib-cygwin-headers = callPackage ./newlib-cygwin { headersOnly = true; }; }; } diff --git a/pkgs/os-specific/cygwin/newlib-cygwin/default.nix b/pkgs/os-specific/cygwin/newlib-cygwin/default.nix index 00e399e20cc5..51352886bcb6 100644 --- a/pkgs/os-specific/cygwin/newlib-cygwin/default.nix +++ b/pkgs/os-specific/cygwin/newlib-cygwin/default.nix @@ -1,48 +1,151 @@ { lib, + stdenv, stdenvNoCC, + stdenvNoLibc, + autoreconfHook, + bison, buildPackages, - fetchurl, + cocom-tool-set, + flex, + perl, + w32api, w32api-headers, + + headersOnly ? false, }: -stdenvNoCC.mkDerivation (finalAttrs: { - pname = "newlib-cygwin-headers"; - version = "3.6.4"; +(if headersOnly then stdenvNoCC else stdenvNoLibc).mkDerivation ( + finalAttrs: + { + pname = "newlib-cygwin${lib.optionalString headersOnly "-headers"}"; + version = "3.6.4"; - src = buildPackages.fetchgit { - url = "https://cygwin.com/git/newlib-cygwin.git"; - rev = "cygwin-${finalAttrs.version}"; - hash = "sha256-+WYKwqcDAc7286GzbgKKAxNJCOf3AeNnF8XEVPoor+g="; - }; + src = buildPackages.fetchgit { + url = "https://cygwin.com/git/newlib-cygwin.git"; + rev = "cygwin-${finalAttrs.version}"; + hash = "sha256-+WYKwqcDAc7286GzbgKKAxNJCOf3AeNnF8XEVPoor+g="; + }; - patches = [ - # newer versions of gcc don't like struct winsize being used before being - # declared. - ./fix-winsize.patch - ]; - - dontConfigure = true; - dontBuild = true; - - installPhase = '' - mkdir -p $out/include/ - cp -r newlib/libc/include/* $out/include/ - cp -r winsup/cygwin/include/* $out/include/ - ''; - - passthru.w32api = w32api-headers; - - meta = { - homepage = "https://cygwin.com/"; - description = "A DLL which provides substantial POSIX API functionality on Windows."; - license = with lib.licenses; [ - # newlib - gpl2 - # winsup - gpl3 + outputs = [ + "out" + ] + ++ lib.optionals (!headersOnly) [ + "bin" + "dev" + "man" ]; - platforms = lib.platforms.cygwin; - maintainers = [ lib.maintainers.corngood ]; - }; -}) + + patches = [ + # Newer versions of gcc don't like struct winsize being used before being + # declared. Backport of https://cygwin.com/cgit/newlib-cygwin/commit/?id=73600d68227e125af24b7de7c3fccbd4eb66ee03 + ./fix-winsize.patch + ] + # After cygwin hosted builds are working, we should upstream this + ++ lib.optional ( + !headersOnly && stdenvNoLibc.hostPlatform != stdenvNoLibc.buildPlatform + ) ./fix-cross.patch; + + passthru.w32api = if headersOnly then w32api-headers else w32api; + + meta = { + homepage = "https://cygwin.com/"; + description = "A DLL which provides substantial POSIX API functionality on Windows."; + license = with lib.licenses; [ + # newlib + gpl2 + # winsup + gpl3 + ]; + platforms = lib.platforms.cygwin; + maintainers = [ lib.maintainers.corngood ]; + }; + } + // ( + if headersOnly then + { + dontConfigure = true; + dontBuild = true; + + installPhase = '' + mkdir -p $out/include/ + cp -r newlib/libc/include/* $out/include/ + cp -r winsup/cygwin/include/* $out/include/ + ''; + } + else + { + postPatch = '' + patchShebangs --build winsup/cygwin/scripts + ''; + + autoreconfFlags = [ + "winsup" + ] + # Only reconfigure root when fix-cross.patch is applied. Otherwise the + # autoconf version check will fail. + ++ lib.optional (stdenvNoLibc.hostPlatform != stdenvNoLibc.buildPlatform) "."; + + env = + let + libflag = "-Wl,-L${lib.getLib w32api}${w32api.libdir or "/lib/w32api"}"; + in + { + CFLAGS_FOR_TARGET = toString [ + libflag + ]; + + CXXFLAGS_FOR_TARGET = toString [ + "-Wno-error=register" + libflag + ]; + }; + + strictDeps = true; + + depsBuildBuild = [ buildPackages.stdenv.cc ]; + + nativeBuildInputs = [ + autoreconfHook + bison + cocom-tool-set + flex + perl + ]; + + buildInputs = [ w32api ]; + + makeFlags = [ + "tooldir=${placeholder "out"}" + ]; + + enableParallelBuilding = true; + + # this is explicitly -j1 in cygwin.cygport + # without it the install order is non-deterministic + enableParallelInstalling = false; + + hardeningDisable = [ + # conflicts with internal definition of 'bzero' + "fortify" + "stackprotector" + ]; + + configurePlatforms = [ + "build" + "target" + ]; + + configureFlags = [ + "--disable-shared" + "--disable-doc" + "--enable-static" + "--disable-dumper" + "--with-cross-bootstrap" + ] + ++ lib.optional (stdenvNoLibc.hostPlatform != stdenvNoLibc.buildPlatform) [ + "ac_cv_prog_CC=gcc" + ]; + } + ) +) diff --git a/pkgs/os-specific/cygwin/newlib-cygwin/fix-cross.patch b/pkgs/os-specific/cygwin/newlib-cygwin/fix-cross.patch new file mode 100644 index 000000000000..cba24ab12c40 --- /dev/null +++ b/pkgs/os-specific/cygwin/newlib-cygwin/fix-cross.patch @@ -0,0 +1,55 @@ +Disable strict autoconf version check so we can autoreconf in nixpkgs. + +diff --git a/config/override.m4 b/config/override.m4 +index 8b954d3cb..60c4cfd12 100644 +--- a/config/override.m4 ++++ b/config/override.m4 +@@ -44,7 +44,6 @@ AC_DEFUN([_GCC_AUTOCONF_VERSION_CHECK], + [m4_fatal([Please use exactly Autoconf ]_GCC_AUTOCONF_VERSION[ instead of ]m4_defn([m4_PACKAGE_VERSION])[.])]) + ]) + m4_define([AC_INIT], m4_defn([AC_INIT])[ +-_GCC_AUTOCONF_VERSION_CHECK + ]) + + + +This is needed for target linking to find e.g. crt0.o. +diff --git a/configure.ac b/configure.ac +index 05ddf6987..f5bbd5c72 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -3166,7 +3166,7 @@ case " $target_configdirs " in + *" --with-newlib "*) + case "$target" in + *-cygwin*) +- FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -L$$r/$(TARGET_SUBDIR)/winsup/cygwin -isystem $$s/winsup/cygwin/include' ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -B$$r/$(TARGET_SUBDIR)/winsup/cygwin -isystem $$s/winsup/cygwin/include' + ;; + esac + + +Autoconf clears EXEEXT= in cross, which breaks installation of utils/cygserver. + +AC_CHECK_LIB is disabled in cross after AC_NO_EXECUTABLES. +diff --git a/winsup/configure.ac b/winsup/configure.ac +index e7ac814b1..14b56e130 100644 +--- a/winsup/configure.ac ++++ b/winsup/configure.ac +@@ -40,6 +40,8 @@ AM_PROG_AS + AC_LANG(C) + AC_LANG(C++) + ++EXEEXT=.exe ++ + AC_ARG_WITH([cross-bootstrap],[AS_HELP_STRING([--with-cross-bootstrap],[do not build programs using the MinGW toolchain or check for MinGW libraries (useful for bootstrapping a cross-compiler)])],[],[with_cross_bootstrap=no]) + + AC_CYGWIN_INCLUDES +@@ -135,8 +137,6 @@ AM_CONDITIONAL(BUILD_DUMPER, [test "x$build_dumper" = "xyes"]) + # libbfd.a doesn't have a pkgconfig file, so we guess what it's dependencies + # are, based on what's present in the build environment + BFD_LIBS="-lintl -liconv -liberty -lz" +-AC_CHECK_LIB([sframe], [sframe_decode], [BFD_LIBS="${BFD_LIBS} -lsframe"]) +-AC_CHECK_LIB([zstd], [ZSTD_isError], [BFD_LIBS="${BFD_LIBS} -lzstd"]) + AC_SUBST([BFD_LIBS]) + + AC_CONFIG_FILES([ diff --git a/pkgs/os-specific/cygwin/newlib-cygwin/nobin.nix b/pkgs/os-specific/cygwin/newlib-cygwin/nobin.nix new file mode 100644 index 000000000000..8745261b9815 --- /dev/null +++ b/pkgs/os-specific/cygwin/newlib-cygwin/nobin.nix @@ -0,0 +1,9 @@ +{ + emptyDirectory, + newlib-cygwin, +}: + +newlib-cygwin +// { + bin = emptyDirectory; +} diff --git a/pkgs/os-specific/cygwin/newlib-cygwin/remove-definitions-that-conflict-with-mingw.patch b/pkgs/os-specific/cygwin/newlib-cygwin/remove-definitions-that-conflict-with-mingw.patch new file mode 100644 index 000000000000..313ff2873910 --- /dev/null +++ b/pkgs/os-specific/cygwin/newlib-cygwin/remove-definitions-that-conflict-with-mingw.patch @@ -0,0 +1,88 @@ +From cc95494ed527e64fcd1ade7ed7ae44f9e0a6fa8a Mon Sep 17 00:00:00 2001 +From: David McFarland +Date: Tue, 9 Sep 2025 15:04:45 -0300 +Subject: [PATCH] remove definitions that conflict with mingw + +--- + winsup/cygwin/fhandler/socket_inet.cc | 2 ++ + winsup/cygwin/fhandler/socket_local.cc | 2 ++ + winsup/cygwin/local_includes/ntdll.h | 20 -------------------- + winsup/cygwin/net.cc | 2 ++ + 4 files changed, 6 insertions(+), 20 deletions(-) + +diff --git a/winsup/cygwin/fhandler/socket_inet.cc b/winsup/cygwin/fhandler/socket_inet.cc +index 63cc498f1..03681c07b 100644 +--- a/winsup/cygwin/fhandler/socket_inet.cc ++++ b/winsup/cygwin/fhandler/socket_inet.cc +@@ -20,7 +20,9 @@ + #undef u_long + #define u_long __ms_u_long + #include ++#define cmsghdr __ms_cmsghdr + #include ++#undef cmsghdr + #include + #include + #include +diff --git a/winsup/cygwin/fhandler/socket_local.cc b/winsup/cygwin/fhandler/socket_local.cc +index e4a88169b..b832d8a84 100644 +--- a/winsup/cygwin/fhandler/socket_local.cc ++++ b/winsup/cygwin/fhandler/socket_local.cc +@@ -21,7 +21,9 @@ + #define u_long __ms_u_long + #include "ntsecapi.h" + #include ++#define cmsghdr __ms_cmsghdr + #include ++#undef cmsghdr + #include + #include + #include +diff --git a/winsup/cygwin/local_includes/ntdll.h b/winsup/cygwin/local_includes/ntdll.h +index 4497fe53f..bf86a8293 100644 +--- a/winsup/cygwin/local_includes/ntdll.h ++++ b/winsup/cygwin/local_includes/ntdll.h +@@ -489,26 +489,6 @@ typedef struct _FILE_DISPOSITION_INFORMATION_EX // 64 + ULONG Flags; + } FILE_DISPOSITION_INFORMATION_EX, *PFILE_DISPOSITION_INFORMATION_EX; + +-typedef struct _FILE_STAT_INFORMATION // 68 +-{ +- LARGE_INTEGER FileId; +- LARGE_INTEGER CreationTime; +- LARGE_INTEGER LastAccessTime; +- LARGE_INTEGER LastWriteTime; +- LARGE_INTEGER ChangeTime; +- LARGE_INTEGER AllocationSize; +- LARGE_INTEGER EndOfFile; +- ULONG FileAttributes; +- ULONG ReparseTag; +- ULONG NumberOfLinks; +- ACCESS_MASK EffectiveAccess; +-} FILE_STAT_INFORMATION, *PFILE_STAT_INFORMATION; +- +-typedef struct _FILE_CASE_SENSITIVE_INFORMATION // 71 +-{ +- ULONG Flags; +-} FILE_CASE_SENSITIVE_INFORMATION, *PFILE_CASE_SENSITIVE_INFORMATION; +- + enum { + FILE_LINK_REPLACE_IF_EXISTS = 0x01, + FILE_LINK_POSIX_SEMANTICS = 0x02, +diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc +index 737e494f8..6a1a0d079 100644 +--- a/winsup/cygwin/net.cc ++++ b/winsup/cygwin/net.cc +@@ -18,7 +18,9 @@ details. */ + #undef u_long + #define u_long __ms_u_long + #include ++#define cmsghdr __ms_cmsghdr + #include ++#undef cmsghdr + #include + #define gethostname cygwin_gethostname + #include +-- +2.50.1 + diff --git a/pkgs/os-specific/windows/default.nix b/pkgs/os-specific/windows/default.nix index 3a8813b15aaa..98f438554ac0 100644 --- a/pkgs/os-specific/windows/default.nix +++ b/pkgs/os-specific/windows/default.nix @@ -7,6 +7,7 @@ newScope, overrideCC, stdenvNoLibc, + emptyDirectory, }: lib.makeScope newScope ( diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 68e3c3b6af90..d607cff28e08 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4867,7 +4867,7 @@ with pkgs; isl = if !stdenv.hostPlatform.isDarwin then isl_0_20 else null; withoutTargetLibc = true; - langCC = false; + langCC = stdenv.targetPlatform.isCygwin; # can't compile libcygwin1.a without C++ libcCross = libc1; targetPackages.stdenv.cc.bintools = binutilsNoLibc; enableShared = @@ -7632,6 +7632,8 @@ with pkgs; if stdenv.hostPlatform.isMinGW then windows.mingw_w64 else windows.sdk else if libc == "ucrt" then if stdenv.hostPlatform.isMinGW then windows.mingw_w64 else windows.sdk + else if libc == "cygwin" then + cygwin.newlib-cygwin-nobin else if libc == "libSystem" then if stdenv.hostPlatform.useiOSPrebuilt then darwin.iosSdkPkgs.libraries else darwin.libSystem else if libc == "fblibc" then