Bill Allombert on Thu, 24 Dec 2009 12:31:31 +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 Wed, Dec 23, 2009 at 06:15:33PM +0200, Vasili Burdo wrote:
>> Please check for any problem on the real thing
> - implemented unzipping from .zip archives I mentioned in previous post.
>   See pari_get_infile(). If this function sees ".zip/" substring in
>   file name, it tries to pipe it through "unzip -p".
>   As result, it's possible it set GPDATADIR to something like  
> "/path/path/gpdata.zip".

I would like to postpone that chnages for now. 

> - removed "-wb" option from diff command in dotest. Instead, "sed -e  
> 's/\r//'" used as you suggested. The same way dotest should be fixed in  
> gp2c sources

Does that actually work ? if \r is part of the line ending, then sed will not see it.

> - reimplemented -fno-omit-frame-pointer hack. See file config/get_cc

done.

> - added mingw support to config/get_modld - it's neccessary for gp2c  
> interoperability

done ?

>> 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.
> I don't quite understand how it will work, so please, do it yourself.

Please see the attached patch.

Cheers,
Bill.
diff --git a/config/get_install b/config/get_install
index a485dea..821de34 100644
--- a/config/get_install
+++ b/config/get_install
@@ -24,7 +24,11 @@ echo $n "...for architecture-independent files (share-prefix) ? $c"
 dflt=$share_prefix; . ./myread; share_prefix=$ans
 
 dfltman=$share_prefix/man/man1
-dfltdata=$share_prefix/pari
+
+case $osname in
+  mingw) dfltdata="";;
+  *) dfltdata=$share_prefix/pari;;
+esac
 
 echo "Installation directories for:"
 echo $n ..."executables (gp, gphelp) ? $c"
diff --git a/src/gp/gp.c b/src/gp/gp.c
index 71f2887..8fc8cf7 100644
--- a/src/gp/gp.c
+++ b/src/gp/gp.c
@@ -358,14 +358,16 @@ static void
 community(void)
 {
   pari_sp av = avma;
-  char *s = stackmalloc(strlen(GPDATADIR) + 1024);
+  char *gpdat= pari_gpdatadir();
+  char *s = stackmalloc(strlen(gpdat) + 1024);
 
   (void)sprintf(s, "The standard distribution of GP/PARI includes a \
 reference manual, a tutorial, a reference card and quite a few examples. They \
 should have been installed in the directory '%s'. If not, ask the person \
 who installed PARI on your system where they can be found. You can also \
 download them from the PARI WWW site 'http://pari.math.u-bordeaux.fr/'.",
-GPDATADIR);
+gpdat);
+  free(gpdat);
   print_text(s); avma = av;
 
   pari_puts("\nThree mailing lists are devoted to PARI:\n\
diff --git a/src/headers/paridecl.h b/src/headers/paridecl.h
index 4835278..b4fae4f 100644
--- a/src/headers/paridecl.h
+++ b/src/headers/paridecl.h
@@ -1398,6 +1398,7 @@ pariFILE* pari_fopen_or_fail(const char *s, const char *mode);
 pariFILE* pari_fopengz(const char *s);
 void    pari_fprintf(FILE *file, const char *fmt, ...);
 char*   pari_get_homedir(const char *user);
+char *  pari_gpdatadir(void);
 int     pari_is_dir(const char *name);
 int     pari_is_file(const char *name);
 void    pari_printf(const char *fmt, ...);
diff --git a/src/language/es.c b/src/language/es.c
index 383c6fd..69944c9 100644
--- a/src/language/es.c
+++ b/src/language/es.c
@@ -4335,3 +4335,13 @@ pari_unique_dir(const char *s)
     pari_err(talker,"couldn't find a suitable name for a tempdir (%s)",s);
   return buf;
 }
+
+char *
+pari_gpdatadir(void)
+{
+  const char *gpdat=GPDATADIR;
+#ifdef _WIN32
+  if (*gpdat==0) return win32_datadir();
+#endif
+  return strdup(gpdat);
+}
diff --git a/src/language/init.c b/src/language/init.c
index d8c81b8..fdc0d90 100644
--- a/src/language/init.c
+++ b/src/language/init.c
@@ -493,8 +493,8 @@ pari_init_defaults(void)
   pari_logfile = NULL;
 
   pari_datadir = os_getenv("GP_DATA_DIR");
-  if (!pari_datadir) pari_datadir = (char*)GPDATADIR;
-  if (pari_datadir) pari_datadir = pari_strdup(pari_datadir);
+  if (!pari_datadir) pari_datadir = pari_gpdatadir();
+  else               pari_datadir = pari_strdup(pari_datadir);
 
   next_block = 0;
   for (i=0; i<c_LAST; i++) gp_colors[i] = c_NONE;
diff --git a/src/systems/mingw/mingw.c b/src/systems/mingw/mingw.c
index 5f281de..688e8cc 100644
--- a/src/systems/mingw/mingw.c
+++ b/src/systems/mingw/mingw.c
@@ -19,6 +19,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 #include <stdio.h>
 #include "mingw.h"
 
+char* win32_datadir(void)
+{
+  char datadir[1024];
+  char* slash;
+  GetModuleFileNameA(0, datadir, sizeof(datadir) );
+  slash = strrchr(datadir, '\\');
+  if( slash ) *(slash+1) = 0;
+  strcat(datadir, "gp-data");
+  return strdup(datadir);
+}
+
 static WORD
 win32_console_color(unsigned long c)
 {
diff --git a/src/systems/mingw/mingw.h b/src/systems/mingw/mingw.h
index e3d6aa9..fb1d01a 100644
--- a/src/systems/mingw/mingw.h
+++ b/src/systems/mingw/mingw.h
@@ -15,6 +15,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 
 /* Written by Vasili Burdo */
 
+char* win32_datadir(void);
 void win32_ansi_fputs(const char* s, void* f);
 int win32_terminal_width(void);
 int win32_terminal_height(void);