~ruther/guix-local

cf0ef075c43437f183bc4cb390481e9c9b5a3399 — Jan Nieuwenhuizen 10 years ago 9747d18
gnu: Add mingw-w64.

* gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch,
gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch,
gnu/packages/mingw.scm: New files.
* gnu/local.mk (dist_patch_DATA): Add the patches.
(GNU_SYSTEM_MODULES): Add mingw.scm.
M gnu/local.mk => gnu/local.mk +3 -0
@@ 248,6 248,7 @@ GNU_SYSTEM_MODULES =				\
  %D%/packages/mc.scm				\
  %D%/packages/mcrypt.scm			\
  %D%/packages/messaging.scm			\
  %D%/packages/mingw.scm			\
  %D%/packages/mg.scm				\
  %D%/packages/microcom.scm			\
  %D%/packages/mit-krb5.scm			\


@@ 554,6 555,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/gcc-cross-environment-variables.patch	\
  %D%/packages/patches/gcc-libvtv-runpath.patch			\
  %D%/packages/patches/gcc-strmov-store-file-names.patch	\
  %D%/packages/patches/gcc-4.9.3-mingw-gthr-default.patch	\
  %D%/packages/patches/gcc-5.0-libvtv-runpath.patch		\
  %D%/packages/patches/gcc-6-arm-none-eabi-multilib.patch	\
  %D%/packages/patches/gcc-6-cross-environment-variables.patch	\


@@ 725,6 727,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/mesa-wayland-egl-symbols-check-mips.patch	\
  %D%/packages/patches/metabat-remove-compilation-date.patch	\
  %D%/packages/patches/mhash-keygen-test-segfault.patch		\
  %D%/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch		\
  %D%/packages/patches/mpc123-initialize-ao.patch		\
  %D%/packages/patches/mplayer2-theora-fix.patch		\
  %D%/packages/patches/module-init-tools-moduledir.patch	\

A gnu/packages/mingw.scm => gnu/packages/mingw.scm +84 -0
@@ 0,0 1,84 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu packages mingw)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (gnu packages)
  #:use-module (gnu packages base)
  #:use-module (gnu packages cross-base)
  #:use-module (gnu packages gcc)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages multiprecision)
  #:use-module (guix build-system gnu)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix utils)
  #:use-module (ice-9 match))

(define %mingw-triplet
  "i686-w64-mingw32")

