diff options
| author | Daniel Bovensiepen <[email protected]> | 2012-09-22 15:42:29 +0800 |
|---|---|---|
| committer | Daniel Bovensiepen <[email protected]> | 2012-09-22 15:42:29 +0800 |
| commit | 62b652c2925b2f71972b201a8134cf22183102b0 (patch) | |
| tree | 0771594b04a73e2b63bc232fe159da543d10ea6f | |
| parent | 7b8b3c0213eb71df0a10493111ccb383b31b9731 (diff) | |
| download | mruby-62b652c2925b2f71972b201a8134cf22183102b0.tar.gz mruby-62b652c2925b2f71972b201a8134cf22183102b0.zip | |
Catch some corner cases
| -rw-r--r-- | doc/mrbgems/README.md | 54 | ||||
| -rw-r--r-- | doc/mrbgems/c_extension_example/Makefile (renamed from mrbgems/g/c_extension_example/Makefile) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/c_extension_example/README.md (renamed from mrbgems/g/c_extension_example/README.md) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/c_extension_example/src/example.c (renamed from mrbgems/g/c_extension_example/src/example.c) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/c_extension_example/test/example.rb (renamed from mrbgems/g/c_extension_example/test/example.rb) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/ruby_extension_example/Makefile (renamed from mrbgems/g/ruby_extension_example/Makefile) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/ruby_extension_example/README.md (renamed from mrbgems/g/ruby_extension_example/README.md) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/ruby_extension_example/mrblib/example.rb (renamed from mrbgems/g/ruby_extension_example/mrblib/example.rb) | 0 | ||||
| -rw-r--r-- | doc/mrbgems/ruby_extension_example/test/example.rb (renamed from mrbgems/g/ruby_extension_example/test/example.rb) | 0 | ||||
| -rw-r--r-- | mrbgems/Makefile | 3 | ||||
| -rw-r--r-- | mrbgems/generator.c | 158 |
11 files changed, 180 insertions, 35 deletions
diff --git a/doc/mrbgems/README.md b/doc/mrbgems/README.md new file mode 100644 index 000000000..e23ffdcf2 --- /dev/null +++ b/doc/mrbgems/README.md @@ -0,0 +1,54 @@ +# 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 diff --git a/mrbgems/g/c_extension_example/Makefile b/doc/mrbgems/c_extension_example/Makefile index b245e9696..b245e9696 100644 --- a/mrbgems/g/c_extension_example/Makefile +++ b/doc/mrbgems/c_extension_example/Makefile diff --git a/mrbgems/g/c_extension_example/README.md b/doc/mrbgems/c_extension_example/README.md index 3803c2065..3803c2065 100644 --- a/mrbgems/g/c_extension_example/README.md +++ b/doc/mrbgems/c_extension_example/README.md diff --git a/mrbgems/g/c_extension_example/src/example.c b/doc/mrbgems/c_extension_example/src/example.c index 9f0b07839..9f0b07839 100644 --- a/mrbgems/g/c_extension_example/src/example.c +++ b/doc/mrbgems/c_extension_example/src/example.c diff --git a/mrbgems/g/c_extension_example/test/example.rb b/doc/mrbgems/c_extension_example/test/example.rb index 367d18029..367d18029 100644 --- a/mrbgems/g/c_extension_example/test/example.rb +++ b/doc/mrbgems/c_extension_example/test/example.rb diff --git a/mrbgems/g/ruby_extension_example/Makefile b/doc/mrbgems/ruby_extension_example/Makefile index 7ebec4f09..7ebec4f09 100644 --- a/mrbgems/g/ruby_extension_example/Makefile +++ b/doc/mrbgems/ruby_extension_example/Makefile diff --git a/mrbgems/g/ruby_extension_example/README.md b/doc/mrbgems/ruby_extension_example/README.md index 906a0d8f2..906a0d8f2 100644 --- a/mrbgems/g/ruby_extension_example/README.md +++ b/doc/mrbgems/ruby_extension_example/README.md diff --git a/mrbgems/g/ruby_extension_example/mrblib/example.rb b/doc/mrbgems/ruby_extension_example/mrblib/example.rb index b07a2b580..b07a2b580 100644 --- a/mrbgems/g/ruby_extension_example/mrblib/example.rb +++ b/doc/mrbgems/ruby_extension_example/mrblib/example.rb diff --git a/mrbgems/g/ruby_extension_example/test/example.rb b/doc/mrbgems/ruby_extension_example/test/example.rb index 0c1b63469..0c1b63469 100644 --- a/mrbgems/g/ruby_extension_example/test/example.rb +++ b/doc/mrbgems/ruby_extension_example/test/example.rb diff --git a/mrbgems/Makefile b/mrbgems/Makefile index ab8b364ac..29d71d586 100644 --- a/mrbgems/Makefile +++ b/mrbgems/Makefile @@ -59,7 +59,8 @@ $(GEMDLIB) : # clean driver and all gems .PHONY : clean -clean : $(GEM_MAKEFILE) +clean : $(GENERATOR_BIN) @echo "Cleanup Gems" + $(GENERATOR_BIN) makefile > $(GEM_MAKEFILE) $(MAKE) clean -C g -$(RM_F) $(INIT).c *.o *.d $(GENERATOR_BIN) $(GEM_MAKEFILE) diff --git a/mrbgems/generator.c b/mrbgems/generator.c index 7015f5a4d..f33a43944 100644 --- a/mrbgems/generator.c +++ b/mrbgems/generator.c @@ -45,10 +45,10 @@ directory_exists(char path[4096]) { * FALSE => template for all GEMs * */ -void -for_each_gem (char before[1024], char after[1024], - char start[1024], char end[1024], - char dir_to_skip[1024]) +static char +*for_each_gem (char before[1024], char after[1024], + char start[1024], char end[1024], + char dir_to_skip[1024]) { struct dirent **eps; int n; @@ -99,7 +99,7 @@ for_each_gem (char before[1024], char after[1024], } strcat(complete_line, end); - puts(complete_line); + return complete_line; } /* @@ -109,6 +109,11 @@ for_each_gem (char before[1024], char after[1024], void 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(""); puts("ifeq ($(OS),Windows_NT)"); @@ -118,29 +123,69 @@ make_gem_makefile() puts("endif"); 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("all : all_gems mrblib_gem.o"); - puts("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o"); - puts(""); + 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("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o"); + } - puts("all_gems :"); - for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", ""); - puts(""); + puts(""); - puts("mrblib_gem.o : mrblib_gem.c"); - puts(""); + // Rule for building all C extensions of each Gem + if (!gem_c_empty) { + puts("all_gems :"); + puts(for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", "")); + puts(""); + } - puts("mrblib_gem.c : mrblib_gem.ctmp"); - puts("\tcat $< > $@"); - puts(""); + // Rule for building all Ruby Extension of each Gem + if (!gem_ruby_empty) { + puts("mrblib_gem.o : mrblib_gem.c"); + puts(""); - puts("mrblib_gem.ctmp : mrblib_gem.rbtmp"); - puts("\t../../bin/mrbc -Bmrblib_gem_irep -o$@ $<"); - puts(""); + puts("mrblib_gem.c : mrblib_gem.ctmp"); + puts("\tcat $< > $@"); + puts(""); - puts("mrblib_gem.rbtmp :"); - for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib"); - puts(""); + puts("mrblib_gem.ctmp : mrblib_gem.rbtmp"); + puts("\t../../bin/mrbc -Bmrblib_gem_irep -o$@ $<"); + puts(""); + + puts("mrblib_gem.rbtmp :"); + puts(for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib")); + puts(""); + } + } puts(".PHONY : prepare-test"); puts("prepare-test : mrbgemtest.ctmp"); @@ -151,13 +196,20 @@ make_gem_makefile() puts(""); 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(".PHONY : clean"); puts("clean :"); 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() void 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(" * This file contains a list of all"); puts(" * initializing methods which are"); @@ -185,25 +260,38 @@ make_init_gems() puts("#include \"mruby/proc.h\""); 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("void"); 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(" mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));"); + puts(" if (mrb->exc) {"); + puts(" mrb_p(mrb, mrb_obj_value(mrb->exc));"); + puts(" exit(0);"); + puts(" }"); + } - 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(" if (mrb->exc) {"); - puts(" mrb_p(mrb, mrb_obj_value(mrb->exc));"); - puts(" exit(0);"); - puts(" }"); puts("}"); } +void +make_rbtmp() +{ + puts(""); +} + int main (int argc, char *argv[]) { @@ -212,11 +300,13 @@ main (int argc, char *argv[]) make_gem_makefile(); else if (strcmp(argv[1], "init_gems") == 0) make_init_gems(); + else if (strcmp(argv[1], "rbtmp") == 0) + make_rbtmp(); else return 1; } else { - puts("Argument missing! Options: 'makefile', 'init_gems'"); + puts("Argument missing! Options: 'makefile', 'init_gems', 'rbtmp'"); return 1; } |
