Nokogiri: gem install nokogiri -v 1.6.8 fails on alpine linux

Created on 13 Jun 2016  路  13Comments  路  Source: sparklemotion/nokogiri

Nokogiri fails to install on alpine linux. Can be testing using the DockerFile below:

FROM alpine:3.4

RUN apk upgrade --update \
    && apk add libatomic readline readline-dev \
        libxml2 libxml2-dev libxml2-utils \
        ncurses-terminfo-base ncurses-terminfo \
        libxslt libxslt-dev zlib-dev zlib ruby yaml \
        yaml-dev libffi-dev build-base git nodejs \
        ruby-io-console ruby-irb ruby-json ruby-rake \
        imagemagick imagemagick-dev make \
        gcc g++ libffi-dev ruby-dev \
    && apk add --no-cache python py-pygments \
    && python -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip install --upgrade pip setuptools \
    && apk add py-pygments

RUN gem install --no-document nokogiri -v 1.6.8 -- --use-system-libraries

Which produces the following output:

Successfully installed pkg-config-1.1.7
Successfully installed mini_portile2-2.1.0
Building native extensions with: '--use-system-libraries'
This could take a while...
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.

    current directory: /usr/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8/ext/nokogiri
/usr/bin/ruby -r ./siteconf20160613-8-jiwea2.rb extconf.rb --use-system-libraries
Using pkg-config version 1.1.7
checking if the C compiler accepts ... yes
Building nokogiri using system libraries.
checking for libexslt... yes
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
-----
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
-----
*** 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=.
    --curdir
    --ruby=/usr/bin/$(RUBY_BASE_NAME)
    --help
    --clean
    --use-system-libraries
    --with-zlib-dir
    --without-zlib-dir
    --with-zlib-include
    --without-zlib-include=${zlib-dir}/include
    --with-zlib-lib
    --without-zlib-lib=${zlib-dir}/lib
    --with-xml2-dir
    --without-xml2-dir
    --with-xml2-include
    --without-xml2-include=${xml2-dir}/include
    --with-xml2-lib
    --without-xml2-lib=${xml2-dir}/lib
    --with-libxml-2.0-config
    --without-libxml-2.0-config
    --with-pkg-config
    --without-pkg-config
    --with-xslt-dir
    --without-xslt-dir
    --with-xslt-include
    --without-xslt-include=${xslt-dir}/include
    --with-xslt-lib
    --without-xslt-lib=${xslt-dir}/lib
    --with-libxslt-config
    --without-libxslt-config
    --with-exslt-dir
    --without-exslt-dir
    --with-exslt-include
    --without-exslt-include=${exslt-dir}/include
    --with-exslt-lib
    --without-exslt-lib=${exslt-dir}/lib
    --with-libexslt-config
    --without-libexslt-config
    --with-pkg-config
    --without-pkg-config
    --with-override-variables
    --without-override-variables
    --with-xml2lib
    --without-xml2lib
    --with-libxml2lib
    --without-libxml2lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /usr/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.6.8/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /usr/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8 for inspection.
Results logged to /usr/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.6.8/gem_make.out
The command '/bin/sh -c gem install --no-document nokogiri -v 1.6.8 -- --use-system-libraries' returned a non-zero code: 1

Installing nokogiri -v 1.6.7 works fine

Most helpful comment

It seems like the error is a misleading, further up the linker barfs, because gcrypt libraries are missing. Once I installed libgcrypt-dev, things worked

apk add libgcrypt-dev
gem install nokogiri --no-document -- --use-system-libraries
Building native extensions with: '--use-system-libraries'
This could take a while...
Successfully installed nokogiri-1.6.8
1 gem installed

All 13 comments

This worked for me.

gem install nokogiri -- --use-system-libraries --with-xml2-config=/usr/local/bin/xml2-config --with-xslt-config=/usr/local/bin/xslt-config

It's sad that latest changes don't seem to have been tested before pushing to the current "stable" version and appears that lots of people have the same issue.

