diff options
| -rw-r--r-- | mrbgems/generator.c | 211 |
1 files changed, 121 insertions, 90 deletions
diff --git a/mrbgems/generator.c b/mrbgems/generator.c index 54cecd128..1d5cdd367 100644 --- a/mrbgems/generator.c +++ b/mrbgems/generator.c @@ -115,8 +115,6 @@ make_gem_makefile() { char *gem_check = { 0 }; int gem_empty; - int gem_c_empty; - int gem_ruby_empty; printf("CFLAGS := -I. -I../../include -I../../src\n\n" "ifeq ($(OS),Windows_NT)\n" @@ -132,36 +130,11 @@ make_gem_makefile() else gem_empty = FALSE; - /* is there a C extension available? */ - gem_check = for_each_gem("", "", "", "", "src"); - if (strcmp(gem_check, "") == 0) - gem_c_empty = TRUE; - else - gem_c_empty = FALSE; - - /* is there a Ruby extension available */ - gem_check = for_each_gem("", "", "", "", "mrblib"); - if (strcmp(gem_check, "") == 0) - gem_ruby_empty = TRUE; - else - gem_ruby_empty = FALSE; - printf(".PHONY : all\n"); - if (gem_empty) { + if (gem_empty) printf("all :\n\n"); - } else { - if (gem_c_empty) { - printf("all : mrblib_gem.o\n" - "\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o\n"); - } - else if (gem_ruby_empty) { - printf("all : all_gems\n"); - } - else { - printf("all : all_gems mrblib_gem.o\n" - "\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o\n"); - } + printf("all : all_gems\n"); printf("\n"); @@ -169,21 +142,6 @@ make_gem_makefile() printf("all_gems :\n%s\n", for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", "") ); - - /* Rule for building all Ruby Extension of each Gem */ - if (!gem_ruby_empty) { - printf("mrblib_gem.o : mrblib_gem.c\n\n" - - "mrblib_gem.c : mrblib_gem.ctmp\n" - "\tcat $< > $@\n\n" - - "mrblib_gem.ctmp : mrblib_gem.rbtmp\n" - "\t../../bin/mrbc -Bmrblib_gem_irep -o$@ $<\n\n" - - "mrblib_gem.rbtmp :\n%s\n", - for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib") - ); - } } printf("\n.PHONY : prepare-test\n" @@ -207,30 +165,28 @@ make_gem_makefile() } /* - * init_gems.c Generator + * Gem Makefile List Generator * */ void -make_init_gems() +make_gem_makefile_list() { - char *gem_check = { 0 }; - int gem_c_empty; - int gem_ruby_empty; - - /* is there a C extension available? */ - gem_check = for_each_gem("", "", "", "", "src"); - if (strcmp(gem_check, "") == 0) - gem_c_empty = TRUE; - else - gem_c_empty = FALSE; + printf("%s", + for_each_gem(" ", "", "GEM_LIST := ", "\n", "") + ); - /* is there a Ruby extension available */ - gem_check = for_each_gem("", "", "", "", "mrblib"); - if (strcmp(gem_check, "") == 0) - gem_ruby_empty = TRUE; - else - gem_ruby_empty = FALSE; + printf("GEM_ARCHIVE_FILES := $(addprefix $(MRUBY_ROOT)/mrbgems/g/, $(GEM_LIST))\n" + "GEM_ARCHIVE_FILES := $(addsuffix /gem.a, $(GEM_ARCHIVE_FILES))\n" + "GEM_ARCHIVE_FILES += $(MRUBY_ROOT)/mrbgems/gem_init.a\n\n"); +} +/* + * init_gems.c Generator + * + */ +void +make_init_gems() +{ printf("/*\n" " * This file contains a list of all\n" " * initializing methods which are\n" @@ -240,44 +196,101 @@ make_init_gems() " * This file was generated!\n" " * All manual changes will get lost.\n" " */\n\n" + "#include \"mruby.h\"\n"); + + /* Protoype definition of all initialization methods */ + printf("\n%s", + for_each_gem("void GENERATED_TMP_mrb_", "_gem_init(mrb_state*);\n", "", "", "") + ); + + /* mrb_init_mrbgems(mrb) method for initialization of all GEMs */ + printf("\nvoid\n" + "mrb_init_mrbgems(mrb_state *mrb) {\n"); + printf( "%s", + for_each_gem(" GENERATED_TMP_mrb_", "_gem_init(mrb);\n", "", "", "") + ); + printf("}"); +} + +void +make_rbtmp() +{ + printf("\n"); +} + +void +make_gem_mrblib_header() +{ + printf("/*\n" + " * This file is loading the irep\n" + " * Ruby GEM code.\n" + " *\n" + " * IMPORTANT:\n" + " * This file was generated!\n" + " * All manual changes will get lost.\n" + " */\n\n" "#include \"mruby.h\"\n" "#include \"mruby/irep.h\"\n" "#include \"mruby/dump.h\"\n" "#include \"mruby/string.h\"\n" - "#include \"mruby/proc.h\"\n"); - - if (!gem_c_empty) - printf("\n%s", - for_each_gem("void mrb_", "_gem_init(mrb_state*);\n", "", "", "src") - ); - - if (!gem_ruby_empty) - printf("\nextern const char mrblib_gem_irep[];\n"); + "#include \"mruby/proc.h\"\n\n"); +} - printf("\nvoid\n" - "mrb_init_mrbgems(mrb_state *mrb) {\n"); +void +make_gem_mrblib(char argv[1024]) +{ + printf("\n" + "void\n" + "GENERATED_TMP_mrb_%s_gem_init(mrb_state *mrb) {\n" + " int n = mrb_read_irep(mrb, gem_mrblib_irep_%s);\n" + " mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));\n" + " if (mrb->exc) {\n" + " mrb_p(mrb, mrb_obj_value(mrb->exc));\n" + " exit(0);\n" + " }\n" + "}", argv, argv); +} - if (!gem_c_empty) - printf("%s", - for_each_gem(" mrb_", "_gem_init(mrb);\n", "", "", "src") - ); +void +make_gem_srclib(char argv[1024]) +{ + printf("/*\n" + " * This file is loading the irep\n" + " * Ruby GEM code.\n" + " *\n" + " * IMPORTANT:\n" + " * This file was generated!\n" + " * All manual changes will get lost.\n" + " */\n\n" + "#include \"mruby.h\"\n"); - if (!gem_ruby_empty) { - printf(" int n = mrb_read_irep(mrb, mrblib_gem_irep);\n" - " mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));\n" - " if (mrb->exc) {\n" - " mrb_p(mrb, mrb_obj_value(mrb->exc));\n" - " exit(0);\n" - " }\n"); - } + printf("\n" + "void mrb_%s_gem_init(mrb_state*);\n", argv); - printf("}"); + printf("\n" + "void\n" + "GENERATED_TMP_mrb_%s_gem_init(mrb_state *mrb) {\n" + " mrb_%s_gem_init(mrb);\n" + "}", argv, argv); } void -make_rbtmp() +make_gem_mixlib(char argv[1024]) { - printf("\n"); + printf("\n" + "void mrb_%s_gem_init(mrb_state*);\n", argv); + + printf("\n" + "void\n" + "GENERATED_TMP_mrb_%s_gem_init(mrb_state *mrb) {\n" + " mrb_%s_gem_init(mrb);\n" + " int n = mrb_read_irep(mrb, gem_mrblib_irep_%s);\n" + " mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));\n" + " if (mrb->exc) {\n" + " mrb_p(mrb, mrb_obj_value(mrb->exc));\n" + " exit(0);\n" + " }\n" + "}", argv, argv, argv); } int @@ -286,15 +299,33 @@ main (int argc, char *argv[]) if (argc == 2) { if (strcmp(argv[1], "makefile") == 0) make_gem_makefile(); + else if (strcmp(argv[1], "makefile_list") == 0) + make_gem_makefile_list(); else if (strcmp(argv[1], "init_gems") == 0) make_init_gems(); else if (strcmp(argv[1], "rbtmp") == 0) make_rbtmp(); - else + else if (strcmp(argv[1], "gem_mrblib") == 0) + make_gem_mrblib_header(); + else { + printf("Wrong argument! Options: 'makefile', 'init_gems', 'rbtmp', 'gem_mrblib', gem_srclib\n"); return 1; + } + } + else if (argc == 3) { + if (strcmp(argv[1], "gem_mrblib") == 0) + make_gem_mrblib(argv[2]); + else if (strcmp(argv[1], "gem_srclib") == 0) + make_gem_srclib(argv[2]); + else if (strcmp(argv[1], "gem_mixlib") == 0) + make_gem_mixlib(argv[2]); + else { + printf("Wrong argument! Options: 'makefile', 'init_gems', 'rbtmp', 'gem_mrblib', gem_srclib\n"); + return 1; + } } else { - printf("Argument missing! Options: 'makefile', 'init_gems', 'rbtmp'"); + printf("Argument missing! Options: 'makefile', 'init_gems', 'rbtmp', 'gem_mrblib, gem_srclib'\n"); return 1; } |
