Building Thin on Win/Ruby 1.9.2: gem install eventmachine --pre

posted 2010-Nov-15

I have to deploy a web application on Windows 2003 Server here at work. Due to a bug I was experiencing with Ruby 1.9.1 I was forced to upgrade the environment to Ruby 1.9.2 (along with DevKit 4.5.0). The applications I write nowadays tend to be based on Sinatra and served by Thin; this application was no different. Thin requires EventMachine, but I had trouble getting it installed.

Attempting to just install the eventmachine gem fails:

C:\>gem install eventmachine
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing eventmachine:
        ERROR: Failed to build gem native extension.

C:/Ruby/bin/ruby.exe extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... yes
checking for inotify_init() in sys/inotify.h... no
checking for __NR_inotify_init in sys/syscall.h... no
checking for writev() in sys/uio.h... no
checking for rb_thread_check_ints()... yes
checking for rb_time_new()... yes
checking for windows.h... yes
checking for winsock.h... yes
checking for main() in -lkernel32... yes
checking for main() in -lrpcrt4... yes
checking for main() in -lgdi32... yes
checking for main() in -lssl... no
creating Makefile

make
g++ -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. -DBUILD_FOR_RUBY -DHAVE_RB_THREAD_BLOCKING_REGION -DHAVE_TBR -DHAVE_RB_THREAD_CHECK_INTS -DHAVE_RB_TIME_NEW -DOS_W
IN32 -DHAVE_WINDOWS_H -DHAVE_WINSOCK_H -DWITHOUT_SSL -DHAVE_MAKE_PAIR    -O3 -g -Wextra -Wno-unused-parameter -Wno-paren
theses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long   -o binder.o -c binder.cpp
In file included from project.h:137:0,
                 from binder.cpp:20:
binder.h:35:34: warning: type qualifiers ignored on function return type
In file included from project.h:138:0,
                 from binder.cpp:20:
em.h:91:47: warning: type qualifiers ignored on function return type
em.h:92:76: warning: type qualifiers ignored on function return type
em.h:93:56: warning: type qualifiers ignored on function return type
em.h:95:57: warning: type qualifiers ignored on function return type
em.h:96:60: warning: type qualifiers ignored on function return type
em.h:97:58: warning: type qualifiers ignored on function return type
em.h:98:55: warning: type qualifiers ignored on function return type
em.h:99:36: warning: type qualifiers ignored on function return type
em.h:101:47: warning: type qualifiers ignored on function return type
em.h:106:42: warning: type qualifiers ignored on function return type
em.h:123:45: warning: type qualifiers ignored on function return type
em.h:132:36: warning: type qualifiers ignored on function return type
In file included from project.h:145:0,
                 from binder.cpp:20:
eventmachine.h:45:61: warning: type qualifiers ignored on function return type
eventmachine.h:46:112: warning: type qualifiers ignored on function return type
eventmachine.h:47:69: warning: type qualifiers ignored on function return type
eventmachine.h:49:73: warning: type qualifiers ignored on function return type
eventmachine.h:62:75: warning: type qualifiers ignored on function return type
eventmachine.h:63:74: warning: type qualifiers ignored on function return type
eventmachine.h:64:77: warning: type qualifiers ignored on function return type
eventmachine.h:65:41: warning: type qualifiers ignored on function return type
In file included from project.h:145:0,
                 from binder.cpp:20:
eventmachine.h:99:60: warning: type qualifiers ignored on function return type
eventmachine.h:100:58: warning: type qualifiers ignored on function return type
eventmachine.h:102:60: warning: type qualifiers ignored on function return type
eventmachine.h:105:41: warning: type qualifiers ignored on function return type
g++ -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. -DBUILD_FOR_RUBY -DHAVE_RB_THREAD_BLOCKING_REGION -DHAVE_TBR -DHAVE_RB_THREAD_CHECK_INTS -DHAVE_RB_TIME_NEW -DOS_WIN32 -DHAVE_WINDOWS_H -DHAVE_WINSOCK_H -DWITHOUT_SSL -DHAVE_MAKE_PAIR    -O3 -g -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long   -o cmain.o -c cmain.cpp
In file included from project.h:137:0,
                 from cmain.cpp:20:
binder.h:35:34: warning: type qualifiers ignored on function return type
In file included from project.h:138:0,
                 from cmain.cpp:20:
em.h:91:47: warning: type qualifiers ignored on function return type
em.h:92:76: warning: type qualifiers ignored on function return type
em.h:93:56: warning: type qualifiers ignored on function return type
em.h:95:57: warning: type qualifiers ignored on function return type
em.h:96:60: warning: type qualifiers ignored on function return type
em.h:97:58: warning: type qualifiers ignored on function return type
em.h:98:55: warning: type qualifiers ignored on function return type
em.h:99:36: warning: type qualifiers ignored on function return type
em.h:101:47: warning: type qualifiers ignored on function return type
em.h:106:42: warning: type qualifiers ignored on function return type
em.h:123:45: warning: type qualifiers ignored on function return type
em.h:132:36: warning: type qualifiers ignored on function return type
In file included from project.h:145:0,
                 from cmain.cpp:20:
