From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Nieuwenhuizen Subject: Re: [PATCH 08/11] gnu: libtool: support cross-libtool mingw. Date: Sat, 14 May 2016 22:27:03 +0200 Message-ID: <87vb2g9yi0.fsf@drakenvlieg.flower> References: <1462740169-15029-1-git-send-email-janneke@gnu.org> <1462740169-15029-9-git-send-email-janneke@gnu.org> <87y47j1xzz.fsf@igalia.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:41832) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b1gEg-000652-6k for guix-devel@gnu.org; Sat, 14 May 2016 16:32:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b1gEb-0007h4-KJ for guix-devel@gnu.org; Sat, 14 May 2016 16:32:29 -0400 In-Reply-To: <87y47j1xzz.fsf@igalia.com> (Andy Wingo's message of "Mon, 09 May 2016 09:39:12 +0200") List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Andy Wingo Cc: guix-devel@gnu.org --=-=-= Content-Type: text/plain 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 > 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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0008-gnu-libtool-support-cross-libtool-mingw.patch >From 7955f98d8c7608c5b46935577594bcc62c72afa0 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen 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 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Jan Nieuwenhuizen | GNU LilyPond http://lilypond.org Freelance IT http://JoyofSource.com | Avatar=C2=AE http://AvatarAcademy.nl= =20=20 --=-=-=--