rake-compiler 0.7.5 → 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.7.6 / 2011-02-04
2
+
3
+ * Bugfixes:
4
+ * Prefer Psych over Syck for YAML parsing on Ruby 1.9.2. [tenderlove]
5
+
1
6
  === 0.7.5 / 2010-11-25
2
7
 
3
8
  * Enhancements:
data/Isolate CHANGED
@@ -1,5 +1,3 @@
1
- options :path => 'isolated'
2
-
3
1
  gem 'rake'
4
2
  gem 'rspec', '~> 1.3.1'
5
3
  gem 'cucumber', '~> 0.9.4'
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008 Luis Lavena.
1
+ Copyright (c) 2008-2011 Luis Lavena.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -1,18 +1,24 @@
1
- = rake-compiler
1
+ = What is rake-compiler?
2
2
 
3
- rake-compiler aims to help Gem developers deal with Ruby extensions, simplifying
4
- code and reducing duplication.
3
+ rake-compiler is first and foremost a productivity tool for Ruby developers.
4
+ It's goal is to make the busy developer's life easier by simplifying the building
5
+ and packaging of Ruby extensions by simplifying code and reducing duplication.
5
6
 
6
- It followss *convention over configuration* and sets a standardized structure to
7
- build and package both C and Java extensions in your gems.
7
+ It follows *convention over configuration* by advocating a standardized build and
8
+ package structure for both C and Java based RubyGems.
8
9
 
9
- This is the result of experiences dealing with several Gems that required native
10
- extensions across platforms and different user configurations where details like
11
- portability and clarity of code were lacking.
10
+ rake-compiler is the result of many hard-won experiences dealing with several
11
+ diverse RubyGems that provided native extensions for different platforms and
12
+ different user configurations in different ways. Details such as differences in
13
+ code portability, differences in code clarity, and differences in project directory
14
+ structure often made it very difficult for newcomers to those RubyGems.
12
15
 
13
- == An Overview
16
+ From these challenges, rake-compiler was born with the single-minded goal of
17
+ making the busy RubyGem developer's life much less difficult.
14
18
 
15
- Let's summarize what rake-compiler provides:
19
+ == Feature Overview
20
+
21
+ Some of the benefits rake-compiler provides include:
16
22
 
17
23
  * No custom rake tasks required. Less code duplication and errors.
18
24
 
@@ -21,28 +27,30 @@ Let's summarize what rake-compiler provides:
21
27
  * Painlessly build extensions for different Ruby implementations (JRuby,
22
28
  Rubinius and MRI).
23
29
 
24
- * Allow multiple extensions be compiled inside the same gem.
30
+ * Allow multiple extensions to be compiled inside the same gem.
25
31
 
26
- * Mimics RubyGems installation process, so helps as a test environment.
32
+ * Painlessly build "fat" native gems for Windows users (from Linux or OSX).
27
33
 
28
- * Simplify cross platform compilation of extensions (target Windows from Linux).
34
+ * Mimics RubyGems standard installation process, helping as a test environment.
29
35
 
30
- == I'm sold! show me how to use it! (Installation)
36
+ * Simplifies cross platform extension compilation (targeting Windows from Linux).
31
37
 
32
- Usage of rake-compiler is pretty much straight forward.
38
+ == OK, I'm sold! Show me how to install it!
33
39
 
34
- First, you need to install the gem:
40
+ Simple:
35
41
 
36
42
  $ gem install rake-compiler
37
43
 
38
- == Now what? (Usage)
44
+ == That's easy. How do I use it?
39
45
 
40
- Now that you have the gem installed, let's give your project some structure.
46
+ Now that you have installed rake-compiler, it's time to give your project a
47
+ standardized structure.
41
48
 
42
- === Structure
49
+ === Using a standardized project structure
43
50
 
44
- Let's say we want to compile an extension called 'hello_world', so we should
45
- organize the code and folders that will help rake-compiler do its job:
51
+ Let's say you want to compile an extension called 'hello_world'. Organizing
52
+ your project's code tree in the following way will help rake-compiler do
53
+ its job:
46
54
 
47
55
  |-- ext
48
56
  | `-- hello_world
@@ -52,12 +60,14 @@ organize the code and folders that will help rake-compiler do its job:
52
60
  |-- lib
53
61
  `-- Rakefile
54
62
 
55
- TIP: Having a consistent folder structure will help developers and newcomers
56
- to find code and also contribute back to your project more easily.
63
+ TIP: Having a consistent project directory structure will help developers and
64
+ newcomers find and understand your code, making it easier for them to
65
+ contribute back to your project.
57
66
 
58
- === Adding the code
67
+ === Adding the code to enable rake-compiler
59
68
 
60
- So now it's time to introduce the code to compile our extension:
69
+ Now the fun part. It's time to introduce the code to your projects Rakefile
70
+ to tell it to use rake-compiler to build your extension:
61
71
 
62
72
  # File: Rakefile
63
73
 
@@ -65,9 +75,11 @@ So now it's time to introduce the code to compile our extension:
65
75
 
66
76
  Rake::ExtensionTask.new('hello_world')
67
77
 
68
- Ok, that's it. No other line of code.
78
+ That's it? Yes, that's it! No other lines of code are needed for
79
+ rake-compiler to work its magic.
69
80
 
70
- If we wanted to do the same for a JRuby extension (written in Java):
81
+ If you want to do the same for a JRuby extension written in Java, it's just
82
+ as easy:
71
83
 
72
84
  # File: Rakefile
73
85
 
@@ -75,37 +87,41 @@ If we wanted to do the same for a JRuby extension (written in Java):
75
87
 
76
88
  Rake::JavaExtensionTask.new('hello_world')
77
89
 
78
- === Compile process
90
+ === The simple process
79
91
 
80
- Those *two* lines of code automatically added the needed rake tasks to build
81
- the hello_world extension. Running Rake on 1.8.x/1.9 (MRI):
92
+ Those *two* simple lines of code automatically added the Rake tasks needed to
93
+ build your 'hello_world' extension. For example, checking the Rake tasks on
94
+ MRI Ruby 1.8.x/1.9 returns something similar to:
82
95
 
83
96
  $ rake -T
84
97
  (in /home/user/my_extension)
85
98
  rake compile # Compile the extension(s)
86
99
  rake compile:hello_world # Compile just the hello_world extension
87
100
 
88
- Simply calling <tt>compile</tt>:
101
+ Simply calling <tt>compile</tt> like
89
102
 
90
103
  $ rake compile
91
104
 
92
- Will do all the compile process for us, putting the result extension inside
93
- <tt>lib</tt> directory.
105
+ performs the entire compile and build process for you and places the resulting
106
+ extension inside the <tt>lib</tt> directory of your project.
94
107
 
95
108
  NOTE: Please be aware that building C extensions requires the proper
96
- development environment for your Platform, which includes libraries, headers
97
- and build tools. Check your distro / vendor documentation on how to install it.
109
+ development environment for your Platform, including libraries, headers
110
+ and build tools. Check your distro / vendor documentation on how to install
111
+ these development resources.
98
112
 
99
113
  NOTE: Building Java extensions requires the <tt>javac</tt>, part of the Java
100
114
  Development Kit (JDK). This should be included by default on Mac OS X, and
101
115
  downloadable from http://java.sun.com for other operating systems.
102
116
 
103
- === Generate native gems
117
+ === Generating native RubyGems
104
118
 
105
- A common usage scenario of rake-compiler is generate native gems that bundles
106
- your extensions.
119
+ A common usage scenario for rake-compiler is generating native gems that
120
+ bundle your extensions. As mentioned above, if you have your development
121
+ environment configured correctly, the following examples work even when
122
+ building native gems on Windows systems.
107
123
 
108
- This got over-simplified with <tt>Rake::ExtensionTask</tt>:
124
+ Creating native gems is really easy with rake-compiler's <tt>Rake::ExtensionTask</tt>:
109
125
 
110
126
  # somewhere in your Rakefile, define your gem spec
111
127
  spec = Gem::Specification.new do |s|
@@ -115,13 +131,14 @@ This got over-simplified with <tt>Rake::ExtensionTask</tt>:
115
131
  end
116
132
 
117
133
  # add your default gem packing task
118
- Rake::GemPackageTask.new(spec) do |pkg|
134
+ Gem::PackageTask.new(spec) do |pkg|
119
135
  end
120
136
 
121
- # feed your ExtensionTask with your spec
137
+ # feed the ExtensionTask with your spec
122
138
  Rake::ExtensionTask.new('hello_world', spec)
123
139
 
124
- Now, as usual, you can build your pure-ruby gem (standard output):
140
+ As expected, you can still build your pure-ruby gem in the usual way
141
+ (standard output) by running:
125
142
 
126
143
  $ rake gem
127
144
  (in /projects/oss/my_gem.git)
@@ -132,7 +149,8 @@ Now, as usual, you can build your pure-ruby gem (standard output):
132
149
  File: my_gem-0.1.0.gem
133
150
  mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem
134
151
 
135
- Plus, you have the functionality to build native versions of the gem:
152
+ Plus, rake-compiler tasks give you the extra functionality needed to build
153
+ native gems by running:
136
154
 
137
155
  # rake native gem
138
156
  (... compilation output ...)
@@ -148,9 +166,10 @@ Plus, you have the functionality to build native versions of the gem:
148
166
  File: my_gem-0.1.0-x86-mingw32.gem
149
167
  mv my_gem-0.1.0-x86-mingw32.gem pkg/my_gem-0.1.0-x86-mingw32.gem
150
168
 
151
- You get two gems for the price of one.
169
+ Did you notice that you get two gems for the price of one? How's that for a
170
+ time saver?
152
171
 
153
- And the same for JRuby extensions:
172
+ Similarly, it's just as easy to do the same thing for JRuby extensions:
154
173
 
155
174
  # rake java gem
156
175
  (... compilation output ...)
@@ -167,72 +186,85 @@ And the same for JRuby extensions:
167
186
  mv my_gem-0.1.0-java.gem pkg/my_gem-0.1.0-java.gem
168
187
 
169
188
 
170
- === What about breaking the standards? (Customization)
189
+ === Great, but can I use a non-standard project structure?
171
190
 
172
- In case you want to bend the convention established, rake-compiler let you
173
- personalize several settings for <tt>Rake::ExtensionTask</tt>:
191
+ Yes you can! While the conventional project structure is recommended, you may
192
+ want, or need, to tweak those conventions. Rake-compiler allows you to customize
193
+ several settings for <tt>Rake::ExtensionTask</tt>:
174
194
 
175
195
  Rake::ExtensionTask.new do |ext|
176
196
  ext.name = 'hello_world' # indicate the name of the extension.
177
197
  ext.ext_dir = 'ext/weird_world' # search for 'hello_world' inside it.
178
198
  ext.lib_dir = 'lib/my_lib' # put binaries into this folder.
179
- ext.config_script = 'custom_extconf.rb' # use instead of 'extconf.rb' default
199
+ ext.config_script = 'custom_extconf.rb' # use instead of the default 'extconf.rb'.
180
200
  ext.tmp_dir = 'tmp' # temporary folder used during compilation.
181
201
  ext.source_pattern = "*.{c,cpp}" # monitor file changes to allow simple rebuild.
182
- ext.config_options << '--with-foo' # supply additional configure options to config script.
183
- ext.gem_spec = spec # optional indicate which gem specification
184
- # will be used to based on.
202
+ ext.config_options << '--with-foo' # supply additional options to configure script.
203
+ ext.gem_spec = spec # optionally indicate which gem specification
204
+ # will be used.
185
205
  end
186
206
 
187
- == Future is now: Cross compilation
207
+ == Cross compilation - the future is now.
208
+
209
+ Rake-compiler also provides a standardized way to generate, from either Linux
210
+ or OSX, extensions and gem binaries for your Windows users!
188
211
 
189
- rake-compiler provides now an standardized way to generate, from Linux or OSX
190
- both extensions and gem binaries for Windows!
212
+ How can this be you say? Simple, rake-compiler's cross compilation features
213
+ take advantage of GCC's host/target capabilities to build 'target' binaries on
214
+ different 'host' OS's.
191
215
 
192
- It takes advantages from GCC host/target to build binaries (for target) on
193
- different OS (hosts).
216
+ === How I do this from Linux or OSX?
194
217
 
195
- === How I enjoy this?
218
+ In addition to having the development tool chain installed (GCC), you also need to
219
+ install your platform's <tt>mingw32</tt> cross compilation package.
196
220
 
197
- Besides having the development tool chain installed (GCC), you should install
198
- also <tt>mingw32</tt> cross compilation package.
221
+ Installation depends upon your operating system/distribution. On Ubuntu and Debian
222
+ host machines, a simple <tt>apt-get install mingw32</tt> will be enough.
199
223
 
200
- Installation depends will depend on your operating system/distribution. On
201
- Ubuntu and Debian machines, a simple <tt>apt-get install mingw32</tt> will be
202
- enough.
224
+ On Arch, <tt>mingw32</tt> is installed by running <tt>pacman -S mingw32-gcc</tt>
203
225
 
204
- On OSX, mingw32 is available via MacPorts: <tt>port install i386-mingw32-gcc</tt>
205
- (ensure you update your ports tree before hand as <tt>mingw32</tt> has been
206
- been broken).
226
+ On OSX, <tt>mingw32</tt> is available via MacPorts via <tt>port install i386-mingw32-gcc</tt>
227
+ (ensure your ports tree is updated as <tt>mingw32</tt> has been broken in the past).
207
228
 
208
- === I have my tool-chain, now what?
229
+ === I've got my tool-chain installed, now what?
209
230
 
210
- You need to build Ruby for Windows.
231
+ First, you need to build Ruby for Windows on your Linux or OSX system.
211
232
 
212
- Relax, no need to freak out! Let rake-compiler do it for you:
233
+ Relax, no need to freak out! Let rake-compiler do all the heavy lifting for you:
213
234
 
214
235
  rake-compiler cross-ruby
215
236
 
216
- And you're done. It will automatically download, configure and compile latest
217
- stable version of Ruby for Windows, and place it into <tt>~/.rake-compiler</tt>
237
+ And you're done. It will automatically download, configure and compile the latest
238
+ stable version of Ruby for Windows, and place it into your <tt>~/.rake-compiler</tt>
239
+ directory.
240
+
241
+ This will create <tt>~/.rake-compiler/config.yml</tt> file so that rake-compiler
242
+ knows where to find the <tt>rbconfig.rb</tt> file that matches the Ruby version
243
+ on the Windows host system you're cross-compiling for. An example:
244
+
245
+ # File: ~/.rake-compiler/config.yml
218
246
 
219
- If, instead, you want to build another version than the default one, please
247
+ rbconfig-1.8.6: /path/to/ruby-1.8.6/rbconfig.rb
248
+ rbconfig-1.8.7: /path/to/ruby-1.8.7/rbconfig.rb
249
+ rbconfig-1.9.2: /path/to/ruby-1.9.2/rbconfig.rb
250
+
251
+ If, instead, you want to build a different Ruby version than the default one, please
220
252
  supply a <tt>VERSION</tt>:
221
253
 
222
254
  rake-compiler cross-ruby VERSION=1.8.6-p114
223
255
 
224
- If you, like me, have multiple versions of MinGW packages, you can specify the
225
- HOST that will be used to cross compile ruby:
256
+ If you, like me, have multiple versions of MinGW packages installed, you can
257
+ specify the HOST that will be used to cross compile Ruby:
226
258
 
227
259
  rake-compiler cross-ruby HOST=i386-mingw32 # (OSX mingw32 port)
228
260
 
229
261
  The host will vary depending on provider (mingw32 versus mingw-w64 projects).
230
- Consult the documentation and website of the MinGW package provider before
231
- reporting any issue.
262
+ Please consult the documentation and website of the MinGW package provider before
263
+ reporting any issues.
232
264
 
