Building a C extension

Hi,

After reading the discussion about “the death of Mailing lists”, I
thought it would be good to post this question directly here:

I have a gem, I want to build the C extensions for. The gem source is
located here: https://github.com/nirnanaaa/cracklib .

If I build the source now on my mac (Mavericks) all the headers are
found and the gem gets built. All test cases pass correctly

.

Building the gem on Travis results in an error:

/home/travis/.rvm/rubies/ruby-2.1.1/bin/ruby -I.
…/…/…/…/ext/cracklib/extconf.rb

checking for sys/types.h… *** …/…/…/…/ext/cracklib/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=…/…/…/…/ext/cracklib

–curdir

–ruby=/home/travis/.rvm/rubies/ruby-2.1.1/bin/ruby

/home/travis/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/mkmf.rb:456:in
`try_do’: The compiler failed to generate an executable file.
(RuntimeError)

You have to install development tools first.

However the packages “build-essential gcc automake” got installed on
the before_install step of travis’ config

Maybe this is related to changing the HEADER_DIRS and LIB_DIRS in the
extconf.rb ?

Hope someone could help.

Thanks,

Flo

Hi Flo,

On Wednesday 02 July 2014 16:10:10, Florian K. [email protected] wrote:

However the packages “build-essential gcc automake” got installed on the
before_install step of travis’ config

Maybe this is related to changing the HEADER_DIRS and LIB_DIRS in the
extconf.rb ?

build-essential pulls in libc6-dev, which contains
/usr/include/sys/types.h.
If that’s the culprit, the include paths are wrong.

Could you post the actual compiler command line? It should be in
mkmf.log.

HTH

  --- Eric

Hi Eric,

thanks for helping me. I completely forgot about mkmf.log . Here is the
content of this log:

$ find . -type f -name mkmf.log|xargs cat
“gcc -o conftest
-I/home/travis/.rvm/rubies/ruby-1.9.3-p545/include/ruby-1.9.1/x86_64-linux
-I/home/travis/.rvm/rubies/ruby-1.9.3-p545/include/ruby-1.9.1/ruby/backward
-I/home/travis/.rvm/rubies/ruby-1.9.3-p545/include/ruby-1.9.1
-I…/…/…/…/ext/cracklib
-O3
-ggdb
-Wall
-Wextra
-Wno-unused-parameter
-Wno-parentheses
-Wno-long-long
-Wno-missing-field-initializers
-Wpointer-arith
-Wwrite-strings
-Wdeclaration-after-statement
-Wimplicit-function-declaration
-fPIC conftest.c
-L.
-L/home/travis/.rvm/rubies/ruby-1.9.3-p545/lib
-Wl,-R/home/travis/.rvm/rubies/ruby-1.9.3-p545/lib
-L.
-rdynamic
-Wl,-export-dynamic
-lcrack
-Wl,-R -Wl,/home/travis/.rvm/rubies/ruby-1.9.3-p545/lib
-L/home/travis/.rvm/rubies/ruby-1.9.3-p545/lib
-lruby
-lpthread
-lrt
-ldl
-lcrypt
-lm
-lc”
/usr/bin/ld: cannot find -lcrack
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include “ruby.h”
2:
3: int main(int argc, char *argv)
4: {
5: return 0;
6: }
/
end */

I formatted the output to be more readable. As you already guessed the
linker include option for cracklib under $GEMROOT/vendor/cracklib/lib is
missing.

Adding the HEADER_DIRS and LIB_DIRS directly to the LDFLAGS resulted in
exactly the same error:

“gcc
-o conftest
-I/home/travis/.rvm/rubies/ruby-2.0.0-p451/include/ruby-2.0.0/x86_64-linux
-I/home/travis/.rvm/rubies/ruby-2.0.0-p451/include/ruby-2.0.0/ruby/backward
-I/home/travis/.rvm/rubies/ruby-2.0.0-p451/include/ruby-2.0.0
-I…/…/…/…/ext/cracklib
-I/home/travis/build/nirnanaaa/cracklib/vendor/cracklib/lib
-I/opt/local/include
-I/usr/local/include
-I/home/travis/.rvm/rubies/ruby-2.0.0-p451/include
-I/usr/include
-I/include
-O3
-fno-fast-math
-ggdb3
-Wall
-Wextra
-Wno-unused-parameter
-Wno-parentheses
-Wno-long-long
-Wno-missing-field-initializers
-Wunused-variable
-Wpointer-arith
-Wwrite-strings
-Wdeclaration-after-statement
-Wimplicit-function-declaration
-fPIC conftest.c
-L.
-L/home/travis/.rvm/rubies/ruby-2.0.0-p451/lib -Wl,-R/home/travis/.rvm/rubies/ruby-2.0.0-p451/lib
-L/home/travis/build/nirnanaaa/cracklib/vendor/cracklib/lib -Wl,-R/home/travis/build/nirnanaaa/cracklib/vendor/cracklib/lib
-L/usr/local/lib -Wl,-R/usr/local/lib
-L/home/travis/.rvm/rubies/ruby-2.0.0-p451/lib
-Wl,-R/home/travis/.rvm/rubies/ruby-2.0.0-p451/lib
-L/usr/lib -Wl,-R/usr/lib
-L/lib -Wl,-R/lib
-L.
-fstack-protector
-rdynamic
-Wl,
-export-dynamic
-lcrack
-I /home/travis/build/nirnanaaa/cracklib/vendor/cracklib/lib
-I /opt/local/include
-I /usr/local/include
-I /home/travis/.rvm/rubies/ruby-2.0.0-p451/include
-I /usr/include
-I /include
-L /home/travis/build/nirnanaaa/cracklib/vendor/cracklib/lib
-L /usr/local/lib
-L /home/travis/.rvm/rubies/ruby-2.0.0-p451/lib
-L /usr/lib
-L /lib ‘-Wl,-rpath,/…/lib’ -Wl,-R
-Wl,/home/travis/.rvm/rubies/ruby-2.0.0-p451/lib
-L/home/travis/.rvm/rubies/ruby-2.0.0-p451/lib -lruby -lpthread -lrt
-ldl -lcrypt -lm -lc”
/usr/bin/ld: cannot find -lcrack
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include “ruby.h”
2:
3: int main(int argc, char *argv)
4: {
5: return 0;
6: }
/
end */


Flo
On July 2, 2014 at 5:10:03 PM, Eric MSP Veith ([email protected])
wrote:

Hi Flo,

On Wednesday 02 July 2014 16:10:10, Florian K. [email protected] wrote:

However the packages “build-essential gcc automake” got installed on the
before_install step of travis’ config

Maybe this is related to changing the HEADER_DIRS and LIB_DIRS in the
extconf.rb ?

build-essential pulls in libc6-dev, which contains
/usr/include/sys/types.h.
If that’s the culprit, the include paths are wrong.

Could you post the actual compiler command line? It should be in
mkmf.log.

HTH

— Eric