Commit 1c8bc4d9 authored by Daniel Bovensiepen's avatar Daniel Bovensiepen

Improve README

parent 4e2161c7
...@@ -5,10 +5,10 @@ standardised way into mruby. ...@@ -5,10 +5,10 @@ standardised way into mruby.
## GEM Structure ## GEM Structure
The maximal Gem structure looks like this: The maximal GEM structure looks like this:
``` ```
+- GEM_NAME <- Name of Gem +- GEM_NAME <- Name of GEM
| |
+- mrblib/ <- Source for Ruby extension +- mrblib/ <- Source for Ruby extension
| |
...@@ -16,36 +16,39 @@ The maximal Gem structure looks like this: ...@@ -16,36 +16,39 @@ The maximal Gem structure looks like this:
| |
+- test/ <- Test code (Ruby) +- test/ <- Test code (Ruby)
| |
+- Makefile <- Makefile for Gem +- Makefile <- Makefile for GEM
| |
+- README.md <- Readme for Gem +- README.md <- Readme for GEM
``` ```
The folder *mrblib* contains pure Ruby files to extend mruby. The folder *src* The folder *mrblib* contains pure Ruby files to extend mruby. The folder *src*
contains C files to extend mruby. The folder *test* contains pure Ruby files contains C files to extend mruby. The folder *test* contains pure Ruby files
for testing purposes which will be used by mrbtest. The *Makefile* contains for testing purposes which will be used by mrbtest. The *Makefile* contains
rules to build all C files and integrates them into the normal mruby rules to build a *gem.a* file inside of the GEM directory. Which will be used
build process. *README.md* is a short description of your Gem. for integration into the normal mruby build process. *README.md* is a short
description of your GEM.
All Gems have to be located under *$(MRUBY_ROOT)/mrbgems/g/*. All GEMs have to be located under *$(MRUBY_ROOT)/mrbgems/g/*.
## C Extension ## C Extension
mruby can be extended with C. It is possible by using the C API to integrate C mruby can be extended with C. It is possible by using the C API to
libraries into mruby. You need to use the folder *src* for all C files. Pay integrate C libraries into mruby.
attention that your *Makefile* has to build the source and also add the object
files to libmruby.a The *Makefile* is used for building a C extension. You should
define *GEM* (GEM name), *GEM_C_FILES* (all C files) and
*GEM_OBJECTS* (all Object files). Pay also attention that your
*Makefile* has to build the object files.
### Pre-Conditions ### Pre-Conditions
mrbgems will automatically call the *gem-all* make target of your Gem. Make mrbgems will automatically call the *gem-all* make target of your GEM. Make
sure that you build all files in this target and that you add your object sure that you build all files in this target.
files to libmruby.a
mrbgems expects that you have implemented a C method called mrbgems expects that you have implemented a C method called
*mrb_YOURGEMNAME_gem_init(mrb_state)*. YOURGEMNAME will be replaced *mrb_YOURGEMNAME_gem_init(mrb_state)*. YOURGEMNAME will be replaced
by the name of you Gem. The directory name of your Gem is considered also by the name of you GEM. The directory name of your GEM is considered also
as the name! If you call your Gem directory *c_extension_example*, your as the name! If you call your GEM directory *c_extension_example*, your
initialisation method could look like this: initialisation method could look like this:
``` ```
...@@ -56,7 +59,7 @@ mrb_c_extension_example_gem_init(mrb_state* mrb) { ...@@ -56,7 +59,7 @@ mrb_c_extension_example_gem_init(mrb_state* mrb) {
} }
``` ```
mrbgems will also use the *gem-clean* make target to clean up your Gem. Implement mrbgems will also use the *gem-clean* make target to clean up your GEM. Implement
this target with the necessary rules! this target with the necessary rules!
### Example ### Example
...@@ -80,14 +83,17 @@ this target with the necessary rules! ...@@ -80,14 +83,17 @@ this target with the necessary rules!
## Ruby Extension ## Ruby Extension
mruby can be extended with pure Ruby. It is possible to override existing 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* or add new ones in this way. Put all Ruby files into the *mrblib* folder.
folder. At the moment only one directory layer is supported. So don't
use a deeper structure for now! The *Makefile* is used for building a Ruby extension. You should define
define *GEM* (GEM name) and *GEM_RB_FILES* (all Ruby files).
### Pre-Conditions
mrbgems will automatically call the *gem-all* make target of your GEM.
The *Makefile* is not used for building a Ruby extension. But you still mrbgems will also use the *gem-clean* make target to clean up your GEM. Implement
should maintain this file so that during the build process the progress this target with the necessary rules!
can be visualized. If you want to do additional things during the build
process of your Ruby extension you can use the *Makefile* too.
### Example ### Example
...@@ -107,17 +113,55 @@ process of your Ruby extension you can use the *Makefile* too. ...@@ -107,17 +113,55 @@ process of your Ruby extension you can use the *Makefile* too.
+- README.md +- README.md
``` ```
## Current Limitations ## C and Ruby Extension
The following limitations are currently existing: 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 *srclib* folder.
* Gem _MUST NOT_ have a *src* folder in case it doesn't have a The *Makefile* is used for building a C and Ruby extension. You should
C extension define *GEM* (GEM name), *GEM_C_FILES* (all C files), *GEM_OBJECTS*
* Gem _MUST NOT_ have a *mrblib* folder in case it doesn't have a (all Object files) and *GEM_RB_FILES* (all Ruby files).
Ruby extension
* Only Ruby files in the root directory of *mrblib* will be integrated ### Pre-Conditions
* C files in the directory of *src* are overriding object files with
the same name. mrbgems will automatically call the *gem-all* make target of your GEM. Make
sure that you build all files in this target.
mrbgems expects that you have implemented a C method called
*mrb_YOURGEMNAME_gem_init(mrb_state)*. YOURGEMNAME will be replaced
by the name of you GEM. The directory name of your GEM is considered also
as the name! If you call your GEM directory *c_extension_example*, your
initialisation method could look like this:
```
void
mrb_c_extension_example_gem_init(mrb_state* mrb) {
_class_cextension = mrb_define_module(mrb, "CExtension");
mrb_define_class_method(mrb, _class_cextension, "c_method", mrb_c_method, ARGS_NONE());
}
```
If you have ideas how to fix these issues without implementing to much mrbgems will also use the *gem-clean* make target to clean up your GEM. Implement
complexity into the code please provide your code or idea. this target with the necessary rules!
### 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
|
+- Makefile
|
+- README.md
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment