class Mkrf::Generator
Generator
is concerned with taking configuration for an
extension and writing a Rakefile
to the local filesystem which
will later be used to build the extension.
You will typically only create one Generator
per
extconf.rb
file, which in turn will generate a Rakefile for
building one extension module.
Usage¶ ↑
In the most basic usage, Generator
simply takes the name of
the library to compile:
require 'mkrf' Mkrf::Generator.new('libtrivial')
Configuration of the build can be passed to the Generator
constructor as a block:
Mkrf::Generator.new('libxml') do |g| g.include_library('socket','socket') g.include_header('libxml/xmlversion.h', '/opt/include/libxml2', '/usr/local/include/libxml2', '/usr/include/libxml2') end
It is also possible to specify the library paths in #include_library
Mkrf::Generator.new('libxml') do |g| g.include_library('socket','socket', '/usr/local/lib/libxml') end
Constants
- CONFIG
Attributes
Any extra code, given as a string, to be appended to the Rakefile.
You may append to these attributes directly in your ::new block, for example:
g.objects << ' ../common/foo.o ../common/bar.so
-lmystuff'
or g.cflags << ' -ansi
-Wall'
Note the extra space at the beginning of those strings.
objects
is for adding additional object files to the
link-edit command – outside of the ones that correspond to the source
files.
Public Class Methods
Create a Generator
object which writes a Rakefile to the
current directory of the local filesystem.
Params:
-
extension_name
– the name of the extension -
source_patterns
– an array of patterns describing source files to be compiled. [“*.c”] is the default.
# File lib/mkrf/generator.rb, line 73 def initialize(extension_name, source_patterns = ["*.c"], availability_options = {}) @sources = source_patterns @extension_name = extension_name + ".#{CONFIG['DLEXT']}" @available = Mkrf::Availability.new(availability_options) @defines = [] if @sources[0] =~ /cpp/ @cc = 'g++' # should be in CONFIG['C++'] but is not. @source_extension = 'cpp' else @cc = CONFIG['CC'] @source_extension = 'c' end @objects = '' @ldshared = '' @cflags = "#{CONFIG['CCDLFLAGS']} #{CONFIG['CFLAGS']} #{CONFIG['ARCH_FLAG']}" yield self if block_given? write_rakefile end
Public Instance Methods
Logs a fatal error and exits with a non-zero code (defaults to 1)
# File lib/mkrf/generator.rb, line 147 def abort!(str, code = 1) logger.fatal str exit code end
Add a define to the compile string. Example:
Mkrf::Generator.new('my_library') do |g| g.add_define('HAVE_PTHREADS') end
Params:
-
defn
– string to add to compile time defines
# File lib/mkrf/generator.rb, line 107 def add_define(defn) @available.defines << defn end
Returns true
if the function is able to be called based on
libraries and headers currently loaded. Returns false
otherwise.
Params:
-
function
– the function to check for
# File lib/mkrf/generator.rb, line 132 def has_function?(function) @available.has_function? function end
Include a header in the compile. Returns false
if the header
is not available, returns non-false otherwise. As a side effect, a compile
time define occurs as HAVE_
appended with the name of the
header in upper and scored case. Parameters are the same as Mkrf::Availability#include_header
# File lib/mkrf/generator.rb, line 123 def include_header(*args) @available.include_header(*args) end
Include a library in the compile. Returns false
if the library
is not available. Returns non-false otherwise. Parameters are the same as
Mkrf::Availability#include_library
# File lib/mkrf/generator.rb, line 114 def include_library(*args) @available.include_library(*args) end
Returns mkrf's logger instance. You can use this to set logging levels.
Mkrf::Generator.new('libsomethin') do |g| g.logger.level = Logger::WARN end
# File lib/mkrf/generator.rb, line 142 def logger @available.logger end
An array of the source patterns as single quoted strings
# File lib/mkrf/generator.rb, line 95 def sources @sources.collect {|s| "'#{s}'"} end