Thanks for the response. I get the same issue unfortunately.

FROM alpine:3.4

RUN apk upgrade --update \
    && apk add libatomic readline readline-dev \
        libxml2 libxml2-dev libxml2-utils \
        ncurses-terminfo-base ncurses-terminfo \
        libxslt libxslt-dev zlib-dev zlib ruby yaml \
        yaml-dev libffi-dev build-base git nodejs \
        ruby-io-console ruby-irb ruby-json ruby-rake \
        imagemagick imagemagick-dev make \
        gcc g++ libffi-dev ruby-dev \
    && apk add --no-cache python py-pygments \
    && python -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip install --upgrade pip setuptools \
    && apk add py-pygments

RUN gem install nokogiri -- --use-system-libraries --with-xml2-config=/usr/local/bin/xml2-config --with-xslt-config=/usr/local/bin/xslt-config

This gives:

Successfully installed mini_portile2-2.1.0
Successfully installed pkg-config-1.1.7
Building native extensions with: '--use-system-libraries --with-xml2-config=/usr/local/bin/xml2-config --with-xslt-config=/usr/local/bin/xslt-config'
This could take a while...
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.

    current directory: /usr/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8/ext/nokogiri
/usr/bin/ruby -r ./siteconf20160620-9-iy57no.rb extconf.rb --use-system-libraries --with-xml2-config=/usr/local/bin/xml2-config --with-xslt-config=/usr/local/bin/xslt-config
Using pkg-config version 1.1.7
checking if the C compiler accepts ... yes
Building nokogiri using system libraries.
checking for libexslt... yes
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
-----
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
-----
*** 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=.
    --curdir
    --ruby=/usr/bin/$(RUBY_BASE_NAME)
    --help
    --clean
    --use-system-libraries
    --with-zlib-dir
    --without-zlib-dir
    --with-zlib-include
    --without-zlib-include=${zlib-dir}/include
    --with-zlib-lib
    --without-zlib-lib=${zlib-dir}/lib
    --with-xml2-dir
    --without-xml2-dir
    --with-xml2-include
    --without-xml2-include=${xml2-dir}/include
    --with-xml2-lib
    --without-xml2-lib=${xml2-dir}/lib
    --with-libxml-2.0-config
    --without-libxml-2.0-config
    --with-pkg-config
    --without-pkg-config
    --with-xslt-dir
    --without-xslt-dir
    --with-xslt-include
    --without-xslt-include=${xslt-dir}/include
    --with-xslt-lib
    --without-xslt-lib=${xslt-dir}/lib
    --with-libxslt-config
    --without-libxslt-config
    --with-exslt-dir
    --without-exslt-dir
    --with-exslt-include
    --without-exslt-include=${exslt-dir}/include
    --with-exslt-lib
    --without-exslt-lib=${exslt-dir}/lib
    --with-libexslt-config
    --without-libexslt-config
    --with-pkg-config
    --without-pkg-config
    --with-override-variables
    --without-override-variables
    --with-xml2lib
    --without-xml2lib
    --with-libxml2lib
    --without-libxml2lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /usr/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.6.8/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /usr/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8 for inspection.
Results logged to /usr/lib/ruby/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.6.8/gem_make.out
The command '/bin/sh -c gem install nokogiri -- --use-system-libraries --with-xml2-config=/usr/local/bin/xml2-config --with-xslt-config=/usr/local/bin/xslt-config' returned a non-zero code: 1

Says libxml2 is missing so try installing it first.

@GeorgePhillips can you please provide your mkmf.log file from both attempts, with and without --use-system-libraries?

With --use-system-libraries:

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic     -lruby  -lpthread -lgmp -ldl -lcrypt -lm   -lc "
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

"gcc -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC    -Werror -c conftest.c"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main() {return 0;}
/* end */

| pkg-config --libs libxml-2.0
=> "-lxml2  \n"
"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic     -lruby -lxml2 -lpthread -lgmp -ldl -lcrypt -lm   -lc "
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