eventmachine.h:45:61: warning: type qualifiers ignored on function return type
eventmachine.h:46:112: warning: type qualifiers ignored on function return type
eventmachine.h:47:69: warning: type qualifiers ignored on function return type
eventmachine.h:49:73: warning: type qualifiers ignored on function return type
eventmachine.h:62:75: warning: type qualifiers ignored on function return type
eventmachine.h:63:74: warning: type qualifiers ignored on function return type
eventmachine.h:64:77: warning: type qualifiers ignored on function return type
eventmachine.h:65:41: warning: type qualifiers ignored on function return type
In file included from project.h:145:0,
                 from cmain.cpp:20:
eventmachine.h:99:60: warning: type qualifiers ignored on function return type
eventmachine.h:100:58: warning: type qualifiers ignored on function return type
eventmachine.h:102:60: warning: type qualifiers ignored on function return type
eventmachine.h:105:41: warning: type qualifiers ignored on function return type
cmain.cpp:98:71: warning: type qualifiers ignored on function return type
cmain.cpp:109:122: warning: type qualifiers ignored on function return type
cmain.cpp:119:79: warning: type qualifiers ignored on function return type
cmain.cpp:129:83: warning: type qualifiers ignored on function return type
cmain.cpp:260:85: warning: type qualifiers ignored on function return type
cmain.cpp:270:84: warning: type qualifiers ignored on function return type
cmain.cpp:280:88: warning: type qualifiers ignored on function return type
cmain.cpp:290:51: warning: type qualifiers ignored on function return type
cmain.cpp:300:70: warning: type qualifiers ignored on function return type
cmain.cpp:320:55: warning: type qualifiers ignored on function return type
cmain.cpp:546:70: warning: type qualifiers ignored on function return type
cmain.cpp:669:68: warning: type qualifiers ignored on function return type
cmain.cpp: In function 'int evma_send_file_data_to_connection(long unsigned int, const char*)':
cmain.cpp:752:6: error: cannot convert 'stat*' to '_stati64*' for argument '2' to 'int _fstati64(int, _stati64*)'
make: *** [cmain.o] Error 1


Gem files will remain installed in C:/Ruby/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10 for inspection.
Results logged to C:/Ruby/lib/ruby/gems/1.9.1/gems/eventmachine-0.12.10/ext/gem_make.out

I read on several forum posts that I had to get the latest source from GitHub, but attempting to build the gem there failed (albeit in a different way):

C:\eventmachine>rake build
(in C:/eventmachine)
cd ext
C:/Ruby/bin/ruby.exe extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=C:/Ruby/bin/ruby
C:/Ruby/lib/ruby/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:446:in `try_compile'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:568:in `try_var'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:816:in `block in have_var'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:693:in `block in checking_for'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block in postpone'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:276:in `postpone'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:692:in `checking_for'
        from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:815:in `have_var'
        from extconf.rb:16:in `
' rake aborted! Command failed with status (1): [C:/Ruby/bin/ruby.exe extconf.rb...] C:/Ruby/lib/ruby/1.9.1/rake.rb:993:in `block in sh' C:/Ruby/lib/ruby/1.9.1/rake.rb:1008:in `call' C:/Ruby/lib/ruby/1.9.1/rake.rb:1008:in `sh' C:/Ruby/lib/ruby/1.9.1/rake.rb:1092:in `sh' C:/Ruby/lib/ruby/1.9.1/rake.rb:1027:in `ruby' C:/Ruby/lib/ruby/1.9.1/rake.rb:1092:in `ruby' C:/eventmachine/Rakefile:148:in `block (3 levels) in ' C:/Ruby/lib/ruby/1.9.1/fileutils.rb:121:in `chdir' C:/Ruby/lib/ruby/1.9.1/fileutils.rb:121:in `cd' C:/Ruby/lib/ruby/1.9.1/rake.rb:1092:in `chdir' C:/eventmachine/Rakefile:147:in `block (2 levels) in ' C:/Ruby/lib/ruby/1.9.1/rake.rb:634:in `call' C:/Ruby/lib/ruby/1.9.1/rake.rb:634:in `block in execute' C:/Ruby/lib/ruby/1.9.1/rake.rb:629:in `each' C:/Ruby/lib/ruby/1.9.1/rake.rb:629:in `execute' C:/Ruby/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' C:/Ruby/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `each' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' C:/Ruby/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `each' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' C:/Ruby/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `each' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' C:/Ruby/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `each' C:/Ruby/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' C:/Ruby/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' C:/Ruby/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' C:/Ruby/lib/ruby/1.9.1/rake.rb:581:in `invoke' C:/Ruby/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task' C:/Ruby/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level' C:/Ruby/lib/ruby/1.9.1/rake.rb:2019:in `each' C:/Ruby/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level' C:/Ruby/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' C:/Ruby/lib/ruby/1.9.1/rake.rb:2013:in `top_level' C:/Ruby/lib/ruby/1.9.1/rake.rb:1992:in `run' C:/Ruby/bin/rake:31:in `
'

The key to success was given by tmm1 on the #eventmachine IRC channel (on Freenode.net):

gem install eventmachine --pre

Using the above caused the gem to install without problem, and I was then able to install Thin (gem install thin) without further incident. I'm told that this should not be necessary 'soon', but for now, there's the answer.

net.mind details contact résumé other
Phrogz.net