I’m trying to cross-compile Nokogiri from one Linux platform to another.
After a lot of digging around (especially since I’m new to Ruby), I went
with the following approach:
Cross-compile a version of Ruby for the target platform. This
cross-compiled Ruby will contain a file called rbconfig.rb that contains
build information (compiler flags used, paths to standard directories,
etc.). This build information is used when building native extensions.
Configure (produce a Makefile for) Nokogiri’s native extension by
running the following command in Nokogiri’s root (with irrelevant flags
ruby -Cext/nokogiri -I<dir_of_rbconfig.rb> extconf.rb …
The ‘ruby’ used here is the native one, not the cross-compiled one, but
rbconfig.rb comes from the cross-compiled ‘ruby’. The native and
cross-compiled rubies are the same version. extconf.rb uses mkmf to
build the Makefile, and mkmf in turn uses build information from
Build the native extension as follows:
This approach seems to almost work, but runs into trouble for one
reason: The cross-compiled Ruby is installed into a custom sysroot
directory (with e.g. the main ruby executable at
/home/ulf/target-sysroot/usr/bin/ruby), while the paths in rbconfig.rb
seem to assume installation into / (where the ruby executable would be
The variable DESTDIR (not to be confused with $(DESTDIR), which comes
from the Makefile) in rbconfig.rb looks promising, but is not sufficient
as it is not prepended to e.g. CONFIG[“libdir”].
The generated Makefile also has a DESTDIR. Just setting DESTDIR in the
Makefile won’t work though as mkmf needs correct paths when looking for
headers and the like during configuration.
After the above mind dump, my questions are as follows:
Is rbconfig.rb’s DESTDIR meant to solve problems like this? What
exactly is its purpose?
Why is there an additional DESTDIR in the Makefile? Is its purpose