| pkg-config --cflags-only-I libxml-2.0
=> "-I/usr/include/libxml2  \n"
| pkg-config --cflags-only-other libxml-2.0
=> " \n"
| pkg-config --libs-only-l libxml-2.0
=> "-lxml2  \n"
package configuration for libxml-2.0
cflags:
ldflags:
libs: -lxml2

| pkg-config --libs libxslt
=> "-lxslt -lz -lm  -lxml2  \n"
"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline  conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic      -lxml2 -lruby -lxslt -lz -lm  -lxml2 -lpthread -lgmp -ldl -lcrypt -lm   -lc "
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

| pkg-config --cflags-only-I libxslt
=> "-I/usr/include/libxml2  \n"
| pkg-config --cflags-only-other libxslt
=> " \n"
| pkg-config --libs-only-l libxslt
=> "-lxslt -lz -lm -lxml2  \n"
package configuration for libxslt
cflags:
ldflags:
libs: -lxslt -lz -lm -lxml2

| pkg-config --libs libexslt
=> "-lexslt -lxslt -lz -lm  -lgcrypt -lgpg-error -lxml2  \n"
"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic       -lxml2 -lxslt -lz -lm -lxml2 -lruby -lexslt -lxslt -lz -lm  -lgcrypt -lgpg-error -lxml2 -lpthread -lgmp -ldl -lcrypt -lm   -lc "
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
collect2: error: 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 */

package configuration for libexslt is not found
have_package: checking for libexslt... -------------------- yes

--------------------

PKGConfig package configuration for libexslt
cflags: -I/usr/include/libxml2
ldflags:
libs: -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error

"gcc -E -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2  conftest.c -o conftest.i"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <libxml/xmlversion.h>
/* end */

"gcc -E -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2  conftest.c -o conftest.i"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <libxml/xmlversion.h>
4: #if LIBXML_VERSION < 20621
5: #error libxml2 is older than 2.6.21
6: #endif
/* end */

"gcc -E -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2  conftest.c -o conftest.i"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <libxml/xmlversion.h>
4: #if LIBXML_VERSION < 20903
5: #error libxml2 is older than 2.9.3
6: #endif
/* end */

have_func: checking for xmlParseDoc() in libxml/parser.h... -------------------- no

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2 conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic        -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lruby  -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lpthread -lgmp -ldl -lcrypt -lm   -lc "
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
collect2: error: ld returned 1 exit status
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <libxml/parser.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12:
13:   return 0;
14: }
15: int t(void) { void ((*volatile p)()); p = (void ((*)()))xmlParseDoc; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2 conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic        -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lruby  -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lpthread -lgmp -ldl -lcrypt -lm   -lc "
conftest.c:15:13: error: conflicting types for 'xmlParseDoc'
 extern void xmlParseDoc();
             ^
In file included from conftest.c:3:0:
/usr/include/libxml2/libxml/parser.h:842:3: note: previous declaration of 'xmlParseDoc' was here
   xmlParseDoc  (const xmlChar *cur);
   ^
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <libxml/parser.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12:
13:   return 0;
14: }
15: extern void xmlParseDoc();
16: int t(void) { xmlParseDoc(); return 0; }
/* end */

--------------------

have_library: checking for xmlParseDoc() in -lxml2... -------------------- no

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2 conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic        -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lruby -lxml2  -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lpthread -lgmp -ldl -lcrypt -lm   -lc "
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
collect2: error: ld returned 1 exit status
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <libxml/parser.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12:
13:   return 0;
14: }
15: int t(void) { void ((*volatile p)()); p = (void ((*)()))xmlParseDoc; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2 conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic        -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lruby -lxml2  -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lpthread -lgmp -ldl -lcrypt -lm   -lc "
conftest.c:15:13: error: conflicting types for 'xmlParseDoc'
 extern void xmlParseDoc();
             ^
In file included from conftest.c:3:0:
/usr/include/libxml2/libxml/parser.h:842:3: note: previous declaration of 'xmlParseDoc' was here
   xmlParseDoc  (const xmlChar *cur);
   ^
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <libxml/parser.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12:
13:   return 0;
14: }
15: extern void xmlParseDoc();
16: int t(void) { xmlParseDoc(); return 0; }
/* end */

