[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 08/11] gnu: libtool: support cross-libtool mingw.
From: |
Jan Nieuwenhuizen |
Subject: |
Re: [PATCH 08/11] gnu: libtool: support cross-libtool mingw. |
Date: |
Sat, 14 May 2016 22:27:03 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
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 <address@hidden>
> 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
>From 7955f98d8c7608c5b46935577594bcc62c72afa0 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <address@hidden>
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
--
Jan Nieuwenhuizen <address@hidden> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | AvatarĀ® http://AvatarAcademy.nl