| Bill Allombert on Tue, 22 Dec 2009 23:17:00 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: A patch for native PARI/GP build on Windows (Mingw+Msys) |
On Tue, Dec 22, 2009 at 06:05:15PM +0200, Vasili Burdo wrote:
> Hi, Bill!
>
> Sorry for late reply. I had VERY busy week start.
No problem. I just commited a slightly reduced version of your patch
which work on my cross-compiler+wine set up. Please check for any problem
on the real thing and please repost the part of the patches I did not apply
but you feel are still needed.
>>> Index: config/get_dlld
>>> ===================================================================
>>> --- config/get_dlld (revision 12034)
>>> +++ config/get_dlld (working copy)
>>> @@ -27,6 +27,7 @@
>>> # On FreeBSD 2.2.5 (Y. Uchikawa) and Cygwin, this does not work.
>>> case "$osname" in freebsd|cygwin)
>>> DL_DFLT_NAME="\\\"\$(LIBPARI_DYN)\\\"" ;;
>>> + mingw) DL_DFLT_NAME="\\\"\$(LIBPARI_SO)\\\"" ;;
>>> *) DL_DFLT_NAME=NULL ;;
>>> esac
>>
>> Do you know why DL_DFLT_NAME=$(LIBPARI_DYN) does not work here ? It did not
>> work with wine and this is strange because LIBPARI_SO is a symlink to
>> LIBPARI_DYN.
> The problem is that Windows does not support symlinks. As result, we
> should maintain two copies: libpari.dll (because gp-dyn links to it) and
> libpari-2.4.dll (for install0).
> I think keeping two copies is redundant.
You did not quite answer my question. Since LIBPARI_SO is a symlink for
LIBPARI_DYN, I would expect DL_DFLT_NAME="\\\"\$(LIBPARI_DYN)\\\"" to
work better than DL_DFLT_NAME="\\\"\$(LIBPARI_SO)\\\"", but it is not
the case. Do you know why ?
>>> @@ -84,6 +85,7 @@
>>> case "$osname" in
>>> os2) DLLDFLAGS="$CFLAGS -Zdll" ;; # assume DLLD = gcc
>>> cygwin) DLLDFLAGS="-Wl,--out-implib=\$(LIBPARI_SO)\$(_A),--export-all-symbols";;
>>> + mingw) DLLDFLAGS="-Wl,--out-implib=\$(LIBPARI_SO)\$(_A)";;
>>> esac
>>> if test -n "$DLLDisGCC"; then
>>> case "$arch" in
>>
>> Do you know why this is different from cygwin ?
> IMHO --export-all-symbols is overkill. It exports all public symbols
> including symbols from static libgmp and gcc runtime. I think it's
> redundant.
> A better way is to export only public symbols from libpari object files.
> I implemented makefile rule (see Makefile.SH diff) which generates
> $(EXPORT_FILE) for Windows DLL. I think this rule can be used for cygwin
> as well.
I agree with you.
>>> Index: config/Makefile.SH
>>> ===================================================================
>>> --- config/Makefile.SH (revision 12034)
>>> +++ config/Makefile.SH (working copy)
>>> @@ -48,6 +48,10 @@
>>> export_file=pari.def; export_create="emxexp -u"
>>> # Actually, the build will fail until the switch to -Zomf
>>> dlld_ignore=- ;;
>>> + mingw)
>>> + CFLAGS="$CFLAGS -fno-omit-frame-pointer"
>>> + export_file='$(LIBPARI).def'
>>> + ;;
>>> esac
>>
>> What is the purpose of 'CFLAGS="$CFLAGS -fno-omit-frame-pointer"' ?
> -fomit-frame-pointer ruins setjmp-based error handling - GP produces a
> lot of "Segfault" error messages. I dont understand why it happens, but
> -fno-omit-frame-pointer fixes it.
> Probably, there is better place for this option, but I didnt find it yet.
Strange, I did not see any problem with wine.
>>> Index: src/systems/mingw/mingw.c
>>> ===================================================================
>>> --- src/systems/mingw/mingw.c (revision 0)
>>> +++ src/systems/mingw/mingw.c (revision 0)
>>> @@ -0,0 +1,93 @@
>>> +#include <windows.h>
>>> +#include <stdio.h>
>>> +
>>> +const char* +win32_GPDATADIR()
>>> +{
>>> + static char datadir[1024] = {0};
>>> + if( 0 == *datadir ) {
>>> + char* slash;
>>> + GetModuleFileNameA(0, datadir, sizeof(datadir) );
>>> + slash = strrchr(datadir, '\\');
>>> + if( slash ) *(slash+1) = 0;
>>> + //while( (slash = strchr(datadir, '\\')) )
>>> + // *slash = '/';
>>> + strcat(datadir, "gp-data");
>>> + }
>>> + return datadir;
>>> +}
>>
>> I do not understand what this is doing. Cannot you do that in Configure
>> instead ?
> It generates default GPDATADIR based on location of executable module.
> Let's have gp.exe at "C:\Program Files\GP\gp.exe". Then, this function
> will return GPDATADIR as "C:\Program Files\GP\gp-data"
>
> The problem is that fixed path "/usr/local/share/pari" does not make any
> sense on Windows. I'd like to keep data along with executable module, so
> I can put it on memory stick and use it everywhere without extra
> reconfiguration.
>
> On Windows standard location for data files is something like
> "C:\Documents and Settings\(User Name|All Users)\Application
> Data\(Software Name)" and it may change depend on location where Windows
> is installed.
> So, I believe my approach is correct, but we should negotiate correct
> location of GP data dir.
I agree with your approach. I suggest to do things a bit differently:
We define a special value DYNDATADIR for GPDATADIR (say DYNDATADIR="" ) and
we test if GPDATADIR is equal to DYNDATADIR, and in that case we set
datadir to win32_GPDATADIR instead of GPDATADIR.
We change Configure to set GPDATADIR to DYNDATADIR by default.
Cheers,
Bill.