Bug #1884: ftruncate conflict with mingw32 3.4.5
http://redmine.ruby-lang.org/issues/show/1884

Author: Matt Hulse
Status: Open, Priority: Normal
Category: core
ruby -v: ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32]

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.


----------------------------------------
http://redmine.ruby-lang.org