--------------------

have_library: checking for xmlParseDoc() in -llibxml2... -------------------- no

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2 conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic        -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lruby -llibxml2  -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lpthread -lgmp -ldl -lcrypt -lm   -lc "
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -llibxml2
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgcrypt
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lgpg-error
collect2: error: ld returned 1 exit status
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <libxml/parser.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12:
13:   return 0;
14: }
15: int t(void) { void ((*volatile p)()); p = (void ((*)()))xmlParseDoc; return !p; }
/* end */

"gcc -o conftest -I/usr/include/ruby-2.3.0/x86_64-linux-musl -I/usr/include/ruby-2.3.0/ruby/backward -I/usr/include/ruby-2.3.0 -I. -I/usr/include/libxml2 -I/usr/include/libxml2 -Os -fomit-frame-pointer   -Os -fomit-frame-pointer -fno-omit-frame-pointer -fno-strict-aliasing -fPIC  -g -DXP_UNIX -O3 -Wall -Wcast-qual -Wwrite-strings -Wconversion -Wmissing-noreturn -Winline   -I/usr/include/libxml2 conftest.c  -L. -L/usr/lib -L. -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic        -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lruby -llibxml2  -lxml2 -lxslt -lz -lm -lxml2 -lexslt -lxslt -lxml2 -lz -lm -lgcrypt -lgpg-error -lpthread -lgmp -ldl -lcrypt -lm   -lc "
conftest.c:15:13: error: conflicting types for 'xmlParseDoc'
 extern void xmlParseDoc();
             ^
In file included from conftest.c:3:0:
/usr/include/libxml2/libxml/parser.h:842:3: note: previous declaration of 'xmlParseDoc' was here
   xmlParseDoc  (const xmlChar *cur);
   ^
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <libxml/parser.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int main(int argc, char **argv)
 8: {
 9:   if (argc > 1000000) {
10:     printf("%p", &t);
11:   }
12:
13:   return 0;
14: }
15: extern void xmlParseDoc();
16: int t(void) { xmlParseDoc(); return 0; }
/* end */

Running it without -- --use-system-libraries works:

FROM alpine:3.4

RUN apk upgrade --update \
    && apk add libatomic readline readline-dev \
        libxml2 libxml2-dev libxml2-utils \
        ncurses-terminfo-base ncurses-terminfo \
        libxslt libxslt-dev zlib-dev zlib ruby yaml \
        yaml-dev libffi-dev build-base git nodejs \
        ruby-io-console ruby-irb ruby-json ruby-rake \
        imagemagick imagemagick-dev make \
        gcc g++ libffi-dev ruby-dev \
    && apk add --no-cache python py-pygments \
    && python -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip install --upgrade pip setuptools \
    && apk add py-pygments

RUN gem install --no-document nokogiri -v 1.6.8

Running it without -- --use-system-libraries works:

Even worked for me.

It seems like the error is a misleading, further up the linker barfs, because gcrypt libraries are missing. Once I installed libgcrypt-dev, things worked

apk add libgcrypt-dev
gem install nokogiri --no-document -- --use-system-libraries
Building native extensions with: '--use-system-libraries'
This could take a while...
Successfully installed nokogiri-1.6.8
1 gem installed

I'd like very much if someone who cares about Alpine Linux support would send a PR to the installation tutorial:

https://github.com/sparklemotion/nokogiri.org-tutorials/pulls

@dlibanori Thanks for the link. Though, please see my previous comment from Oct 2. You took the time to comment here; perhaps you could take a few more minutes to send a PR to the tutorials repo?

Just testing the code and will do a PR if it works

Note: Just install any version of nokogiri and point to that version in Gemfile.lock

Was this page helpful?
0 / 5 - 0 ratings