(define-public mingw-w64
  (package
    (name "mingw-w64")
    (version "5.0-rc2")
    (source (origin
              (method url-fetch)
              (uri (string-append
                    "https://sourceforge.net/projects/mingw-w64/files/mingw-w64/"
                    "mingw-w64-release/mingw-w64-v" version ".tar.bz2"))
              (sha256
               (base32 "0imdary8j07if8ih73pfgxiclpf2ax8h3mz8mxln07i8sbbd30c9"))
              (patches (search-patches "mingw-w64-5.0rc2-gcc-4.9.3.patch"))))
    (native-inputs `(("xgcc-core" ,(cross-gcc %mingw-triplet))
                     ("xbinutils" ,(cross-binutils %mingw-triplet))))
    (build-system gnu-build-system)
    (search-paths
     (list (search-path-specification
            (variable "CROSS_C_INCLUDE_PATH")
            (files '("include" "i686-w64-mingw32/include")))
           (search-path-specification
            (variable "CROSS_LIBRARY_PATH")
            (files
             '("lib" "lib64" "i686-w64-mingw32/lib" "i686-w64-mingw32/lib64")))))
    (arguments
     `(#:configure-flags '("--host=i686-w64-mingw32")
       #:phases
       (modify-phases %standard-phases
         (add-before 'configure 'setenv
           (lambda* (#:key inputs #:allow-other-keys)
             (let ((xgcc-core (assoc-ref inputs "xgcc-core"))
                   (mingw-headers (string-append (getcwd) "/mingw-w64-headers")))
               (setenv "CPP"
                       (string-append xgcc-core "/bin/i686-w64-mingw32-cpp"))
               (setenv "CROSS_C_INCLUDE_PATH"
                       (string-append
                        mingw-headers
                        ":" mingw-headers "/include"
                        ":" mingw-headers "/crt"
                        ":" mingw-headers "/defaults/include"
                        ":" mingw-headers "/direct-x/include"))))))
       #:make-flags (list "DEFS=-DHAVE_CONFIG_H -D__MINGW_HAS_DXSDK=1")
       #:tests? #f ; compiles and includes glibc headers
       #:strip-binaries? #f))
    (home-page "http://mingw.org")
    (synopsis "Minimalist GNU for Windows")
    (description "MinGW provides a complete Open Source programming tool set
which is suitable for the development of native MS-Windows applications, and
which does not depend on any 3rd-party C-Runtime dlls.")
    (license license:fdl1.3+)))

A gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch => gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch +11 -0
@@ 0,0 1,11 @@
--- a/libgcc/config/i386/gthr-win32.h	2016-03-30 07:45:33.388684463 +0200
+++ b/libgcc/config/i386/gthr-win32.h	2016-03-30 15:51:24.123896436 +0200
@@ -30,7 +30,7 @@

 /* Make sure CONST_CAST2 (origin in system.h) is declared.  */
 #ifndef CONST_CAST2
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq)
+#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)X)
 #endif

 /* Windows32 threads specific definitions. The windows32 threading model

A gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch => gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch +218 -0
@@ 0,0 1,218 @@
This patch includes

   * mingw-w64-headers/include/winnt.h: compile fixes for1 gcc-4.9.3
   * mingw-w64-headers/crt/math.h: Likewise
   * mingw-w64-headers/crt/float.h (FLT_EPSILON,DBL_EPSILON,LDBL_EPSILON): Add
   symbols.
   * mingw-w64-headers/crt/stat.h (S_ISLNK,S_ISSOCK,S_ISUID,S_ISGID,S_ISLINK):
   Add symbols.
   (lstat): Add function.
   * mingw-w64-headers/crt/_mingw_stat64.h: Likewise
   * mingw-w64-headers/crt/stdlib.h (realpath): Add function.

Needed for building with gcc-4.9.3 and using with cross-libtool-2.4.6.

Upstream status: not yet presented upstream.

index 9c5cf87..74a8541 100644
--- a/mingw-w64-crt/misc/dirname.c
+++ b/mingw-w64-crt/misc/dirname.c
@@ -29,6 +29,12 @@
 #define __cdecl  /* this may not be defined.                   */
 #endif
 
+char *__cdecl
+realpath(const char *name, char *resolved)
+{
+  return resolved ? strcpy (resolved, name) : strdup (name);
+}
+
 char * __cdecl
 dirname(char *path)
 {
diff --git a/mingw-w64-headers/crt/_mingw_stat64.h b/mingw-w64-headers/crt/_mingw_stat64.h
index 17e754c..7d2339b 100644
--- a/mingw-w64-headers/crt/_mingw_stat64.h
+++ b/mingw-w64-headers/crt/_mingw_stat64.h
@@ -2,13 +2,17 @@
 
 #ifdef _USE_32BIT_TIME_T
 #define _fstat32 _fstat
+#define _lstat32 _lstat
 #define _stat32 _stat
 #define _wstat32 _wstat
 #define _fstat32i64 _fstati64
+#define _lstat32i64 _lstati64
 #define _stat32i64 _stati64
 #define _wstat32i64 _wstati64
 #else
 #define _fstat _fstat64i32
+#define _lstat _lstat64i32
+#define _lstati64 _lstat64
 #define _fstati64 _fstat64
 #define _stat _stat64i32
 #define _stati64 _stat64
diff --git a/mingw-w64-headers/crt/float.h b/mingw-w64-headers/crt/float.h
index 5874f4e..bdf4ead 100644
--- a/mingw-w64-headers/crt/float.h
+++ b/mingw-w64-headers/crt/float.h
@@ -22,6 +22,15 @@
 #if (__GNUC__ < 4)
 #error Corrupt install of gcc-s internal headers, or search order was changed.
 #else
+
+        /* From gcc-4.9.3 float.h.  */
+        #undef FLT_EPSILON
+        #undef DBL_EPSILON
+        #undef LDBL_EPSILON
+        #define FLT_EPSILON	__FLT_EPSILON__
+        #define DBL_EPSILON	__DBL_EPSILON__
+        #define LDBL_EPSILON	__LDBL_EPSILON__
+
 	/* #include_next <float_ginclude.h> */
 	
    	/* Number of decimal digits, q, such that any floating-point number with q
diff --git a/mingw-w64-headers/crt/math.h b/mingw-w64-headers/crt/math.h
index 1e970f4..99a332f 100644
--- a/mingw-w64-headers/crt/math.h
+++ b/mingw-w64-headers/crt/math.h
@@ -216,6 +216,7 @@ extern "C" {
 #endif
   }
 
+#if 0
   __CRT_INLINE long double __cdecl fabsl (long double x)
   {
 #ifdef __arm__
@@ -226,6 +227,7 @@ extern "C" {
     return res;
 #endif
   }
+#endif
 
   __CRT_INLINE double __cdecl fabs (double x)
   {
@@ -905,7 +907,7 @@ __mingw_choose_expr (                                         \
 /* 7.12.7.3  */
   extern double __cdecl hypot (double, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005; /* in libmoldname.a */
   extern float __cdecl hypotf (float x, float y);
-#ifndef __CRT__NO_INLINE
+#if 0 //ndef __CRT__NO_INLINE
   __CRT_INLINE float __cdecl hypotf (float x, float y) { return (float) hypot ((double)x, (double)y);}
 #endif
   extern long double __cdecl hypotl (long double, long double);
diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h
index dfc5ae4..6f0fee3 100644
--- a/mingw-w64-headers/crt/stdlib.h
+++ b/mingw-w64-headers/crt/stdlib.h
@@ -8,6 +8,7 @@
 
 #include <crtdefs.h>
 #include <limits.h>
+#include <string.h>
 
 #if defined (__USE_MINGW_ANSI_STDIO) && ((__USE_MINGW_ANSI_STDIO + 0) != 0) && !defined (__USE_MINGW_STRTOX)
 #define __USE_MINGW_STRTOX 1
@@ -676,6 +677,8 @@ unsigned long __cdecl _lrotr(unsigned long,int);
 
 #endif /* !__NO_ISOCEXT */
 
+char *__cdecl realpath (const char *name, char *resolved);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/mingw-w64-headers/crt/sys/stat.h b/mingw-w64-headers/crt/sys/stat.h
index ed60219..d88b4f1 100644
--- a/mingw-w64-headers/crt/sys/stat.h
+++ b/mingw-w64-headers/crt/sys/stat.h
@@ -58,16 +58,21 @@ extern "C" {
 #include <_mingw_stat64.h>
 
 #define _S_IFMT 0xF000
+#define _S_IFLNK 0xA000
+#define _S_IFSOCK 0xC000
 #define _S_IFDIR 0x4000
 #define _S_IFCHR 0x2000
 #define _S_IFIFO 0x1000
 #define _S_IFREG 0x8000
+#define _S_ISUID 0x0400
+#define _S_ISGID 0x0200
 #define _S_IREAD 0x0100
 #define _S_IWRITE 0x0080
 #define _S_IEXEC 0x0040
 
   _CRTIMP int __cdecl _fstat32(int _FileDes,struct _stat32 *_Stat);
   _CRTIMP int __cdecl _stat32(const char *_Name,struct _stat32 *_Stat);
+  static inline int __cdecl _lstat32(const char *_Name,struct _stat32 *_Stat) {return _stat32(_Name, _Stat);}
   _CRTIMP int __cdecl _fstat64(int _FileDes,struct _stat64 *_Stat);
   _CRTIMP int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat);
   int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat);
@@ -97,6 +102,9 @@ extern "C" {
   _CRTIMP int __cdecl _stat64(const char *_Name,struct _stat64 *_Stat);
   _CRTIMP int __cdecl _stat32i64(const char *_Name,struct _stat32i64 *_Stat);
   int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat);
+  static inline int __cdecl _lstat64(const char *_Name,struct _stat64 *_Stat) {return _stat64(_Name, _Stat);}
+  static inline int __cdecl _lstat32i64(const char *_Name,struct _stat32i64 *_Stat) {return _stat32i64(_Name, _Stat);}
+  static inline int __cdecl _lstat64i32(const char *_Name,struct _stat64i32 *_Stat) {return _stat64i32(_Name, _Stat);}
 #ifndef __CRT__NO_INLINE
   __CRT_INLINE int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat)
   {
@@ -132,6 +140,8 @@ extern "C" {
 #ifndef	NO_OLDNAMES
 #define	_S_IFBLK	0x3000	/* Block: Is this ever set under w32? */
 
+#define S_IFLNK _S_IFLNK
+#define S_IFSOCK _S_IFSOCK
 #define S_IFMT _S_IFMT
 #define S_IFDIR _S_IFDIR
 #define S_IFCHR _S_IFCHR
@@ -162,6 +172,11 @@ extern "C" {
 #define S_IXOTH    (S_IXGRP >> 3)
 #define S_IRWXO    (S_IRWXG >> 3)
 
+#define S_ISUID _S_ISUID
+#define S_ISGID _S_ISGID
+
+#define S_ISLNK(m)	(((m) & S_IFMT) == S_IFLNK)
+#define S_ISSOCK(m)	(((m) & S_IFMT) == S_IFSOCK)
 #define	S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)
 #define	S_ISFIFO(m)	(((m) & S_IFMT) == S_IFIFO)
 #define	S_ISCHR(m)	(((m) & S_IFMT) == S_IFCHR)
@@ -174,6 +189,7 @@ extern "C" {
 int __cdecl stat(const char *_Filename,struct stat *_Stat);
 int __cdecl fstat(int _Desc,struct stat *_Stat);
 int __cdecl wstat(const wchar_t *_Filename,struct stat *_Stat);
+static inline int __cdecl lstat(const char *_Filename,struct stat *_Stat){return stat(_Filename, _Stat);}
 
 #ifndef __CRT__NO_INLINE
 #ifdef _USE_32BIT_TIME_T
@@ -262,9 +278,11 @@ __CRT_INLINE int __cdecl
 
 #if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64)
 #ifdef _USE_32BIT_TIME_T
+#define lstat _lstat32i64
 #define stat _stat32i64
 #define fstat _fstat32i64
 #else
+#define lstat _lstat64
 #define stat _stat64
 #define fstat _fstat64
 #endif
diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h
index 52af29b..8626396 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -6895,7 +6895,12 @@ __buildmemorybarrier()
 	  DWORD Reg : 3;
 	  DWORD R : 1;
 	  DWORD L : 1;
+/* C is used as a const specifier */
+#define save_C C
+#undef C
 	  DWORD C : 1;
+#define C save_C
+#undef save_C
 	  DWORD StackAdjust : 10;
 	} DUMMYSTRUCTNAME;
       } DUMMYUNIONNAME;