Class: Inventory::Rake::Tasks::Compile

Inherits:
Object
  • Object
show all
Includes:
Rake::DSL
Defined in:
lib/inventory-rake-1.0/tasks/compile.rb

Overview

Defines tasks for compiling and cleaning extensions.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) {|?| ... } ⇒ Compile

Sets up tasks based on INVENTORY, optionally yields the task object for further customization, then #defines the tasks.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :inventory (Inventory) — default: Inventory::Rake::Tasks.inventory

    The inventory to use

Yields:

  • (?)

Yield Parameters:

  • task (self)

15
16
17
18
19
# File 'lib/inventory-rake-1.0/tasks/compile.rb', line 15

def initialize(options = {})
  self.inventory = options.fetch(:inventory, Inventory::Rake::Tasks.inventory)
  yield self if block_given?
  define
end

Instance Attribute Details

#inventory=(value) ⇒ Inventory (writeonly)

Returns The inventory to use: VALUE.

Parameters:

Returns:

  • (Inventory)

    The inventory to use: VALUE


112
113
114
# File 'lib/inventory-rake-1.0/tasks/compile.rb', line 112

def inventory=(value)
  @inventory = value
end

Instance Method Details

#defineObject

Defines the following task:

<dl>

<dt>compile</dt>
<dd>Compile all extensions; depends on each compile:<em>name</em>.</dd>

</dl>

Then, for each extension in the inventory, define the following tasks:

<dl>

<dt>compile:<em>name</em></dt>
<dd>Compile extension <em>name</em>; depends on
lib/<em>path</em>/<em>so</em> file.</dd>

<dt>lib/<em>path</em>/<em>so</em></dt>
<dd>Installed dynamic library of extension <em>name</em> inside inventory
path; depends on ext/<em>name</em>/<em>so</em>.</dd>

<dt>ext/<em>name</em>/<em>so</em></dt>
<dd>Dynamic library of extension <em>name</em>; depends on
ext/<em>name</em>/Makefile and the source files of the extension.</dd>

<dt>ext/<em>name</em>/Makefile</dt>
<dd>Makefile for extension <em>name</em>; depends on inventory path,
ext/<em>name</em>/extconf.rb file, and ext/<em>name</em>/depend file.
Will be created by extconf.rb, which may take options from environment
variable <em>name#upcase</em><code>_EXTCONF_OPTIONS</code> or
<code>EXTCONF_OPTIONS</code> if defined.</dd>

<dt>clean:<em>name</em></dt>
<dd>Clean files built for extension <em>name</em>; depended upon by
clean.</dd>

</dl>

Finally, if defined, the test task is set to depend on the compile task.


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/inventory-rake-1.0/tasks/compile.rb', line 57

def define
  desc 'Compile extensions' unless Rake::Task.task_defined? :compile
  task :compile

  @inventory.extensions.each do |extension|
    name = :"compile:#{extension}"
    makefile = '%s/Makefile' % extension.directory
    ext_so = '%s/%s.%s' % [extension.directory,
                           extension.name.delete('-'),
                           RbConfig::CONFIG['DLEXT']]
    lib_so = 'lib/%s/%s' % [@inventory.package_path, File.basename(ext_so)]

    task :compile => name

    task name => lib_so

    file lib_so => ext_so do
      install ext_so, lib_so
    end

    file ext_so => [makefile] + extension.source_files do
      sh 'make -C %s' % extension.directory
    end

    file makefile => [@inventory.path, extension.extconf, extension.depend] do
      Dir.chdir extension.directory do
        options = ENV['%s_EXTCONF_OPTIONS' % extension.to_s.upcase] || ENV['EXTCONF_OPTIONS']
        file = '%s.options' % File.basename(extension.extconf)
        write = options
        options = begin
                    File.open(file, 'rb', &:read)
                  rescue Errno::ENOENT
                    nil
                  end unless options
        ruby '%s %s' % [File.basename(extension.extconf), options]
        File.open(file, 'wb'){ |f| f.write(options) } if write
      end
    end

    %w[clean distclean].each do |cname|
      clean_name = :"#{cname}:#{extension}"
      desc 'Clean files built for extension %s' % extension
      task clean_name do
        sh 'make -C %s %s' % [extension.directory, cname] if File.exist? makefile
      end

      task :"#{cname}" => clean_name
    end
  end

  task :test => :compile if Rake::Task.task_defined? :test
end