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

macOS Sierra での gem install nokogiri でエラー

More than 3 years have passed since last update.

以前にも同様のエントリを書きましたが、それと同様の手順だけではダメだったので新しく書きます。今回は Ruby 2.3.3 を新しくインストールした直後に生じたエラーです(他のバージョンでもインストールエラーが出ていたので、念のために Ruby 環境を新しくしました)。
前のヤツ:Yosemite の gem install nokogiri でエラー(Xcode 7環境) - Qiita

環境

  • macOS Sierra 10.12.3
  • Ruby 2.3.3
  • Nokogiri 1.7.0.1
  • libxml2 2.9.4(Homebrew でインストール)

結論

brew install libxml2brew link --force libxml2 (もしくは一気に brew install --force libxml2)してから gem install nokogiri -- --use-system-libraries する。

$ brew update
 :
$ brew install libxml2
 :
$ brew link --force libxml2
Linking /usr/local/Cellar/libxml2/2.9.4_1... 17 symlinks created
$ gem install nokogiri -- --use-system-libraries
Building native extensions with: '--use-system-libraries'
This could take a while...
Successfully installed nokogiri-1.7.0.1
1 gem installed

そして libxml2 を unlink しておかないと brew doctor のときに怒られるので

$ brew unlink libxml2

しておきます 1
なお、 Nokogiri が必要とする libxml2 のバージョンは Nokogiri のバージョン毎に違うはずので、 gem install nokogiri -- --use-system-libraries のために libxml2 をインストールするならば、バージョン指定する必要が生じるときがあるかもしれません(調べてないです)。

参考リンク:Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法 - Qiita
ただし参考リンクだと libxsltlibiconv のインストールも必要になってました。それまでの Homebrew 環境に依るのかも。

詳しい経緯と手順

Ruby 2.3.3 インストール

$ CONFIGURE_OPTS="--disable-install-rdoc --enable-shared" rbenv install 2.3.3
ruby-build: use openssl from homebrew
Downloading ruby-2.3.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.3.tar.bz2
Installing ruby-2.3.3...
ruby-build: use readline from homebrew
Installed ruby-2.3.3 to /Users/riocampos/.anyenv/envs/rbenv/versions/2.3.3

Communized gems for 2.3.3
$ rbenv global 2.3.3

参考:rbenvでMacにRuby 2.2.1 インストール(オプション指定最新版 - Qiita

Nokogiri インストールエラー

$ gem install nokogiri
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.

    current directory: /Users/riocampos/.rbenv/gems/2.3.0/gems/nokogiri-1.7.0.1/ext/nokogiri
/Users/riocampos/.anyenv/envs/rbenv/versions/2.3.3/bin/ruby -r ./siteconf20170224-8319-1hb44k6.rb extconf.rb
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.4.

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.4.tar.gz into tmp/x86_64-apple-darwin16.4.0/ports/libxml2/2.9.4... OK
Running 'configure' for libxml2 2.9.4... OK
Running 'compile' for libxml2 2.9.4... ERROR, review '/Users/riocampos/.rbenv/gems/2.3.0/gems/nokogiri-1.7.0.1/ext/nokogiri/tmp/x86_64-apple-darwin16.4.0/ports/libxml2/2.9.4/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/riocampos/.anyenv/envs/rbenv/versions/2.3.3/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/riocampos/.anyenv/envs/rbenv/versions/2.3.3/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/riocampos/.anyenv/envs/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:337:in `chdir'
    from /Users/riocampos/.anyenv/envs/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:337:in `execute'
    from /Users/riocampos/.anyenv/envs/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:111:in `compile'
    from /Users/riocampos/.anyenv/envs/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:150:in `cook'
    from extconf.rb:364:in `block (2 levels) in process_recipe'
    from extconf.rb:257:in `block in chdir_for_build'
    from extconf.rb:256:in `chdir'
    from extconf.rb:256:in `chdir_for_build'
    from extconf.rb:363:in `block in process_recipe'
    from extconf.rb:262:in `tap'
    from extconf.rb:262:in `process_recipe'
    from extconf.rb:547:in `<main>'

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

  /Users/riocampos/.anyenv/envs/rbenv/gems/2.3.0/extensions/x86_64-darwin-16/2.3.0/nokogiri-1.7.0.1/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/riocampos/.anyenv/envs/rbenv/gems/2.3.0/gems/nokogiri-1.7.0.1 for inspection.
Results logged to /Users/riocampos/.anyenv/envs/rbenv/gems/2.3.0/extensions/x86_64-darwin-16/2.3.0/nokogiri-1.7.0.1/gem_make.out

そして、よくある解決法の $ gem install nokogiri -- --use-system-libraries に頼ったのですが、やはり同様のエラーが生じました。

brew install libxml2 のときの注意書き

$ brew install libxml2
Updating Homebrew...
Warning: libxml2 is a keg-only and another version is linked to opt.
Use `brew install --force` if you want to install this version

リンクしてない(Homebrew でインストールした libxml2 を強いては使わない設定)ので gem install nokogiri -- --use-system-libraries のときに、この libxml2 を見てくれなかったのでしょうね。


  1. 結局、 Homebrew で入れている libxml2 の場所が見えないから Nokogiri が怒るんですよね。だからライブラリ位置指定してやれば良いのでしょうけど、やり方が分からない…orz 

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