Blog

Thoughts from my daily grind

Bundle install - nio4r - Failed to build gem native extension

Posted by Ziyan Junaideen |Published: 12 May 2022 |Category: Ruby on Rails
Default Upload |

I found out about the Rails Turbo example from the ThoughtBot team. I decided to explore the code since I am relatively new to Turbo. Sadly, I was interrupted when I tried to bundle install the project.

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

I noticed that the solution to the matter depends on the environment but is generally caused by the C compiler. The GCC compiler while supporting implicit-function-declaration needs to be manually enabled. This is not just macOS related and I have experienced it in Ubuntu.

  • OS: macOS
  • Ruby: 3.1.0 through RVM
  • Rails: 7.0.2.2
  • Package manager: Homebrew

Out of the many suggestions I tried, this is what worked for me:

# Working solution
bundle config --local build.nio4r --with-cflags="-Wno-error=implicit-function-declaration"

The StackOverflow answer for Installing nio4r via brew install throws an error on macOS catalina has a similar approach. But its first solution didn't work, although, from my understanding, it should have.

# Doesn't work
gem install nio4r -v '2.5.8' -- --with-cflags="-Wno-error=implicit-function-declaration"

Error

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

    current directory: /Users/jdeen/.rvm/gems/ruby-3.1.0@hotwire-example/gems/nio4r-2.5.8/ext/nio4r
/Users/jdeen/.rvm/rubies/ruby-3.1.0/bin/ruby -I /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0 -r ./siteconf20220511-16040-bore5b.rb extconf.rb
--with-cflags\=-std\=c99
checking for unistd.h... *** 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/jdeen/.rvm/rubies/ruby-3.1.0/bin/$(RUBY_BASE_NAME)
        --with-unistd-dir
        --without-unistd-dir
        --with-unistd-include
        --without-unistd-include=${unistd-dir}/include
        --with-unistd-lib
        --without-unistd-lib=${unistd-dir}/lib
/Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:498:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:624:in `block in try_compile'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:573:in `with_werror'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:624:in `try_compile'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:1160:in `block in have_header'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:1007:in `block in checking_for'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:362:in `block (2 levels) in postpone'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:332:in `open'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:362:in `block in postpone'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:332:in `open'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:358:in `postpone'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:1006:in `checking_for'
        from /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/mkmf.rb:1159:in `have_header'
        from extconf.rb:15:in `<main>'

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

  /Users/jdeen/.rvm/gems/ruby-3.1.0@hotwire-example/extensions/x86_64-darwin-20/3.1.0/nio4r-2.5.8/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/jdeen/.rvm/gems/ruby-3.1.0@hotwire-example/gems/nio4r-2.5.8 for inspection.
Results logged to /Users/jdeen/.rvm/gems/ruby-3.1.0@hotwire-example/extensions/x86_64-darwin-20/3.1.0/nio4r-2.5.8/gem_make.out

  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:95:in `run'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/ext_conf_builder.rb:47:in `block in build'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/tempfile.rb:317:in `open'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/ext_conf_builder.rb:26:in `build'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:161:in `build_extension'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:195:in `block in build_extensions'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:192:in `each'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/ext/builder.rb:192:in `build_extensions'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/rubygems/installer.rb:847:in `build_extensions'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/rubygems_gem_installer.rb:71:in `build_extensions'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/rubygems_gem_installer.rb:28:in `install'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/source/rubygems.rb:204:in `install'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/installer/gem_installer.rb:54:in `install'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/installer/gem_installer.rb:16:in `install_from_spec'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/installer/parallel_installer.rb:186:in `do_install'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/installer/parallel_installer.rb:177:in `block in worker_pool'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/worker.rb:62:in `apply_func'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/worker.rb:57:in `block in process_queue'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/worker.rb:54:in `loop'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/worker.rb:54:in `process_queue'
  /Users/jdeen/.rvm/rubies/ruby-3.1.0/lib/ruby/3.1.0/bundler/worker.rb:91:in `block (2 levels) in create_threads'

An error occurred while installing nio4r (2.5.8), and Bundler cannot continue.

In Gemfile:
  rails was resolved to 7.0.2.2, which depends on
    actioncable was resolved to 7.0.2.2, which depends on
      nio4r
About the Author

Ziyan Junaideen -

Ziyan is an expert Ruby on Rails web developer with 8 years of experience specializing in SaaS applications. He spends his free time he writes blogs, drawing on his iPad, shoots photos.

Comments