Bug #1884 [ruby-core:24757]
ftruncate conflict with mingw32 3.4.5
| Status : | Open | Start : | 08/05/2009 | |
| Priority : | Normal | Due date : | ||
| Assigned to : | Nobuyoshi Nakada | % Done : | 0% |
|
| Category : | core | |||
| Target version : | - | |||
| ruby -v : | ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32] |
Description
I have been testing some gems on WinXP SP2, Ruby 1.9.1-p129 mingw32 installer and devkit from rubyinstaller.org. The following output is from an attempt to install FFI:
C:\>ruby -v
ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32]
C:\>gem install ffi
Building native extensions. This could take a while...
ERROR: Error installing ffi:
ERROR: Failed to build gem native extension.
C:/Ruby/bin/ruby.exe extconf.rb
checking for ffi_closure_alloc() in -lffi... no
creating Makefile
creating extconf.h
make
[...]
gcc -I. -IC:/Ruby/include/ruby-1.9.1/i386-mingw32 -I/C/Ruby/include/ruby-1.9.1/ruby/backward -I/C/Ruby/include/ruby-1.9.1 -I. -I/c/Ruby/lib/ruby/gems/1.9.1/gems/ffi-0.3.5/ext/ffi_c -I/c/Ruby/lib/ruby/gems/1.9.1/gems/ffi-0.3.5/ext/ffi_c/libffi/include -DHAVE_EXTCONF_H -Werror -Wunused -Wformat -I/c/Ruby/lib/ruby/gems/1.9.1/gems/ffi-0.3.5/ext/ffi_c -I/c/Ruby/lib/ruby/gems/1.9.1/gems/ffi-0.3.5/ext/ffi_c/libffi/include -O2 -g -Wall -Wno-parentheses -o Invoker.o -c Invoker.c
In file included from c:/Ruby/include/ruby-1.9.1/ruby/defines.h:192,
from c:/Ruby/include/ruby-1.9.1/ruby/ruby.h:70,
from c:/Ruby/include/ruby-1.9.1/ruby.h:32,
from Invoker.c:11:
c:/Ruby/include/ruby-1.9.1/ruby/win32.h:341: error: conflicting types for 'ftruncate'
C:/Ruby/devkit/gcc/3.4.5/bin/../lib/gcc/mingw32/3.4.5/../../../../include/unistd.h:43: error: previous definition of 'ftruncate' was here
c:/Ruby/include/ruby-1.9.1/ruby/win32.h:341: error: conflicting types for 'ftruncate'
C:/Ruby/devkit/gcc/3.4.5/bin/../lib/gcc/mingw32/3.4.5/../../../../include/unistd.h:43: error: previous definition of 'ftruncate' was here
make: *** [Invoker.o] Error 1
Apparently Ruby 1.9.1 redefines ftruncate in win32.h:341 which conflicts with mingw32. I can get the gem to compile by wrapping line 341 in win32.h with the following:
#if !defined __MINGW32__
extern int ftruncate(int fd, off_t length);
#endif
Luis from rubyinstaller mentioned that it may be better to check whether ftruncate is defined rather than __MINGW32__ just in case certain versions of mingw don't define ftruncate, but I'm not sure how to do that.