This is a quick post mostly so I remember how to solve this problem if I come across it again, as I have seen it a few times now when running a
bundle update on my local jekyll install.
Installing nokogiri 220.127.116.11 (was 1.6.8) with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. /Users/david/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20170122-7248-dj1g23.rb extconf.rb --use-system-libraries --with-xml2-include=/usr/local/Cellar/libxml2/2.9.2/include/libxml2 --with-xml2-lib=/usr/local/Cellar/libxml2/2.9.2/lib 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.
The mystery is where the cached path for libxml2 was coming from. I have this installed via Homebrew.
Using the brew command to get details on the library gave a few clues.
mm:dhutchison.github.io david$ brew info libxml2 libxml2: stable 2.9.4 (bottled), HEAD [keg-only] GNOME XML library http://xmlsoft.org /usr/local/Cellar/libxml2/2.9.4_2 (277 files, 9.8M) Poured from bottle on 2017-01-15 at 22:26:17 From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/libxml2.rb ==> Requirements Optional: python ✔ ==> Options --universal Build a universal binary --with-python Build with python support --HEAD Install HEAD version ==> Caveats This formula is keg-only, which means it was not symlinked into /usr/local. macOS already provides this software and installing another version in parallel can cause all kinds of trouble. Generally there are no consequences of this for you. If you build your own software and it requires this formula, you'll need to add to your build variables: LDFLAGS: -L/usr/local/opt/libxml2/lib CPPFLAGS: -I/usr/local/opt/libxml2/include PKG_CONFIG_PATH: /usr/local/opt/libxml2/lib/pkgconfig
Note the caveat - there must be a build variable set somewhere. I checked and the suggested libxml2 directory shown is a symlink to the real version I am expecting to link to.
mm:dhutchison.github.io david$ ls -l /usr/local/opt/libxml2 lrwxr-xr-x 1 david admin 25B 15 Jan 22:26 /usr/local/opt/libxml2@ -> ../Cellar/libxml2/2.9.4_2
So, where is the direct link to (the non-extistant) “/usr/local/Cellar/libxml2/2.9.2”?
Trying to just install the “nokogiri” gem wit the Gem command directly also failed, but with a different error message.
mm:dhutchison.github.io david$ gem install nokogiri -v '18.104.22.168' Building native extensions. This could take a while... ERROR: Error installing nokogiri: ERROR: Failed to build gem native extension. current directory: /Users/david/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/nokogiri-22.214.171.124/ext/nokogiri /Users/david/.rbenv/versions/2.3.0/bin/ruby -r ./siteconf20170122-24653-1p8lqiq.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.
bundle config shows that I’ve set this before, but to a fixed-version:
mm:dhutchison.github.io david$ bundle config Settings are listed in order of priority. The top value will be used. build.nokogiri Set for the current user (/Users/david/.bundle/config): "\"--use-system-libraries --with-xml2-include=/usr/local/Cellar/libxml2/2.9.2/include/libxml2"
So, the fix? Set the bundler configuration to the symlink value, as opposed to the fixed version, and re-run the bundle update:
mm:dhutchison.github.io david$ bundle config build.nokogiri --use-system-libraries --with-xml2-include=/usr/local/opt/libxml2/include/libxml2 mm:dhutchison.github.io david$ bundle update