LoginSignup
115
63

More than 5 years have passed since last update.

macOS SierraでNokogiriがインストールできない問題の解決方法

Posted at

概要

例によってSierraをクリーンインストールして開発環境を再構築する際に、
Nokogiri Gemのインストールが失敗するようになってしまいました。

Nokogiriはeventmachine、RMagickに続く一発で入らないGem三銃士の一人ということもあり、
過去にもWeb上に解決方法が上げられていますが、今回はそれとは異なる解決方法となるため整理しました。

TL;DR

Nokogiriの公式サイトに解決方法が挙げられているのですが、bundle configで設定しておく方法が最もよいと思います。

libxml2をHomebrewでインストールします。

$ brew install libxml2

BundlerにNokogiriビルド時のオプションとして、--use-system-libraries--with-xml2-includeを設定します。

$ bundle config build.nokogiri --use-system-libraries --with-xml2-include=$(brew --prefix libxml2)/include/libxml2

この設定を行った状態でbundle installすればエラーが発生しなくなります。

発生した問題

Nokogiriを含んだGemfileをbundle installすると次のようなエラーが発生しました。

Installing nokogiri 1.6.8.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /private/tmp/nokogiri/vendor/bundle/gems/nokogiri-1.6.8.1/ext/nokogiri
/Users/hideki-igarashi/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20161206-51969-aca07p.rb extconf.rb
checking if the C compiler accepts -Wno-error=shorten-64-to-32... 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.0.0/ports/libxml2/2.9.4... OK
Running 'configure' for libxml2 2.9.4... OK
Running 'compile' for libxml2 2.9.4... ERROR, review '/private/tmp/nokogiri/vendor/bundle/gems/nokogiri-1.6.8.1/ext/nokogiri/tmp/x86_64-apple-darwin16.0.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/hideki-igarashi/.rbenv/versions/2.3.1/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
/private/tmp/nokogiri/vendor/bundle/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:366:in `block in execute': Failed to complete compile task (RuntimeError)
        from /private/tmp/nokogiri/vendor/bundle/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:337:in `chdir'
        from /private/tmp/nokogiri/vendor/bundle/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:337:in `execute'
        from /private/tmp/nokogiri/vendor/bundle/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:111:in `compile'
        from /private/tmp/nokogiri/vendor/bundle/gems/mini_portile2-2.1.0/lib/mini_portile2/mini_portile.rb:150:in `cook'
        from extconf.rb:365:in `block (2 levels) in process_recipe'
        from extconf.rb:258:in `block in chdir_for_build'
        from extconf.rb:257:in `chdir'
        from extconf.rb:257:in `chdir_for_build'
        from extconf.rb:364:in `block in process_recipe'
        from extconf.rb:263:in `tap'
        from extconf.rb:263:in `process_recipe'
        from extconf.rb:556:in `<main>'

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

  /private/tmp/nokogiri/vendor/bundle/extensions/x86_64-darwin-16/2.3.0/nokogiri-1.6.8.1/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /private/tmp/nokogiri/vendor/bundle/gems/nokogiri-1.6.8.1 for inspection.
Results logged to /private/tmp/nokogiri/vendor/bundle/extensions/x86_64-darwin-16/2.3.0/nokogiri-1.6.8.1/gem_make.out

An error occurred while installing nokogiri (1.6.8.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.8.1'` succeeds before bundling.

--use-system-librariesオプションだけではダメ

過去によく上がっている解決方法に--use-system-librariesオプションを付与する手段があります。

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

しかし、これだけではエラーになってしまいます。

Installing nokogiri 1.6.8.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /private/tmp/nokogiri/vendor/bundle/gems/nokogiri-1.6.8.1/ext/nokogiri
/Users/hideki-igarashi/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20161206-58976-267zcz.rb extconf.rb --use-system-libraries
checking if the C compiler accepts -Wno-error=shorten-64-to-32... 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/hideki-igarashi/.rbenv/versions/2.3.1/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:

  /private/tmp/nokogiri/vendor/bundle/extensions/x86_64-darwin-16/2.3.0/nokogiri-1.6.8.1/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /private/tmp/nokogiri/vendor/bundle/gems/nokogiri-1.6.8.1 for inspection.
Results logged to /private/tmp/nokogiri/vendor/bundle/extensions/x86_64-darwin-16/2.3.0/nokogiri-1.6.8.1/gem_make.out

An error occurred while installing nokogiri (1.6.8.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.8.1'` succeeds before bundling.

XZ UtilsのUniversalバイナリ版のインストールでも失敗

Nokogiriの公式サイトにある解決方法の一つに、XZ UtilsのUniversalバイナリ版のインストールが挙げられています。

$ brew reinstall xz --universal

しかし、この方法では解決しませんでした。

解決方法

--use-system-libraries--with-xml2-includeオプションを設定する (推奨)

--use-system-librariesだけではエラーになりますが、さらに--with-xml2-includeオプションを設定することで解決します。

libxml2をHomebrewでインストールします。

$ brew install libxml2

BundlerにNokogiriビルド時のオプションとして、--use-system-libraries--with-xml2-includeを設定します。

$ bundle config build.nokogiri --use-system-libraries --with-xml2-include=$(brew --prefix libxml2)/include/libxml2

この設定を行った状態でbundle installすればエラーが発生しなくなります。
また、Bundlerのグローバル設定に保存するため、毎回何かをする必要もありません。

XZ Utilsのシンボリックリンクを一時的に削除する (非推奨)

Homebrewによって張られたXZ Utilsのシンボリックリンクを一時的に削除することでも回避できます。

$ brew unlink xz
$ bundle install
$ brew link xz

この場合、新たにNokogiri Gemがインストールされる際に毎回行う必要があるため非推奨です。

環境変数PKG_CONFIG_PATHを設定する

\ay log — nokogiriが(また)インストールできないで紹介されている設定です。

--use-system-librariesオプションを設定します。

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

次のように環境変数PKG_CONFIG_PATHを設定します。

$ export PKG_CONFIG_PATH=$(brew --prefix libxml2)/lib/pkgconfig:$(brew --prefix libxslt)/lib/pkgconfig:$(pkg-config --variable pc_path pkg-config)

環境変数PKG_CONFIG_PATHだけではエラーになるので注意です。

シェルの起動時にexportするように設定する場合は、brew --prefixの動作が重いので展開したパスを書いておくとよいでしょう。

参考

115
63
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
115
63