extconf.rb

The default way to build RubyGem extensions is to use extconf.rb. However, extconf.rb was designed for C and not C++. Thus, Rice provides a file called mkmf-rice that adds additional functionality to mkmf including:

  • Uses a C++ compiler instead of a C compiler

  • Includes Rice header files automatically

  • Sets required Compiler Settings

  • Links to the standard C++ library

Enabling

To build your extension using extconf.rb, add the following to your Gemspec (assuming the extension directory is ext):

Gem::Specification.new do |spec|
  spec.extensions = ["ext/extconf.rb"]
end

Example

Below is an example extconf.rb:

require 'mkmf-rice'

dir_config('...')
have_library('...')
create_makefile('my_extension')

Disadvantages

Although extconf.rb is widely used to build Ruby extensions, it is not designed for C++. This means it can be tricky to get it to work for C++ extensions.

Aother disadvantage is that extconf.rb creates a Makefile that is then built either by make or nmake. By default, make will only compile a single file at a time. For larger C++ extensions, such as ruby-opencv this results is very long compilation times.