diff --git a/pkgs/os-specific/cygwin/default.nix b/pkgs/os-specific/cygwin/default.nix index 9e33e0aedc4b..7ee8123e9c0b 100644 --- a/pkgs/os-specific/cygwin/default.nix +++ b/pkgs/os-specific/cygwin/default.nix @@ -15,5 +15,7 @@ makeScopeWithSplicing' { in { w32api-headers = callPackage ./w32api { }; + + newlib-cygwin-headers = callPackage ./newlib-cygwin { }; }; } diff --git a/pkgs/os-specific/cygwin/newlib-cygwin/default.nix b/pkgs/os-specific/cygwin/newlib-cygwin/default.nix new file mode 100644 index 000000000000..00e399e20cc5 --- /dev/null +++ b/pkgs/os-specific/cygwin/newlib-cygwin/default.nix @@ -0,0 +1,48 @@ +{ + lib, + stdenvNoCC, + buildPackages, + fetchurl, + w32api-headers, +}: + +stdenvNoCC.mkDerivation (finalAttrs: { + pname = "newlib-cygwin-headers"; + version = "3.6.4"; + + 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 + ]; + platforms = lib.platforms.cygwin; + maintainers = [ lib.maintainers.corngood ]; + }; +}) diff --git a/pkgs/os-specific/cygwin/newlib-cygwin/fix-winsize.patch b/pkgs/os-specific/cygwin/newlib-cygwin/fix-winsize.patch new file mode 100644 index 000000000000..0ac6b7499336 --- /dev/null +++ b/pkgs/os-specific/cygwin/newlib-cygwin/fix-winsize.patch @@ -0,0 +1,31 @@ +diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h +index d1b4a0af5..75e0c5348 100644 +--- a/winsup/cygwin/include/sys/termios.h ++++ b/winsup/cygwin/include/sys/termios.h +@@ -282,6 +282,12 @@ struct termios + speed_t c_ospeed; + }; + ++struct winsize ++{ ++ unsigned short ws_row, ws_col; ++ unsigned short ws_xpixel, ws_ypixel; ++}; ++ + #define termio termios + + #ifdef __cplusplus +@@ -313,13 +319,6 @@ int tcsetwinsize(int fd, const struct winsize *winsz); + #define cfgetospeed(tp) ((tp)->c_ospeed) + #endif + +-/* Extra stuff to make porting stuff easier. */ +-struct winsize +-{ +- unsigned short ws_row, ws_col; +- unsigned short ws_xpixel, ws_ypixel; +-}; +- + #define TIOCGWINSZ (('T' << 8) | 1) + #define TIOCSWINSZ (('T' << 8) | 2) + #define TIOCLINUX (('T' << 8) | 3) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 8680aeb4055c..c0b82bf673b8 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -7593,6 +7593,8 @@ with pkgs; windows.mingw_w64_headers or fallback else if libc == "nblibc" then netbsd.headers + else if libc == "cygwin" then + cygwin.newlib-cygwin-headers else null;