mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
178 lines
5.0 KiB
Markdown
178 lines
5.0 KiB
Markdown
# 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
|