Commit a9df6f85 authored by Daniel Bovensiepen's avatar Daniel Bovensiepen

Improve Generator by handling Ruby and C Extensions in the same way

parent f30eedd7
...@@ -115,8 +115,6 @@ make_gem_makefile() ...@@ -115,8 +115,6 @@ make_gem_makefile()
{ {
char *gem_check = { 0 }; char *gem_check = { 0 };
int gem_empty; int gem_empty;
int gem_c_empty;
int gem_ruby_empty;
printf("CFLAGS := -I. -I../../include -I../../src\n\n" printf("CFLAGS := -I. -I../../include -I../../src\n\n"
"ifeq ($(OS),Windows_NT)\n" "ifeq ($(OS),Windows_NT)\n"
...@@ -132,36 +130,11 @@ make_gem_makefile() ...@@ -132,36 +130,11 @@ make_gem_makefile()
else else
gem_empty = FALSE; 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"); printf(".PHONY : all\n");
if (gem_empty) { if (gem_empty)
printf("all :\n\n"); printf("all :\n\n");
}
else { else {
if (gem_c_empty) { printf("all : all_gems\n");
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("\n"); printf("\n");
...@@ -169,21 +142,6 @@ make_gem_makefile() ...@@ -169,21 +142,6 @@ make_gem_makefile()
printf("all_gems :\n%s\n", printf("all_gems :\n%s\n",
for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\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" printf("\n.PHONY : prepare-test\n"
...@@ -207,30 +165,28 @@ make_gem_makefile() ...@@ -207,30 +165,28 @@ make_gem_makefile()
} }
/* /*
* init_gems.c Generator * Gem Makefile List Generator
* *
*/ */
void void
make_init_gems() make_gem_makefile_list()
{ {
char *gem_check = { 0 }; printf("%s",
int gem_c_empty; for_each_gem(" ", "", "GEM_LIST := ", "\n", "")
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;
/* is there a Ruby extension available */ printf("GEM_ARCHIVE_FILES := $(addprefix $(MRUBY_ROOT)/mrbgems/g/, $(GEM_LIST))\n"
gem_check = for_each_gem("", "", "", "", "mrblib"); "GEM_ARCHIVE_FILES := $(addsuffix /gem.a, $(GEM_ARCHIVE_FILES))\n"
if (strcmp(gem_check, "") == 0) "GEM_ARCHIVE_FILES += $(MRUBY_ROOT)/mrbgems/gem_init.a\n\n");
gem_ruby_empty = TRUE; }
else
gem_ruby_empty = FALSE;
/*
* init_gems.c Generator
*
*/
void
make_init_gems()
{
printf("/*\n" printf("/*\n"
" * This file contains a list of all\n" " * This file contains a list of all\n"
" * initializing methods which are\n" " * initializing methods which are\n"
...@@ -240,44 +196,101 @@ make_init_gems() ...@@ -240,44 +196,101 @@ make_init_gems()
" * This file was generated!\n" " * This file was generated!\n"
" * All manual changes will get lost.\n" " * All manual changes will get lost.\n"
" */\n\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.h\"\n"
"#include \"mruby/irep.h\"\n" "#include \"mruby/irep.h\"\n"
"#include \"mruby/dump.h\"\n" "#include \"mruby/dump.h\"\n"
"#include \"mruby/string.h\"\n" "#include \"mruby/string.h\"\n"
"#include \"mruby/proc.h\"\n"); "#include \"mruby/proc.h\"\n\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");
printf("\nvoid\n" void
"mrb_init_mrbgems(mrb_state *mrb) {\n"); 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) void
printf("%s", make_gem_srclib(char argv[1024])
for_each_gem(" mrb_", "_gem_init(mrb);\n", "", "", "src") {
); 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("\n"
printf(" int n = mrb_read_irep(mrb, mrblib_gem_irep);\n" "void mrb_%s_gem_init(mrb_state*);\n", argv);
" 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("}"); printf("\n"
"void\n"
"GENERATED_TMP_mrb_%s_gem_init(mrb_state *mrb) {\n"
" mrb_%s_gem_init(mrb);\n"
"}", argv, argv);
} }
void 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 int
...@@ -286,15 +299,33 @@ main (int argc, char *argv[]) ...@@ -286,15 +299,33 @@ main (int argc, char *argv[])
if (argc == 2) { if (argc == 2) {
if (strcmp(argv[1], "makefile") == 0) if (strcmp(argv[1], "makefile") == 0)
make_gem_makefile(); make_gem_makefile();
else if (strcmp(argv[1], "makefile_list") == 0)
make_gem_makefile_list();
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) else if (strcmp(argv[1], "rbtmp") == 0)
make_rbtmp(); 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; 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 { else {
printf("Argument missing! Options: 'makefile', 'init_gems', 'rbtmp'"); printf("Argument missing! Options: 'makefile', 'init_gems', 'rbtmp', 'gem_mrblib, gem_srclib'\n");
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