Search code examples
crubymakefileidn

"skipping incompatible" error in conftest


I believe the conftest lacks the correct flags, but I'm unable to figure out the problem looking at the contents of mkmf.log, which are included below. Any ideas would be appreciated!


have_library: checking for main() in -lidn... -------------------- no

"i486-linux-gnu-gcc -o conftest -I /backfire/staging_dir/host/include/ruby-1.9.1/i486-linux -I /backfire/staging_dir/host/include/ruby-1.9.1/ruby/backward -I /backfire/staging_dir/host/include/ruby-1.9.1 -I. -O2 -I /backfire/staging_dir/host/include -D_FILE_OFFSET_BITS=64 -O2 -I /backfire/staging_dir/host/include -O2 -I /backfire/staging_dir/host/include conftest.c -L. -L /backfire/staging_dir/host/lib -Wl,-R /backfire/staging_dir/host/lib -L. -rdynamic -Wl,-export-dynamic -Wl,-R -Wl, /backfire/staging_dir/host/lib -L /backfire/staging_dir/host/lib -lruby-static -lpthread -lrt -ldl -lcrypt -lm -lc" checked program was: /* begin / 1: #include "ruby.h" 2: 3: int main() {return 0;} / end */

"i486-linux-gnu-gcc -o conftest -I /backfire/staging_dir/host/include/ruby-1.9.1/i486-linux -I /backfire/staging_dir/host/include/ruby-1.9.1/ruby/backward -I /backfire/staging_dir/host/include/ruby-1.9.1 -I. -O2 -I /backfire/staging_dir/host/include -D_FILE_OFFSET_BITS=64 -O2 -I /backfire/staging_dir/host/include -O2 -I /backfire/staging_dir/host/include conftest.c -L. -L /backfire/staging_dir/host/lib -Wl,-R /backfire/staging_dir/host/lib -L. -rdynamic -Wl,-export-dynamic -Wl,-R -Wl, /backfire/staging_dir/host/lib -L /backfire/staging_dir/host/lib -lruby-static -lidn -lpthread -lrt -ldl -lcrypt -lm -lc" /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.so when searching for -lidn /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.a when searching for -lidn /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.so when searching for -lidn /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.a when searching for -lidn /usr/bin/ld: cannot find -lidn collect2: ld returned 1 exit status checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /top/ 4: int main() {return 0;} 5: int t() { void ((volatile p)()); p = (void (()()))main; return 0; } /* end */

"i486-linux-gnu-gcc -o conftest -I /backfire/staging_dir/host/include/ruby-1.9.1/i486-linux -I /backfire/staging_dir/host/include/ruby-1.9.1/ruby/backward -I /backfire/staging_dir/host/include/ruby-1.9.1 -I. -O2 -I /backfire/staging_dir/host/include -D_FILE_OFFSET_BITS=64 -O2 -I /backfire/staging_dir/host/include -O2 -I /backfire/staging_dir/host/include conftest.c -L. -L /backfire/staging_dir/host/lib -Wl,-R /backfire/staging_dir/host/lib -L. -rdynamic -Wl,-export-dynamic -Wl,-R -Wl, /backfire/staging_dir/host/lib -L /backfire/staging_dir/host/lib -lruby-static -lidn -lpthread -lrt -ldl -lcrypt -lm -lc" /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.so when searching for -lidn /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.a when searching for -lidn /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.so when searching for -lidn /usr/bin/ld: skipping incompatible /backfire/staging_dir/host/lib/libidn.a when searching for -lidn /usr/bin/ld: cannot find -lidn collect2: ld returned 1 exit status checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /top/ 4: int main() {return 0;} 5: int t() { main(); return 0; } /* end */


Solution

  • Ruby's mkmf.rb is using the native compiler to test for libidn, but because your target is MIPS, it needs to use a cross compiler instead. I'm assuming the libidn.so and libidn.a files listed in your mkmf.log were built for MIPS. Because the native i486 compiler needs i486 libraries, it reports the "skipping incompatible" error when it encounters the MIPS files.

    I think you will need to modify the extconf.rb file to point to the cross compiler. Something like:

    require 'mkmf'
    
    CONFIG['CC'] = '/path/to/mips-gcc'
    

    Additionally, you will likely need to point mkmf.rb to the Ruby header files for MIPS. I'm not sure what all needs to be set, but I'd guess at least CONFIG['arch'] and CONFIG['archdir'] should be overridden in the extconf.rb file.