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
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
You have to see this:
https://bartelwedding.com/notes/2016-04-15-nokogiri-on-alpine.html
@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
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