Skip to content

Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →

instance method

MakeMakefile#create_makefile

create_makefile(target, srcprefix = nil) { |conf| ... }

Generates the Makefile for your extension, passing along any options and preprocessor constants that you may have generated through other methods.

The target name should correspond the name of the global function name defined within your C extension, minus the Init_. For example, if your C extension is defined as Init_foo, then your target would simply be “foo”.

If any “/” characters are present in the target name, only the last name is interpreted as the target name, and the rest are considered toplevel directory names, and the generated Makefile will be altered accordingly to follow that directory structure.

For example, if you pass “test/foo” as a target name, your extension will be installed under the “test” directory. This means that in order to load the file within a Ruby program later, that directory structure will have to be followed, e.g. require 'test/foo'.

The srcprefix should be used when your source files are not in the same directory as your build script. This will not only eliminate the need for you to manually copy the source files into the same directory as your build script, but it also sets the proper target_prefix in the generated Makefile.

Setting the target_prefix will, in turn, install the generated binary in a directory under your RbConfig::CONFIG['sitearchdir'] that mimics your local filesystem when you run make install.

For example, given the following file tree:

Example
ext/
  extconf.rb
  test/
    foo.c

And given the following code:

Example
create_makefile('test/foo', 'test')

That will set the target_prefix in the generated Makefile to “test”. That, in turn, will create the following file tree when installed via the make install command:

/path/to/ruby/sitearchdir/test/foo.so

It is recommended that you use this approach to generate your makefiles, instead of copying files around manually, because some third party libraries may depend on the target_prefix being set properly.

The srcprefix argument can be used to override the default source directory, i.e. the current directory. It is included as part of the VPATH and added to the list of INCFLAGS.

Yields the configuration part of the makefile to be generated, as an array of strings, if the block is given. The returned value will be used the new configuration part.

Example
create_makefile('foo') {|conf|
  [
    *conf,
    "MACRO_YOU_NEED = something",
  ]
}

If “depend” file exist in the source directory, that content will be included in the generated makefile, with formatted by depend_rules method.

With --update-depend, the autogenerated section in “depend” is updated from the sources and objects found by this method. The source tree root is detected from “.git”, or can be specified with --depend-root=DIR. An existing autogenerated section is required.