233
- === Let's build some gems!
265
+ === OK, let's cross compile some gems!
234
266
 
235
- Now, you only need to use additional options in your extension definition:
267
+ Now, you only need specify a few additional options in your extension definition:
236
268
 
237
269
  Rake::ExtensionTask.new('my_extension', gem_spec) do |ext|
238
270
  ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
@@ -246,61 +278,73 @@ Now, you only need to use additional options in your extension definition:
246
278
  end
247
279
  end
248
280
 
249
- By default, cross compilation targets 'i386-mingw32' which is default GCC platform
250
- for Ruby.
281
+ By default, cross compilation targets 'i386-mingw32' which is the default GCC
282
+ platform for Ruby.
251
283
 
252
- To target gems for current Ruby official distribution, please force the platform
253
- to the one shown before.
284
+ To target gems for MRI Ruby's current official distribution, please force the
285
+ platform to the one (i386-mswin32) previously shown.
254
286
 
255
- === Magician doing some tricks, don't blink!
287
+ === Warning, magician about to do some tricks, don't blink!
256
288
 
257
- Compiles keeps being simple:
289
+ Cross compiling is still very simple:
258
290
 
259
291
  rake cross compile
260
292
 
261
- And now, build your gems for Windows is just 5 more letters:
293
+ And now, building gems for your Windows users is just 5 more letters:
262
294
 
263
295
  rake cross native gem
264
296
 
265
297
  And you're done, yeah.
266
298
 
267
- === Take it even further
299
+ === But wait, there's more
268
300
 
269
- You can specify against with version of Ruby you want to build the extension:
301
+ You can specify which version of Ruby to build the extension against:
270
302
 
271
303
  rake cross compile RUBY_CC_VERSION=1.8.6
272
304
 
273
- If you installed <tt>1.9.1</tt>, you can do:
305
+ For example, if you installed <tt>1.9.2</tt>, you can do:
274
306
 
275
- rake cross compile RUBY_CC_VERSION=1.9.1
307
+ rake cross compile RUBY_CC_VERSION=1.9.2
276
308
 
277
- Even more, you can target multiple versions (ie. 1.8.6 and 1.9.1):
309
+ Even better, you can target multiple versions (ie. 1.8.6 and 1.9.2) in
310
+ the same gem via:
278
311
 
279
- rake cross compile RUBY_CC_VERSION=1.8.6:1.9.1
312
+ rake cross compile RUBY_CC_VERSION=1.8.6:1.9.2
280
313
 
281
- And more exiting, bundle both binaries in one "fat" Gem:
314
+ And better yet, you can bundle both binary extensions into one so-called "fat"
315
+ gem via:
282
316
 
283
- rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1
317
+ rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.2
284
318
 
285
- That will place binaries for 1.8 and 1.9 versions of ruby inside <tt>lib_dir</tt>
319
+ That will place binaries for both the 1.8 and 1.9 versions of your Ruby
320
+ extensions inside your project's <tt>lib_dir</tt> directory:
286
321
 
287
322
  lib/1.8/my_extension.so
288
323
  lib/1.9/my_extension.so
289
324
 
290
- Now is up to you to make your gem load the proper one ;-)
325
+ NOTE: building "fat" gems is currently only supported by rake-compiler when
326
+ cross compiling from a Linux or OSX host. Patches are welcome if building
327
+ "fat" gems from Windows hosts is desired, or natively for your platform :-)
328
+
329
+ Now is up to you to make your gem load the proper binary at runtime. Here's a hint ;-)
330
+
331
+ RUBY_VERSION =~ /(\d+.\d+)/
332
+ require "#{$1}/my_extension"
291
333
 
292
334
  === What are you talking about? (Give me examples)
293
335
 
294
- I know all the above sounds like a complete foreign language (it does even for me!). So, what if I show you some examples?
336
+ I know all the above sounds like a complete foreign language (it does even for me!).
337
+ So, what if I show you some examples?
295
338
 
