Commit 62b652c2 authored by Daniel Bovensiepen's avatar Daniel Bovensiepen

Catch some corner cases

parent 7b8b3c02
# mrbgems
mrbgems is a library manager to integrate C and Ruby extension in an easy and
standardized way into mruby.
## GEM Structure
+- GEM_NAME <- Name of Gem
|
+- mrblib/ <- Source for Ruby extension
|
+- src/ <- Source for C extension
|
+- test/ <- Test code (Ruby)
|
+- Makefile <- Makefile for Gem
|
+- README.md <- Readme for Gem
## C Extension
### Example
+- c_extension_example/
|
+- src/
| |
| +- example.c <- C extension source
|
+- test/
| |
| +- example.rb <- Test code for C extension
|
+- Makefile <- Build rules for C extension
|
+- README.md
## Ruby Extension
### Example
+- ruby_extension_example/
|
+- mrblib/
| |
| +- example.rb <- Ruby extension source
|
+- test/
| |
| +- example.rb <- Test code for Ruby extension
|
+- Makefile
|
+- README.md
...@@ -59,7 +59,8 @@ $(GEMDLIB) : ...@@ -59,7 +59,8 @@ $(GEMDLIB) :
# clean driver and all gems # clean driver and all gems
.PHONY : clean .PHONY : clean
clean : $(GEM_MAKEFILE) clean : $(GENERATOR_BIN)
@echo "Cleanup Gems" @echo "Cleanup Gems"
$(GENERATOR_BIN) makefile > $(GEM_MAKEFILE)
$(MAKE) clean -C g $(MAKE) clean -C g
-$(RM_F) $(INIT).c *.o *.d $(GENERATOR_BIN) $(GEM_MAKEFILE) -$(RM_F) $(INIT).c *.o *.d $(GENERATOR_BIN) $(GEM_MAKEFILE)
...@@ -45,8 +45,8 @@ directory_exists(char path[4096]) { ...@@ -45,8 +45,8 @@ directory_exists(char path[4096]) {
* FALSE => template for all GEMs * FALSE => template for all GEMs
* *
*/ */
void static char
for_each_gem (char before[1024], char after[1024], *for_each_gem (char before[1024], char after[1024],
char start[1024], char end[1024], char start[1024], char end[1024],
char dir_to_skip[1024]) char dir_to_skip[1024])
{ {
...@@ -99,7 +99,7 @@ for_each_gem (char before[1024], char after[1024], ...@@ -99,7 +99,7 @@ for_each_gem (char before[1024], char after[1024],
} }
strcat(complete_line, end); strcat(complete_line, end);
puts(complete_line); return complete_line;
} }
/* /*
...@@ -109,6 +109,11 @@ for_each_gem (char before[1024], char after[1024], ...@@ -109,6 +109,11 @@ for_each_gem (char before[1024], char after[1024],
void void
make_gem_makefile() make_gem_makefile()
{ {
char *gem_check = "";
int gem_empty;
int gem_c_empty;
int gem_ruby_empty;
puts("CFLAGS := -I. -I../../include -I../../src"); puts("CFLAGS := -I. -I../../include -I../../src");
puts(""); puts("");
puts("ifeq ($(OS),Windows_NT)"); puts("ifeq ($(OS),Windows_NT)");
...@@ -118,15 +123,53 @@ make_gem_makefile() ...@@ -118,15 +123,53 @@ make_gem_makefile()
puts("endif"); puts("endif");
puts(""); puts("");
gem_check = for_each_gem("", "", "", "", "");
if (strcmp(gem_check, "") == 0)
gem_empty = TRUE;
else
gem_empty = FALSE;
gem_check = for_each_gem("", "", "", "", "src");
if (strcmp(gem_check, "") == 0)
gem_c_empty = TRUE;
else
gem_c_empty = FALSE;
gem_check = for_each_gem("", "", "", "", "mrblib");
if (strcmp(gem_check, "") == 0)
gem_ruby_empty = TRUE;
else
gem_ruby_empty = FALSE;
puts(".PHONY : all"); puts(".PHONY : all");
if (gem_empty) {
puts("all :");
puts("");
}
else {
if (gem_c_empty) {
puts("all : mrblib_gem.o");
puts("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o");
}
else if (gem_ruby_empty) {
puts("all : all_gems");
}
else {
puts("all : all_gems mrblib_gem.o"); puts("all : all_gems mrblib_gem.o");
puts("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o"); puts("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o");
}
puts(""); puts("");
// Rule for building all C extensions of each Gem
if (!gem_c_empty) {
puts("all_gems :"); puts("all_gems :");
for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", ""); puts(for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", ""));
puts(""); puts("");
}
// Rule for building all Ruby Extension of each Gem
if (!gem_ruby_empty) {
puts("mrblib_gem.o : mrblib_gem.c"); puts("mrblib_gem.o : mrblib_gem.c");
puts(""); puts("");
...@@ -139,8 +182,10 @@ make_gem_makefile() ...@@ -139,8 +182,10 @@ make_gem_makefile()
puts(""); puts("");
puts("mrblib_gem.rbtmp :"); puts("mrblib_gem.rbtmp :");
for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib"); puts(for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib"));
puts(""); puts("");
}
}
puts(".PHONY : prepare-test"); puts(".PHONY : prepare-test");
puts("prepare-test : mrbgemtest.ctmp"); puts("prepare-test : mrbgemtest.ctmp");
...@@ -151,13 +196,20 @@ make_gem_makefile() ...@@ -151,13 +196,20 @@ make_gem_makefile()
puts(""); puts("");
puts("mrbgemtest.rbtmp :"); puts("mrbgemtest.rbtmp :");
for_each_gem(" ", "/test/*.rb ", "\tcat", " > mrbgemtest.rbtmp", "");
if (!gem_empty)
puts(for_each_gem(" ", "/test/*.rb ", "\tcat", " > mrbgemtest.rbtmp", ""));
else
puts("\t../generator rbtmp > mrbgemtest.rbtmp");
puts(""); puts("");
puts(".PHONY : clean"); puts(".PHONY : clean");
puts("clean :"); puts("clean :");
puts("\t$(RM) *.c *.d *.rbtmp *.ctmp *.o mrbtest"); puts("\t$(RM) *.c *.d *.rbtmp *.ctmp *.o mrbtest");
for_each_gem("\t@$(MAKE) clean -C ", " $(MAKE_FLAGS)\n", "", "", "");
if (!gem_empty)
puts(for_each_gem("\t@$(MAKE) clean -C ", " $(MAKE_FLAGS)\n", "", "", ""));
} }
/* /*
...@@ -167,6 +219,29 @@ make_gem_makefile() ...@@ -167,6 +219,29 @@ make_gem_makefile()
void void
make_init_gems() make_init_gems()
{ {
char *gem_check = "";
int gem_empty;
int gem_c_empty;
int gem_ruby_empty;
gem_check = for_each_gem("", "", "", "", "");
if (strcmp(gem_check, "") == 0)
gem_empty = TRUE;
else
gem_empty = FALSE;
gem_check = for_each_gem("", "", "", "", "src");
if (strcmp(gem_check, "") == 0)
gem_c_empty = TRUE;
else
gem_c_empty = FALSE;
gem_check = for_each_gem("", "", "", "", "mrblib");
if (strcmp(gem_check, "") == 0)
gem_ruby_empty = TRUE;
else
gem_ruby_empty = FALSE;
puts("/*"); puts("/*");
puts(" * This file contains a list of all"); puts(" * This file contains a list of all");
puts(" * initializing methods which are"); puts(" * initializing methods which are");
...@@ -185,25 +260,38 @@ make_init_gems() ...@@ -185,25 +260,38 @@ make_init_gems()
puts("#include \"mruby/proc.h\""); puts("#include \"mruby/proc.h\"");
puts(""); puts("");
for_each_gem("void mrb_", "_gem_init(mrb_state*);\n", "", "", "src"); if (!gem_c_empty)
puts(for_each_gem("void mrb_", "_gem_init(mrb_state*);\n", "", "", "src"));
if (!gem_ruby_empty)
puts("extern const char mrblib_gem_irep[];"); puts("extern const char mrblib_gem_irep[];");
puts(""); puts("");
puts("void"); puts("void");
puts("mrb_init_mrbgems(mrb_state *mrb) {"); puts("mrb_init_mrbgems(mrb_state *mrb) {");
for_each_gem(" mrb_", "_gem_init(mrb);\n", "", "", "src"); if (!gem_c_empty)
puts(for_each_gem(" mrb_", "_gem_init(mrb);\n", "", "", "src"));
if (!gem_ruby_empty) {
puts(" int n = mrb_read_irep(mrb, mrblib_gem_irep);"); puts(" int n = mrb_read_irep(mrb, mrblib_gem_irep);");
puts(" mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));"); puts(" mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));");
puts(" if (mrb->exc) {"); puts(" if (mrb->exc) {");
puts(" mrb_p(mrb, mrb_obj_value(mrb->exc));"); puts(" mrb_p(mrb, mrb_obj_value(mrb->exc));");
puts(" exit(0);"); puts(" exit(0);");
puts(" }"); puts(" }");
}
puts("}"); puts("}");
} }
void
make_rbtmp()
{
puts("");
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
...@@ -212,11 +300,13 @@ main (int argc, char *argv[]) ...@@ -212,11 +300,13 @@ main (int argc, char *argv[])
make_gem_makefile(); make_gem_makefile();
else if (strcmp(argv[1], "init_gems") == 0) else if (strcmp(argv[1], "init_gems") == 0)
make_init_gems(); make_init_gems();
else if (strcmp(argv[1], "rbtmp") == 0)
make_rbtmp();
else else
return 1; return 1;
} }
else { else {
puts("Argument missing! Options: 'makefile', 'init_gems'"); puts("Argument missing! Options: 'makefile', 'init_gems', 'rbtmp'");
return 1; return 1;
} }
......
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