Help us understand the problem. What is going on with this article?

OSX への nokogiri 1.6.8.rc3 の install でハマって解決したメモ

More than 3 years have passed since last update.

最初

普通に bundle install したら、以下のエラーでこけた。
libxml2-2.9.3 の compile に失敗してる。変数 LZMA_OK が無いとかいうエラー。。。
http://louistiao.me/posts/installing-lxml-on-mac-osx-1011-inside-a-virtualenv-with-pip/ では、(pip だから文脈は違うけど)OSX では libxml2-2.9.3 じゃない version を使えって書いてる。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.rc3/ext/nokogiri
/Users/[user]/.rbenv/versions/2.3.0/bin/ruby -r ./siteconf20160304-52550-ujlj25.rb extconf.rb
Using pkg-config version 1.1.7
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using packaged libraries.
Using mini_portile version 2.1.0
checking for iconv.h... yes
checking for gzdopen() in -lz... yes
checking for iconv... yes
************************************************************************
IMPORTANT NOTICE:

Building Nokogiri with a packaged version of libxml2-2.9.3.

Team Nokogiri will keep on doing their best to provide security
updates in a timely manner, but if this is a concern for you and want
to use the system library instead; abort this installation process and
reinstall nokogiri as follows:

    gem install nokogiri -- --use-system-libraries
        [--with-xml2-config=/path/to/xml2-config]
        [--with-xslt-config=/path/to/xslt-config]

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install

Note, however, that nokogiri is not fully compatible with arbitrary
versions of libxml2 provided by OS/package vendors.
************************************************************************
Extracting libxml2-2.9.3.tar.gz into tmp/x86_64-apple-darwin15.3.0/ports/libxml2/2.9.3... OK
Running 'configure' for libxml2 2.9.3... OK
Running 'compile' for libxml2 2.9.3... ERROR, review '/Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.rc3/ext/nokogiri/tmp/x86_64-apple-darwin15.3.0/ports/libxml2/2.9.3/compile.log' to see what happened. Last lines are:
========================================================================
    unsigned short* in = (unsigned short*) inb;
                         ^~~~~~~~~~~~~~~~~~~~~
encoding.c:815:27: warning: cast from 'unsigned char *' to 'unsigned short *' increases required alignment from 1 to 2 [-Wcast-align]
    unsigned short* out = (unsigned short*) outb;
                          ^~~~~~~~~~~~~~~~~~~~~~
4 warnings generated.
  CC       error.lo
  CC       parserInternals.lo
  CC       parser.lo
  CC       tree.lo
  CC       hash.lo
  CC       list.lo
  CC       xmlIO.lo
xmlIO.c:1450:52: error: use of undeclared identifier 'LZMA_OK'
    ret =  (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1;
                                                   ^
1 error generated.
make[2]: *** [xmlIO.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
========================================================================
*** 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=/Users/[user]/.rbenv/versions/2.3.0/bin/$(RUBY_BASE_NAME)
        --help
        --clean
        --use-system-libraries
        --enable-static
        --disable-static
        --with-zlib-dir
        --without-zlib-dir
        --with-zlib-include
        --without-zlib-include=${zlib-dir}/include
        --with-zlib-lib
        --without-zlib-lib=${zlib-dir}/lib
        --enable-cross-build
        --disable-cross-build
/Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:366:in `block in execute': Failed to complete compile task (RuntimeError)
        from /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:337:in `chdir'
        from /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:337:in `execute'
        from /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:111:in `compile'
        from /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:150:in `cook'
        from extconf.rb:328:in `block (2 levels) in process_recipe'
        from extconf.rb:221:in `block in chdir_for_build'
        from extconf.rb:220:in `chdir'
        from extconf.rb:220:in `chdir_for_build'
        from extconf.rb:327:in `block in process_recipe'
        from extconf.rb:226:in `tap'
        from extconf.rb:226:in `process_recipe'
        from extconf.rb:507:in `<main>'

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

  /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/nokogiri-1.6.8.rc3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.rc3 for inspection.
Results logged to /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/nokogiri-1.6.8.rc3/gem_make.out

system の libxml2 を使って解決

nokogiri に利用する libxml2 の指定を任せると 2.9.3 を compile しようとしてコケちゃうみたいなので、homebrew で pkg-config を入れてその中の libxmll2 を利用する事にした。ちなみに実際に利用したのは libxml2-2.9.1

上記で出たエラーメッセージに従って、bundle install 時に system の libxml2 を使うという設定をする

bundle config build.nokogiri --use-system-libraries

設定値は、 ~/.bundle/config から確認出来る。

~/.bundle/config
---
BUNDLE_GEM__COC: 'false'
BUNDLE_GEM__MIT: 'true'
BUNDLE_GEM__TEST: 'false'
BUNDLE_BUILD__NOKOGIRI: "--use-system-libraries"

この状態で再び bundle install。またエラーが出る。

Installing nokogiri 1.6.8.rc3 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.rc3/ext/nokogiri
/Users/[user]/.rbenv/versions/2.3.0/bin/ruby -r ./siteconf20160304-57103-8nd8hm.rb extconf.rb --use-system-libraries
Using pkg-config version 1.1.7
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using system libraries.
ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.
*** 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=/Users/[user]/.rbenv/versions/2.3.0/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

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

  /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/nokogiri-1.6.8.rc3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.rc3 for inspection.
Results logged to /Users/[user]/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/nokogiri-1.6.8.rc3/gem_make.out

以下の様なエラーメッセージが出てて、どうもリンカが libxml2 を見つけられてないっぽい。

ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.

brew link --force libxml2 で解決した。

$ brew link --force libxml2
Linking /usr/local/Cellar/libxml2/2.9.1... 16 symlinks created
$ ls -la /usr/local/lib/libxml2.*
lrwxr-xr-x  1 [user]  admin  43  3  4 10:57 /usr/local/lib/libxml2.2.dylib -> ../Cellar/libxml2/2.9.1/lib/libxml2.2.dylib
lrwxr-xr-x  1 [user]  admin  37  3  4 10:57 /usr/local/lib/libxml2.a -> ../Cellar/libxml2/2.9.1/lib/libxml2.a
lrwxr-xr-x  1 [user]  admin  41  3  4 10:57 /usr/local/lib/libxml2.dylib -> ../Cellar/libxml2/2.9.1/lib/libxml2.dylib
south37
RubyとかJavaScriptとか書きます。
http://south37.hatenablog.com/
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした