[gambit-list] compiling Gambit 4.6.3 under MinGW/MSys
REPLeffect
repleffect at gmail.com
Wed Feb 1 00:06:42 EST 2012
On 1/31/12, Marc Feeley <feeley at iro.umontreal.ca> wrote:
>
> On 2012-01-31, at 3:43 AM, REPLeffect wrote:
>
>> I just thought I'd share this in case it helps someone else.
>>
>> To compile Gambit 4.6.3 in the MinGW/MSys shell, I had to add the
>> following flags to the gcc commands for compiling C files to object
>> files:
>>
>> -fpermissive -fno-keep-inline-dllexport
>>
>> Recent versions of MinGW use gcc version 4.6.1, which I suspect has
>> stricter default requirements on the C code than prior versions of
>> gcc, and I believe that's why I had to add -fpermissive.
>>
>> The -fno-keep-inline-dllexport flag was added because I was getting an
>> out of memory error compiling at least one C file.
>>
>> I also added -Wno-write-strings because I was tired of warning messages.
>>
>> It's a bit of a hack (and I'm sure there is a more correct place to
>> put this), but I modified the configure script to do this by adding it
>> in the FLAGS_OBJ line here:
>>
>> case "$target_os" in
>>
>> mingw*) # add Windows libraries needed by MinGW
>> LIBS="$LIBS -lws2_32"
>> FLAGS_OBJ="$FLAGS_OBJ -D_WINDOWS -Wno-write-strings
>> -fpermissive -fno-keep-inline-dllexport"
>>
>> If Marc (or others) want more detail, I'd be happy to oblige. I can
>> extract the 4.6.3 tar file somewhere else and try to build it, and not
>> the exact error messages, etc.
>
> Note that -fpermissive is specific to C++. Were you using
> --enable-cplusplus? Moreover, the documentation says:
>
> -fpermissive
> Downgrade some diagnostics about nonconformant code from errors
> to
> warnings. Thus, using -fpermissive will allow some nonconforming
> code to compile.
>
> Now, why did you have to use this option? Can you send me the error message
> that were generated? I don't want to add this option to the default
> compilation options because it implies that the Gambit sources have some
> nonconformance issue, and that shouldn't be the case.
>
> Marc
>
>
Yes, I am compiling the code using the C++ compiler. I am configuring
with:
./configure --enable-single-host --enable-cplusplus
I just untarred the v4.6.3 tarball and reconfigured it with those
options. After starting the build, the first set of errors showed up
in os_tty.c:
os_tty.c:3399:52: error: invalid conversion from 'unsigned char*' to
'LPCSTR {aka const char*}' [-fpermissive]
c:\mingw\bin\../lib/gcc/mingw32/4.6.1/../../../../include/winuser.h:4084:24:
error: initializing argument 2 of 'BOOL SetWindowTextA(HWND,
LPCSTR)' [-fpermissive]
os_tty.c: In function 'int
lineeditor_copy_to_clipboard(___device_tty*, unsigned int*, int)':
os_tty.c:4499:60: error: invalid conversion from 'LPVOID {aka void*}'
to 'short unsigned int*' [-fpermissive]
os_tty.c: In function 'int
lineeditor_paste_from_clipboard(___device_tty*)':
os_tty.c:4584:60: error: invalid conversion from 'LPVOID {aka void*}'
to 'short unsigned int*' [-fpermissive]
make[1]: *** [os_tty.o] Error 1
make[1]: Leaving directory `/f/tst/gambc-v4_6_3-devel/lib'
make: *** [all-recursive] Error 1
A few simple casts got me past those errors (without the -fpermissive
switch being turned on):
diff --git a/lib/os_tty.c b/lib/os_tty.c
index e833328..a0abb96 100644
--- a/lib/os_tty.c
+++ b/lib/os_tty.c
@@ -3396,7 +3396,7 @@ ___U8 *text_arg;)
{
if (text_arg != NULL)
{
- SetWindowTextA (cons_wind, text_arg); /* ignore error
*/
+ SetWindowTextA (cons_wind, (LPCSTR)text_arg); /*
ignore error */
}
else
{
@@ -4496,7 +4496,7 @@ int len;)
if (global_copy != NULL)
{
- ___U16 *locked_copy = GlobalLock (global_copy);
+ ___U16 *locked_copy = (___U16*)GlobalLock
(global_copy);
if (locked_copy == NULL)
GlobalFree (global_copy);
@@ -4581,7 +4581,7 @@ ___device_tty *self;)
if (global_copy != NULL)
{
- ___U16 *locked_copy = GlobalLock (global_copy);
+ ___U16 *locked_copy = (___U16*)GlobalLock
(global_copy);
if (locked_copy != NULL)
{
C++ purists will say I should have used static_cast<___U16*>( ... ),
etc. OK, well I didn't :-D
Interestingly enough, this time I was able to get v4.6.3 to
successfully compile without using -fno-keep-inline-dllexport.
The machine I'm compiling on only has 1 GB of RAM, and the last time I
compiled I probably had other programs running on the machine that
were consuming a lot of memory. Basically nothing else was running
while doing this test compile. However, I do know that in recent past
attempts I *have* received an out-of-memory error when compling Gambit
without the -fno-keep-inline-dllexport option. I have also used that
option to get past out-of-memory errors when compiling my own programs
written in Gambit Scheme (some of which use a fair bit of memory and
are sometimes compiled on machines that are memory-constrained)
As a final test, I started over with a fresh copy ov v4.6.3, applied
the above patch, and ran a make bootstrap, make update, and
make install -- all of which worked wonderfully, without the
-fpermissive switch being used.
BTW Marc, the MinGW "make check" and shell-command(bug 152) fixes you
recently applied work great on my MingW-compiled copy of Gambit also.
Thanks, and let me know if there's any more information you need on
this.
More information about the Gambit-list
mailing list