Every repository with this icon (
Every repository with this icon (
| name | age | message | |
|---|---|---|---|
| |
.gitignore | Sat Nov 22 14:49:18 -0800 2008 | |
| |
LICENSE.txt | Thu Nov 06 20:35:02 -0800 2008 | |
| |
README.rdoc | ||
| |
Rakefile | Sun Nov 23 08:51:59 -0800 2008 | |
| |
bin/ | Fri Nov 28 04:42:58 -0800 2008 | |
| |
cucumber.yml | Sat Nov 22 14:49:18 -0800 2008 | |
| |
features/ | Thu Nov 27 06:10:56 -0800 2008 | |
| |
lib/ | Thu Nov 27 07:41:01 -0800 2008 | |
| |
rake-compiler.gemspec | Fri Nov 28 06:14:13 -0800 2008 | |
| |
spec/ | Thu Nov 27 07:41:01 -0800 2008 | |
| |
tasks/ |
rake-compiler
rake-compiler aims to help Gem developers while dealing with Ruby C extensions, simplifiying the code and reducing the duplication.
It follows *convention over configuration* and set an standarized structure to build and package C extensions in your gems.
This is the result of expriences dealing with several Gems that required native extensions across platforms and different user configurations where details like portability and clarity of code were lacking.
An Overview
Let’s summarize what rake-compiler provides:
- No custom rake tasks required. Less code duplication and errors.
- Painlessly build extensions on different platforms (Linux, OSX and Windows).
- Allow multiple extensions be compiled inside the same gem.
- Mimics RubyGems installation process, so helps as test environment.
I’m sold! show me how to use it! (Installation)
Usage of rake-compiler is pretty much straight forward.
First, you need to install the gem:
$ gem install rake-compiler
Since this package is in constant evolution, you could try installing it from GitHub:
$ gem install luislavena-rake-compiler --source http://gems.github.com
The development gem is usually in pretty good shape actually.
Now what? (Usage)
Now that you have the gem installed, let’s give your project some structure.
Structure
Let’s say we want to compile an extension called ‘hello_world’, so we should organize the code and folders that will help rake-compiler do it’s job:
|-- ext
| `-- hello_world
| |-- extconf.rb
| `-- hello_world.c
|-- lib
`-- Rakefile
TIP: Having a consistent folder structure will help developers and newcomers to find code and also contribute back to your project more easily.
Adding the code
So now it’s time to introduce the code to compile our extension:
# File: Rakefile
require 'rake/extensiontask'
Rake::ExtensionTask.new('hello_world')
Ok, that’s it. No other line of code.
Compile process
Those two lines of code automatically added the needed rake tasks to build the hello_world extension:
$ rake -T (in /home/user/my_extesion) rake compile # Compile the extension(s) rake compile:hello_world # Compile just the hello_world extension
Simply calling compile:
$ rake compile
Will do all the compile process for us, putting the result extension inside lib directory.
NOTE: Please be aware that building C extensions requires the proper development environment for your Platform, which includes libraries, headers and build tools. Check your distro / vendor documentation on how to install it.
Generate native gems
A common usage scenario of rake-compiler is generate native gems that bundles your extensions.
This got over-simplified with Rake::ExtensionTask:
# somewhere in your Rakefile, define your gem spec
spec = Gem::Specification.new do |s|
s.name = "my_gem"
s.platform = Gem::Platform::RUBY
s.extensions = FileList["ext/**/extconf.rb"]
end
# add your default gem packing task
Rake::GemPackageTask.new(spec) do |pkg|
end
# feed your ExtensionTask with your spec
Rake::ExtensionTask.new('hello_world', spec)
Now, as usual, you can build your pure-ruby gem (standard output):
$ rake gem
(in /projects/oss/my_gem.git)
mkdir -p pkg
Successfully built RubyGem
Name: my_gem
Version: 0.1.0
File: my_gem-0.1.0.gem
mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem
Plus, you have the functionality to build native versions of the gem:
# rake native gem
(... compilation output ...)
mkdir -p pkg
Successfully built RubyGem
Name: my_gem
Version: 0.1.0
File: my_gem-0.1.0.gem
mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem
Successfully built RubyGem
Name: my_gem
Version: 0.1.0
File: my_gem-0.1.0-x86-mingw32.gem
mv my_gem-0.1.0-x86-mingw32.gem pkg/my_gem-0.1.0-x86-mingw32.gem
You get two gems for the price of one.
What about breaking the standards? (Customization)
In case you want to bend the convention established, rake-compiler let you personalize several settings for Rake::ExtensionTask:
Rake::ExtensionTask.new do |ext|
ext.name = 'hello_world' # indicate the name of the extension.
ext.ext_dir = 'ext/weird_world' # search for 'hello_world' inside it.
ext.lib_dir = 'lib/my_lib' # put binaries into this folder.
ext.config_script = 'custom_extconf.rb' # use instead of 'extconf.rb' default
ext.tmp_dir = 'tmp' # temporary folder used during compilation.
ext.source_pattern = "*.{c,cpp}" # monitor file changes to allow simple rebuild.
ext.additional_options << '--with-foo' # supply addition configure options to config script-
ext.gem_spec = spec # optional indicate which gem specification
# will be used to based on.
end
Future
rake-compiler is a work in progress and we will appreciate feedback during the development of it! (and contributions too!)
You can find more information about rake-compiler:
Blog: blog.mmediasys.com GitHub: github.com/luislavena/rake-compiler
Some of the features already underworks
- Rake::JavaJarTask to generate jar packages and gems for
JRuby.
$ rake java gem
Disclaimer
If you have any trouble, don’t hesitate to contact the author. As always, I’m not going to say "Use at your own risk" because I don’t want this library to be risky.
If you trip on something, I’ll share the liability by repairing things as quickly as I can. Your responsibility is to report the inadequacies.








