summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Bovensiepen <[email protected]>2012-09-22 15:42:29 +0800
committerDaniel Bovensiepen <[email protected]>2012-09-22 15:42:29 +0800
commit62b652c2925b2f71972b201a8134cf22183102b0 (patch)
tree0771594b04a73e2b63bc232fe159da543d10ea6f
parent7b8b3c0213eb71df0a10493111ccb383b31b9731 (diff)
downloadmruby-62b652c2925b2f71972b201a8134cf22183102b0.tar.gz
mruby-62b652c2925b2f71972b201a8134cf22183102b0.zip
Catch some corner cases
-rw-r--r--doc/mrbgems/README.md54
-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/Makefile3
-rw-r--r--mrbgems/generator.c158
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;
}