I sent this message earlier today, but looks like the message disappeared while the server
was disconnected from the world.
That is one of the strangest include file directory
trees I
have seen!
I (and the TDE compilation process) would expect to see:
/usr/include/i486-linux/ruby-1.9.1/
or
/usr/include/ruby-1.9.1/
or
/usr/include/
but not /usr/include/ruby-1.9.1/i486-linux/. You may
need to pass /usr/include/ruby-1.9.1/i486-linux/ as an extra include
directory to the build process.
I added the following in my build script:
if [ "`uname -m`" = "x86_64" ]; then
RUBY_EXTRA_INCLUDE="/usr/include/ruby-1.9.1/x86_64-linux/"
else
RUBY_EXTRA_INCLUDE="/usr/include/ruby-1.9.1/i486-linux/"
fi
if [ -d "$RUBY_EXTRA_INCLUDE" ]; then
echo "RUBY_EXTRA_INCLUDE: $RUBY_EXTRA_INCLUDE"
else
echo "$RUBY_EXTRA_INCLUDE does not exist."
exit 1
fi
CFLAGS=$CPUOPT \
CXXFLAGS=$CPUOPT \
./configure \
...
--with-extra-includes=${RUBY_EXTRA_INCLUDE} \
...
tdebindings then built as usual. Yay! :-)
Possibly I stumbled across what is happening.
With ruby-1.9.1, I see the following in my configure output:
checking for ruby... ruby
checking for ruby dirs...
archdir /usr/lib/ruby/1.9.1/i486-linux,
sitearchdir /usr/lib/ruby/site_ruby/1.9.1/i486-linux,
sitedir /usr/lib/ruby/site_ruby/1.9.1,
libdir /usr/lib,
includedir /usr/include/ruby-1.9.1,
librubyarg -Wl,-R -Wl,/usr/lib -L/usr/lib -lruby
checking for ruby... (cached) ruby
checking for ruby dirs...
archdir /usr/lib/ruby/1.9.1/i486-linux,
sitearchdir /usr/lib/ruby/site_ruby/1.9.1/i486-linux,
sitedir /usr/lib/ruby/site_ruby/1.9.1,
libdir /usr/lib,
includedir /usr/include/ruby-1.9.1,
librubyarg -Wl,-R -Wl,/usr/lib -L/usr/lib -lruby
================================================================
With ruby-1.9.3 I see the following in my configure output:
checking for ruby... ruby
checking for ruby dirs... -e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
archdir /usr/lib/ruby/1.9.1/i486-linux,
sitearchdir /usr/lib/ruby/site_ruby/1.9.1/i486-linux,
sitedir /usr/lib/ruby/site_ruby/1.9.1,
libdir /usr/lib,
includedir /usr/include/ruby-1.9.1,
librubyarg -Wl,-R -Wl,/usr/lib -L/usr/lib -lruby
checking for ruby... (cached) ruby
checking for ruby dirs... -e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
-e:1: Use RbConfig instead of obsolete and deprecated Config.
archdir /usr/lib/ruby/1.9.1/i486-linux,
sitearchdir /usr/lib/ruby/site_ruby/1.9.1/i486-linux,
sitedir /usr/lib/ruby/site_ruby/1.9.1,
libdir /usr/lib,
includedir /usr/include/ruby-1.9.1,
librubyarg -Wl,-R -Wl,/usr/lib -L/usr/lib -lruby
================================================================
I think that prior to 1.9.3 somehow the configure process knew how to add the oddball ruby
header location $archdir. With 1.9.3 our tdebindings configure process no longers does
that properly.
Additionally, ruby-1.9.3 now comes packaged with a ruby.pc pkgconfig file. That newly
added file hints at the build failure (this is the 32-bit version):
arch=i486-linux
sitearch=${arch}
prefix=/usr
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=/usr/lib
includedir=${prefix}/include
MAJOR=1
MINOR=9
TEENY=1
ruby_version=1.9.1
RUBY_PROGRAM_VERSION=1.9.3
RUBY_BASE_NAME=ruby
RUBY_SO_NAME=${RUBY_BASE_NAME}
RUBY_INSTALL_NAME=${RUBY_BASE_NAME}
DEFFILE=
LIBPATH=
LIBRUBY_A=lib${RUBY_SO_NAME}-static.a
LIBRUBY_SO=lib${RUBY_SO_NAME}.so.${MAJOR}.${MINOR}.${TEENY}
LIBRUBY=${LIBRUBY_SO}
LIBRUBYARG_SHARED=-Wl,-R -Wl,${libdir} -L${libdir} -l${RUBY_SO_NAME}
LIBRUBYARG_STATIC=-Wl,-R -Wl,${libdir} -L${libdir} -l${RUBY_SO_NAME}-static
LIBRUBYARG=${LIBRUBYARG_SHARED}
LIBS=-lpthread -lrt -ldl -lcrypt -lm
DLDFLAGS=
ruby=${bindir}/${RUBY_INSTALL_NAME}
rubyhdrdir=${includedir}/${RUBY_BASE_NAME}-${ruby_version}
vendorhdrdir=${rubyhdrdir}/vendor_ruby
sitehdrdir=${rubyhdrdir}/site_ruby
Name: Ruby
Description: Object Oriented Script Language
Version: ${ruby_version}
URL:
http://www.ruby-lang.org
Cflags: -I${rubyhdrdir}/${arch} -I${rubyhdrdir}
Libs: ${DLDFLAGS} ${LIBRUBYARG_SHARED} ${LIBS}
Requires:
================================================================
Notice the Cflags variable, which expands to /usr/include/ruby-1.9.1/i486-linux, which is
where ruby/config.h is cleverly hidden, er, installed. (For 64-bit arch=x86_64-linux and
libdir=/usr/lib64.)
Short-term solution?
Use --with-extra-include=/usr/include/ruby-1.9.1/i486-linux (or x86_64-linux for 64-bit)
Long-term solution?
* Update the configuration process to look for the ruby.pc file
and
* Do what the configure output says and use RbConfig rather than Config to extract the
necessary information.
Because tdebindings has built for everybody in the past, I'm thinking the solution is
first look for ruby.pc. When found then use that information to build the package. When
ruby.pc is not found, which is true for versions < 1.9.3, then use the existing method
to extract the ruby installation locations, which has proven to work.
With that said, I have no idea how to do that.
Not to mention that when we fix this, we need to test the patch against ruby 1.9.3, 1.9.1
and 1.8.x. :-(
I'll open a bug report but appreciate any comments.
Darrell