296
- Check our wiki with links to the proper rake files used by many developers and projects and how they use rake-compiler.
339
+ Check our wiki with links to the proper rake files used by many developers and
340
+ projects and how they use rake-compiler.
297
341
 
298
342
  http://github.com/luislavena/rake-compiler/wiki/projects-using-rake-compiler
299
343
 
300
344
  == Future
301
345
 
302
- rake-compiler is a work in progress and we will appreciate feedback during the
303
- development of it! (and contributions too!)
346
+ rake-compiler is a work in progress and we appreciate any and all feedback
347
+ during the development of it! (and contributions too!)
304
348
 
305
349
  You can find more information about rake-compiler:
306
350
 
@@ -4,6 +4,12 @@ require 'rake'
4
4
  require 'rake/clean'
5
5
  require 'rake/tasklib'
6
6
  require 'rbconfig'
7
+
8
+ begin
9
+ require 'psych'
10
+ rescue LoadError
11
+ end
12
+
7
13
  require 'yaml'
8
14
  require 'pathname'
9
15
 
@@ -19,6 +19,12 @@
19
19
 
20
20
  require 'rake'
21
21
  require 'rake/clean'
22
+
23
+ begin
24
+ require 'psych'
25
+ rescue LoadError
26
+ end
27
+
22
28
  require 'yaml'
23
29
 
24
30
  # load compiler helpers
data/tasks/gem.rake CHANGED
@@ -3,7 +3,7 @@ require 'rubygems/package_task'
3
3
  GEM_SPEC = Gem::Specification.new do |s|
4
4
  # basic information
5
5
  s.name = "rake-compiler"
6
- s.version = "0.7.5"
6
+ s.version = "0.7.6"
7
7
  s.platform = Gem::Platform::RUBY
8
8
 
9
9
  # description and details
@@ -18,9 +18,9 @@ GEM_SPEC = Gem::Specification.new do |s|
18
18
  s.add_dependency 'rake'
19
19
 
20
20
  # development dependencies
21
- s.add_development_dependency 'rspec', '~> 1.2.9'
22
- s.add_development_dependency 'cucumber', '~> 0.4.4'
23
- #s.add_development_dependency 'rcov', '~> 0.9.6'
21
+ s.add_development_dependency 'rspec', '~> 1.3.1'
22
+ s.add_development_dependency 'cucumber', '~> 0.9.4'
23
+ #s.add_development_dependency 'rcov', '~> 0.9.9'
24
24
 
25
25
  # components, files and paths
26
26
  s.files = FileList["features/**/*.{feature,rb}", "bin/rake-compiler",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rake-compiler
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
5
- prerelease: false
4
+ hash: 15
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 5
10
- version: 0.7.5
9
+ - 6
10
+ version: 0.7.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Luis Lavena
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-25 00:00:00 -03:00
18
+ date: 2011-02-04 00:00:00 -03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -40,12 +40,12 @@ dependencies:
40
40
  requirements:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
- hash: 13
43
+ hash: 25
44
44
  segments:
45
45
  - 1
46
- - 2
47
- - 9
48
- version: 1.2.9
46
+ - 3
47
+ - 1
48
+ version: 1.3.1
49
49
  type: :development
50
50
  version_requirements: *id002
51
51
  - !ruby/object:Gem::Dependency
@@ -56,12 +56,12 @@ dependencies:
56
56
  requirements:
57
57
  - - ~>
58
58
  - !ruby/object:Gem::Version
59
- hash: 7
59
+ hash: 51
60
60
  segments:
61
61
  - 0
62
+ - 9
62
63
  - 4
63
- - 4
64
- version: 0.4.4
64
+ version: 0.9.4
65
65
  type: :development
66
66
  version_requirements: *id003
67
67
  description: |-
@@ -156,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
156
  requirements: []
157
157
 
158
158
  rubyforge_project: rake-compiler
159
- rubygems_version: 1.3.7
159
+ rubygems_version: 1.5.0
160
160
  signing_key:
161
161
  specification_version: 3
162
162
  summary: Rake-based Ruby Extension (C, Java) task generator.