mrbgems
mrbgems is a library manager to integrate C and Ruby extension in an easy and standardised way into mruby.
Usage
By default mrbgems is currently deactivated. As soon as you add a GEM to your build configuration (build_config.rb), mrbgems will be activated and the extension integrated.
To add a GEM into the build_config.rb add the following line for example:
conf.gem '/path/to/your/gem/dir'
You can also use a relative path which would be relative from the mruby root:
conf.gem 'examples/mrbgems/ruby_extension_example'
A remote GIT repository location for a GEM is also supported:
conf.gem :git => 'https://github.com/masuidrive/mrbgems-example.git', :branch => 'master'
conf.gem :github => 'masuidrive/mrbgems-example', :branch => 'master'
GEM Structure
The maximal GEM structure looks like this:
+- GEM_NAME <- Name of GEM
|
+- mrblib/ <- Source for Ruby extension
|
+- src/ <- Source for C extension
|
+- test/ <- Test code (Ruby)
|
+- mrbgem.rake <- GEM Specification
|
+- README.md <- Readme for GEM
The folder mrblib contains pure Ruby files to extend mruby. The folder src
contains C files to extend mruby. The folder test contains C and pure Ruby files
for testing purposes which will be used by mrbtest. mrbgem.rake contains
the specification to compile C and Ruby files. README.md is a short description
of your GEM.
Build process
mrbgems expects a specifcation file called mrbgem.rake inside of your GEM direcotry. A typical GEM specification could look like this for example:
MRuby::Gem::Specification.new('c_and_ruby_extension_example') do |spec|
spec.license = 'MIT'
spec.authors = 'mruby developers'
end
The mrbgems build process will use this specification to compile Object and Ruby
files. The compilation results will be add to lib/libmruby.a. This file is used
by tools like mruby and mirb to empower the GEM functionality.
In case your GEM has more complex build requirements you can use the following options additionally inside of your GEM specification:
- spec.cflags (C compiler flags for this GEM)
- spec.mruby_cflags (global C compiler flags for everything)
- spec.mruby_ldflags (global linker flags for everything)
- spec.mruby_libs (global libraries for everything)
- spec.mruby_includes (global includes for everything)
- spec.rbfiles (Ruby files to compile)
- spec.objs (Object files to compile)
- spec.test_rbfiles (Ruby test files for integration into mrbtest)
- spec.test_objs (Object test files for integration into mrbtest)
- spec.test_preload (Initialization files for mrbtest)
C Extension
mruby can be extended with C. This is possible by using the C API to integrate C libraries into mruby.
Pre-Conditions
mrbgems expects that you have implemented a C method called
mrb_YOURGEMNAME_gem_init(mrb_state). YOURGEMNAME will be replaced
by the name of your GEM. If you call your GEM c_extension_example, your
initialisation method could look like this:
void
mrb_c_extension_example_gem_init(mrb_state* mrb) {
struct RClass *class_cextension = mrb_define_module(mrb, "CExtension");
mrb_define_class_method(mrb, class_cextension, "c_method", mrb_c_method, ARGS_NONE());
}
Finalize
mrbgems expects that you have implemented a C method called
mrb_YOURGEMNAME_gem_final(mrb_state). YOURGEMNAME will be replaced
by the name of your GEM. If you call your GEM c_extension_example, your
finalizer method could look like this:
void
mrb_c_extension_example_gem_final(mrb_state* mrb) {
free(someone);
}
Example
+- c_extension_example/
|
+- src/
| |
| +- example.c <- C extension source
|
+- test/
| |
| +- example.rb <- Test code for C extension
|
+- mrbgem.rake <- GEM specification
|
+- README.md
Ruby Extension
mruby can be extended with pure Ruby. It is possible to override existing classes or add new ones in this way. Put all Ruby files into the mrblib folder.
Pre-Conditions
none
Example
+- ruby_extension_example/
|
+- mrblib/
| |
| +- example.rb <- Ruby extension source
|
+- test/
| |
| +- example.rb <- Test code for Ruby extension
|
+- mrbgem.rake <- GEM specification
|
+- README.md
C and Ruby Extension
mruby can be extended with C and Ruby at the same time. It is possible to override existing classes or add new ones in this way. Put all Ruby files into the mrblib folder and all C files into the src folder.
Pre-Conditions
See C and Ruby example.
Example
+- c_and_ruby_extension_example/
|
+- mrblib/
| |
| +- example.rb <- Ruby extension source
|
+- src/
| |
| +- example.c <- C extension source
|
+- test/
| |
| +- example.rb <- Test code for C and Ruby extension
|
+- mrbgem.rake <- GEM specification
|
+- README.md