Patchwork [08/11] gnu: libtool: support cross-libtool mingw.

login
register
mail settings
Submitter Jan Nieuwenhuizen
Date May 14, 2016, 8:27 p.m.
Message ID <87vb2g9yi0.fsf@drakenvlieg.flower>
Download mbox | patch
Permalink /patch/12257/
State New
Headers show

Comments

Jan Nieuwenhuizen - May 14, 2016, 8:27 p.m.
Andy Wingo writes:

>> +Upstream status: not yet presented upstream.
>> +
>> +--- libtool-2.4.6/build-aux/ltmain.in~ 2015-02-06
>> 13:57:56.000000000 +0100
>> ++++ libtool-2.4.6/build-aux/ltmain.in 2016-05-06 07:46:29.425142546
>> +0200
>> +@@ -3658,12 +3658,10 @@
>> + #if defined _MSC_VER
>> + # define setmode _setmode
>> +-# define stat    _stat
>> + # define chmod   _chmod
>> + # define getcwd  _getcwd
>> + # define putenv  _putenv
>> + # define S_IXUSR _S_IEXEC
>> + #elif defined __MINGW32__
>> + # define setmode _setmode
>> +-# define stat    _stat
>> + # define chmod   _chmod
>> + # define getcwd  _getcwd
>
> This doesn't look right to me.  Stat was actually the first of this set
> to be added to the weird define list, via:

Ah, two problems here.  I did not want to patch the _MSC_VER bit and
wanted to /add/ lstat rather than remove stat.  (I have tested quite
some variants until before everything worked; the comment actually
advertises this

    redefining stat also impacts struct stat, breaking lstat's signature.  That is
    fixed be #define'ing lstat along.)

I now have

    @@ -3658,6 +3658,7 @@
     # define S_IXUSR _S_IEXEC
     #elif defined __MINGW32__
     # define setmode _setmode
    +# define lstat   _lstat
     # define stat    _stat
     # define chmod   _chmod
     # define getcwd  _getcwd

(changed both instances of this)

>     commit 781fc82e1b2bceaa5c55388d6ab1d1744663f992
>     Author: Peter Rosin <peda@lysator.liu.se>
>     Date:   Sun Jul 22 17:57:10 2007 +0000
>
>         * libltdl/config/ltmain.m4sh (func_emit_cwrapperexe_src): Add
>         support for Microsoft Visual C. Also, older MinGW versions
>         seem to need stdint.h to find intptr_t.

Wow, you looked it up for me.  Hmm.

> And there does appear to exist "struct _stat" in the API
> (https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx).

Yes, there is _stat, and that's the problem because functions _stat
_lstat use struct _stat, while all other functions use struct stat.

> Does it mean that "lstat" is coming from somewhere else (i.e. not the
> system libc), expecting to have a "struct stat" as an argument?  I
> don't know very much about this stuff but this change looks fishy to
> me.

I have added lstat as a patch to mingw-w64.

We were discussing the readline patch I used that just #ifdef'd-out
apparently missing symbols such as SIGHUP..SIGALRM, S_ISGUID...and
S_SFLNK.  I started looking into porting Bash and found it uses such
symbols that are missing in MinGW without #ifdef guards in many places.

I decided it would make sense to try adding these symbols mingw's
signal.h and sys/stat.h, instead of patching all patches that use them.
On strange thing here is that I found some signals are include in MinGW
but only behind an #ifdef _POSIX flag.  That puzzles me, aren't we
creating (limited) POSIX compatibility here, why limit it further using
a flag...?

Anyway, adding these symbols and using -D_POSIX works nicely for
readline, no patch needed anymore and it helps a lot with bash.

Then, I tried to build ncurses with the cross-libtool.  I found that
when libtool finds S_ISLNK is defined, it decides to use lstat.  So
instead of patching libtool, I went back to mingw-w64 and added lstat
variants alongside stat

    +#define _lstat32 _lstat
     #define _stat32 _stat

    +#define _lstat _lstat64i32
     #define _stat _stat64i32

     int __cdecl stat(const char *_Filename,struct stat *_Stat);
    +static inline int __cdecl lstat(const char *_Filename,struct stat *_Stat){return stat(_Filename, _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);}

That also helps with other packages that use lstat without testing (eg,
flex) and seems to be the right thing?

However, now libtool's redefinition of stat without redefining lstat

    # define stat    _stat

breaks lstat here

    +static inline int __cdecl lstat(const char *_Filename,struct stat *_Stat){return stat(_Filename, _Stat);}

Does that make sense?

Greetings,
Jan

Patch

From 7955f98d8c7608c5b46935577594bcc62c72afa0 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Wed, 4 May 2016 20:35:34 +0200
Subject: [PATCH 08/11] gnu: libtool: support cross-libtool mingw.

* gnu/packages/patches/libtool-mingw.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/autotools.scm (libtool): Support cross-libtool for mingw.
---
 gnu/packages/autotools.scm               |  3 ++-
 gnu/packages/patches/libtool-mingw.patch | 28 ++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/libtool-mingw.patch

diff --git a/gnu/packages/autotools.scm b/gnu/packages/autotools.scm
index ddc628d..30c0482 100644
--- a/gnu/packages/autotools.scm
+++ b/gnu/packages/autotools.scm
@@ -272,7 +272,8 @@  Makefile, simplifying the entire process for the developer.")
               (sha256
                (base32
                 "0vxj52zm709125gwv9qqlw02silj8bnjnh4y07arrz60r31ai1vw"))
-              (patches (search-patches "libtool-skip-tests2.patch"))))
+              (patches (search-patches "libtool-skip-tests2.patch"
+                                       "libtool-mingw.patch"))))
     (build-system gnu-build-system)
     (propagated-inputs `(("m4" ,m4)))
     (native-inputs `(("m4" ,m4)
diff --git a/gnu/packages/patches/libtool-mingw.patch b/gnu/packages/patches/libtool-mingw.patch
new file mode 100644
index 0000000..d406f63
--- /dev/null
+++ b/gnu/packages/patches/libtool-mingw.patch
@@ -0,0 +1,28 @@ 
+With lstat and _lstat are added to MinGW we need to #define lstat along with
+stat because #define'ing stat impacts struct stat, which would otherwise break
+lstat's signature.
+
+Jan Nieuwenhuizen
+
+Upstream status: not yet presented upstream.
+
+--- libtool-2.4.6/build-aux/ltmain.in~	2015-02-06 13:57:56.000000000 +0100
++++ libtool-2.4.6/build-aux/ltmain.in	2016-05-06 07:46:29.425142546 +0200
+@@ -3658,6 +3658,7 @@
+ # define S_IXUSR _S_IEXEC
+ #elif defined __MINGW32__
+ # define setmode _setmode
++# define lstat   _lstat
+ # define stat    _stat
+ # define chmod   _chmod
+ # define getcwd  _getcwd
+--- libtool-2.4.6/build-aux/ltmain.sh~	2015-02-15 17:15:12.000000000 +0100
++++ libtool-2.4.6/build-aux/ltmain.sh	2016-05-06 08:31:53.854857844 +0200
+@@ -5576,6 +5577,7 @@
+ # define S_IXUSR _S_IEXEC
+ #elif defined __MINGW32__
+ # define setmode _setmode
++# define lstat   _lstat
+ # define stat    _stat
+ # define chmod   _chmod
+ # define getcwd  _getcwd
-- 
2.7.3