Installing latest Hpricot on ruby 1.8.5 fails due missing macro RARRAYPTR:
[root@silver ~]# gem install hpricot Building native extensions. This could take a while... ERROR: Error installing hpricot: ERROR: Failed to build gem native extension. /usr/bin/ruby extconf.rb checking for main() in -lc... yes creating Makefile make gcc -I. -I. -I/usr/lib64/ruby/1.8/x86_64-linux -I. -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wall -fno-strict-aliasing -fPIC -c hpricot_css.c hpricot_css.rl: In function ‘hpricot_css’: hpricot_css.rl:106: warning: implicit declaration of function ‘RSTRING_PTR’ hpricot_css.rl:106: warning: assignment makes pointer from integer without a cast hpricot_css.rl:107: warning: implicit declaration of function ‘RSTRING_LEN’ hpricot_css.rl:82: warning: field precision should have type ‘int’, but argument 5 has type ‘long int’ hpricot_css.c:295: warning: comparison is always true due to limited range of data type [...] hpricot_css.c:3403: warning: comparison between pointer and integer hpricot_css.c:3403: warning: ‘eof’ is used uninitialized in this function hpricot_css.rl:92: warning: ‘aps’ may be used uninitialized in this function gcc -I. -I. -I/usr/lib64/ruby/1.8/x86_64-linux -I. -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wall -fno-strict-aliasing -fPIC -c hpricot_scan.c hpricot_scan.rl: In function ‘our_rb_hash_lookup’: hpricot_scan.rl:169: warning: implicit declaration of function ‘st_lookup’ hpricot_scan.rl: In function ‘make_hpricot_struct’: hpricot_scan.rl:693: warning: implicit declaration of function ‘RARRAYPTR’ hpricot_scan.rl:693: error: subscripted value is neither array nor pointer make: *** [hpricot_scan.o] Error 1 Gem files will remain installed in /usr/lib64/ruby/gems/1.8/gems/hpricot-0.8.1 for inspection. Results logged to /usr/lib64/ruby/gems/1.8/gems/hpricot-0.8.1/ext/hpricot_scan/gem_make.out
Searching with google I’ve found this post that explains equivalence of the RARRAYPTR(v) is RARRAY(v)->ptr . We’ll need to define RARRAYPTR macro.
We’ll replace occurences of #include <ruby.h> with #include “ruby_macros.h” and create an include file ruby_macros.h with the following content:
#ifndef __RUBY_MACROS__ #define __RUBY_MACROS__ #include <ruby.h> #ifndef RARRAYPTR # define RARRAYPTR(v) RARRAY(v)->ptr #endif #endif
[root@silver ~]# cd /usr/lib64/ruby/gems/1.8/gems/hpricot-0.8.1/ext/hpricot_scan [root@silver hpricot_scan]# sed -i 's,#include <ruby.h>,#include "ruby_macros.h",g' *.h *.c *.rl [root@silver hpricot_scan]# touch ruby_macros.h [root@silver hpricot_scan]# vi ruby_macros.h
The next step is to recreate the gem and install it:
[root@silver ~]# cd /usr/lib64/ruby/gems/1.8/gems/hpricot-0.8.1 [root@silver hpricot-0.8.1]# rake package (in /usr/lib64/ruby/gems/1.8/gems/hpricot-0.8.1) fatal: Not a git repository rm -r ext/fast_xs/Makefile rm -r ext/hpricot_scan/Makefile rm -r .config rm -r pkg rm -r hpricot-0.8.1-mswin32 rm -r hpricot-0.8.1-jruby Using ragel version: 6.3, location: /usr/bin/ragel cd ext/hpricot_scan ; ragel hpricot_scan.rl -G2 -o hpricot_scan.c && ragel hpricot_css.rl -G2 -o hpricot_css.c mkdir -p pkg mkdir -p pkg/hpricot-0.8.1 rm -f pkg/hpricot-0.8.1/CHANGELOG [...] cd pkg tar zcvf hpricot-0.8.1.tgz hpricot-0.8.1 hpricot-0.8.1/ hpricot-0.8.1/Rakefile [...] hpricot-0.8.1/ext/fast_xs/fast_xs.c cd - WARNING: description and summary are identical Successfully built RubyGem Name: hpricot Version: 0.8.1 File: hpricot-0.8.1.gem mv hpricot-0.8.1.gem pkg/hpricot-0.8.1.gem
[root@silver hpricot-0.8.1]# gem install pkg/hpricot-0.8.1.gem Building native extensions. This could take a while... Successfully installed hpricot-0.8.1 1 gem installed Installing ri documentation for hpricot-0.8.1... Installing RDoc documentation for hpricot-0.8.1... [root@silver hpricot_scan]# gem list -l | grep hpricot hpricot (0.8.1, 0.7, 0.6.164, 0.6.161, 0.6)