From 0e7d5a2e4bcca01a41ea00324261818440808e6f Mon Sep 17 00:00:00 2001 From: Daniel Bovensiepen Date: Sat, 22 Sep 2012 01:16:26 +0800 Subject: Move Gem Tests into the main Test target --- Makefile | 1 - mrbgems/Makefile | 7 +- mrbgems/gem_helper.c | 232 --------------------------------------------------- mrbgems/generator.c | 216 +++++++++++++++++++++++++++++++++++++++++++++++ test/Makefile | 7 +- test/init_mrbtest.c | 3 + 6 files changed, 228 insertions(+), 238 deletions(-) delete mode 100644 mrbgems/gem_helper.c create mode 100644 mrbgems/generator.c diff --git a/Makefile b/Makefile index 6866ec9e3..d18222c3c 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,6 @@ all : .PHONY : test test : all @$(MAKE) -C test $(MAKE_FLAGS) - @$(MAKE) test -C mrbgems $(MAKE_FLAGS) # clean up .PHONY : clean diff --git a/mrbgems/Makefile b/mrbgems/Makefile index 1cb5b8a83..d12e85ab4 100644 --- a/mrbgems/Makefile +++ b/mrbgems/Makefile @@ -5,7 +5,7 @@ LIBR := ../lib/libmruby.a INIT := init_gems RM_F := rm -f CC_FLAGS := -Wall -Werror-implicit-function-declaration -g -O3 -MMD -I. -I./../include -MMAKER := ./gem_helper +MMAKER := ./generator MMAKER_BIN := $(MMAKER) export CC = gcc export LL = gcc @@ -43,8 +43,9 @@ $(MMAKER_BIN) : $(MMAKER).o $(MMAKER).o : $(MMAKER).c $(CC) $(CC_FLAGS) -MMD -c $< -o $@ -test : - @$(MAKE) test -C g +.PHONY : prepare-test +prepare-test : + @$(MAKE) prepare-test -C g # clean driver and all gems .PHONY : clean diff --git a/mrbgems/gem_helper.c b/mrbgems/gem_helper.c deleted file mode 100644 index 24b959df9..000000000 --- a/mrbgems/gem_helper.c +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -static int -one (const struct dirent *unused) -{ - return 1; -} - -/* - * Does a directory exist? - * yes => TRUE - * no => FALSE - * fs error => FALSE - * - */ -static int -directory_exists(char path[4096]) { - DIR* dir = opendir(path); - if (dir) - return TRUE; - else - return FALSE; -} - -/* - * Template generator for each GEM - * - * Arguments: - * before: - * String before each GEM template - * after: - * String after each GEM template - * start: - * String at the start of the template - * end: - * String at the end of the template - * skip_if_src_not_exist: - * TRUE => skip template for GEMs with SRC directory - * 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]) -{ - struct dirent **eps; - int n; - char gemname[1024] = ""; - char gemname_path[4096] = ""; - char complete_line[4096] = ""; - char src_path[4096] = ""; - struct stat attribut; - - strcat(complete_line, start); - - n = scandir("./g", &eps, one, alphasort); - if (n >= 0) { - int cnt; - for (cnt = 0; cnt < n; ++cnt) { - strcpy(gemname, eps[cnt]->d_name); - strcpy(gemname_path, "./g/"); - strcat(gemname_path, gemname); - strcpy(src_path, gemname_path); - strcat(src_path, "/src"); - - if (strcmp(gemname, ".") == 0) - continue; - if (strcmp(gemname, "..") == 0) - continue; - - stat(gemname_path, &attribut); - if (S_ISDIR(attribut.st_mode) == 0) { - continue; - } - - if (strcmp(dir_to_skip, "") != 0) { - strcpy(src_path, gemname_path); - strcat(src_path, "/"); - strcat(src_path, dir_to_skip); - - if (directory_exists(src_path) != TRUE) - continue; - } - - strcat(complete_line, before); - strcat(complete_line, gemname); - strcat(complete_line, after); - } - } - else { - perror("Error while scanning the directory."); - } - - strcat(complete_line, end); - puts(complete_line); -} - -void -make_gem_makefile() -{ - puts("CFLAGS := -I. -I../../include -I../../src"); - puts(""); - puts("ifeq ($(OS),Windows_NT)"); - puts("MAKE_FLAGS = --no-print-directory CC=$(CC) LL=$(LL) ALL_CFLAGS='$(ALL_CFLAGS)'"); - puts("else"); - puts("MAKE_FLAGS = --no-print-directory CC='$(CC)' LL='$(LL)' ALL_CFLAGS='$(ALL_CFLAGS)'"); - puts("endif"); - puts(""); - - puts(".PHONY : all"); - puts("all : all_gems mrblib_gem.o"); - puts("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o"); - puts(""); - - puts("all_gems :"); - for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", ""); - puts(""); - - puts("mrblib_gem.o : mrblib_gem.c"); - puts(""); - - puts("mrblib_gem.c : mrblib_gem.ctmp"); - puts("\tcat $< > $@"); - puts(""); - - puts("mrblib_gem.ctmp : mrblib_gem.rbtmp"); - puts("\t../../bin/mrbc -Bmrblib_gem_irep -o$@ $<"); - puts(""); - - puts("mrblib_gem.rbtmp :"); - for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib"); - puts(""); - - puts(".PHONY : test"); - puts("test : mrbtest"); - puts("\t@./mrbtest"); - puts(""); - - puts("mrbtest : driver.o mrbtest.o"); - puts("\t$(CC) $(CFLAGS) -o ./mrbtest ./mrbtest.o ../../lib/libmruby.a ./driver.o"); - puts(""); - - puts("driver.o : ../../test/driver.c"); - puts("\t$(CC) $(CFLAGS) -o $@ -c $<"); - puts(""); - - puts("mrbtest.o : mrbtest.c"); - puts(""); - - puts("mrbtest.c : mrbtest.ctmp"); - puts("\tcat ../../test/init_mrbtest.c mrbtest.ctmp > mrbtest.c"); - puts(""); - - puts("mrbtest.ctmp : mrbtest.rbtmp"); - puts("\t../../bin/mrbc -Bmrbtest_irep -omrbtest.ctmp mrbtest.rbtmp"); - puts(""); - - puts("mrbtest.rbtmp :"); - for_each_gem("", "/test/*.rb ", "\tcat ../../test/assert.rb ", "> mrbtest.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", "", "", ""); -} - -void -make_init_gems() -{ - puts("/*"); - puts(" * This file contains a list of all"); - puts(" * initializing methods which are"); - puts(" * necessary to bootstrap all gems."); - puts(" *"); - puts(" * IMPORTANT:"); - puts(" * This file was generated!"); - puts(" * All manual changes will get lost."); - puts(" */"); - - puts(""); - puts("#include \"mruby.h\""); - puts("#include \"mruby/irep.h\""); - puts("#include \"mruby/dump.h\""); - puts("#include \"mruby/string.h\""); - puts("#include \"mruby/proc.h\""); - puts(""); - - for_each_gem("void mrb_", "_gem_init(mrb_state*);\n", "", "", "src"); - - 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"); - - 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 -main (int argc, char *argv[]) -{ - if (argc == 2) { - if (strcmp(argv[1], "makefile") == 0) - make_gem_makefile(); - else if (strcmp(argv[1], "init_gems") == 0) - make_init_gems(); - else - return 1; - } - else { - puts("Argument missing! Options: 'makefile', 'init_gems'"); - return 1; - } - - return 0; -} diff --git a/mrbgems/generator.c b/mrbgems/generator.c new file mode 100644 index 000000000..8d8bee0cf --- /dev/null +++ b/mrbgems/generator.c @@ -0,0 +1,216 @@ +#include +#include +#include +#include +#include +#include +#include + +static int +one (const struct dirent *unused) +{ + return 1; +} + +/* + * Does a directory exist? + * yes => TRUE + * no => FALSE + * fs error => FALSE + * + */ +static int +directory_exists(char path[4096]) { + DIR* dir = opendir(path); + if (dir) + return TRUE; + else + return FALSE; +} + +/* + * Template generator for each GEM + * + * Arguments: + * before: + * String before each GEM template + * after: + * String after each GEM template + * start: + * String at the start of the template + * end: + * String at the end of the template + * skip_if_src_not_exist: + * TRUE => skip template for GEMs with SRC directory + * 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]) +{ + struct dirent **eps; + int n; + char gemname[1024] = ""; + char gemname_path[4096] = ""; + char complete_line[4096] = ""; + char src_path[4096] = ""; + struct stat attribut; + + strcat(complete_line, start); + + n = scandir("./g", &eps, one, alphasort); + if (n >= 0) { + int cnt; + for (cnt = 0; cnt < n; ++cnt) { + strcpy(gemname, eps[cnt]->d_name); + strcpy(gemname_path, "./g/"); + strcat(gemname_path, gemname); + strcpy(src_path, gemname_path); + strcat(src_path, "/src"); + + if (strcmp(gemname, ".") == 0) + continue; + if (strcmp(gemname, "..") == 0) + continue; + + stat(gemname_path, &attribut); + if (S_ISDIR(attribut.st_mode) == 0) { + continue; + } + + if (strcmp(dir_to_skip, "") != 0) { + strcpy(src_path, gemname_path); + strcat(src_path, "/"); + strcat(src_path, dir_to_skip); + + if (directory_exists(src_path) != TRUE) + continue; + } + + strcat(complete_line, before); + strcat(complete_line, gemname); + strcat(complete_line, after); + } + } + else { + perror("Error while scanning the directory."); + } + + strcat(complete_line, end); + puts(complete_line); +} + +void +make_gem_makefile() +{ + puts("CFLAGS := -I. -I../../include -I../../src"); + puts(""); + puts("ifeq ($(OS),Windows_NT)"); + puts("MAKE_FLAGS = --no-print-directory CC=$(CC) LL=$(LL) ALL_CFLAGS='$(ALL_CFLAGS)'"); + puts("else"); + puts("MAKE_FLAGS = --no-print-directory CC='$(CC)' LL='$(LL)' ALL_CFLAGS='$(ALL_CFLAGS)'"); + puts("endif"); + puts(""); + + puts(".PHONY : all"); + puts("all : all_gems mrblib_gem.o"); + puts("\t$(AR) rs ../../lib/libmruby.a mrblib_gem.o"); + puts(""); + + puts("all_gems :"); + for_each_gem("\t@$(MAKE) -C ", " $(MAKE_FLAGS)\n", "", "", ""); + puts(""); + + puts("mrblib_gem.o : mrblib_gem.c"); + puts(""); + + puts("mrblib_gem.c : mrblib_gem.ctmp"); + puts("\tcat $< > $@"); + puts(""); + + puts("mrblib_gem.ctmp : mrblib_gem.rbtmp"); + puts("\t../../bin/mrbc -Bmrblib_gem_irep -o$@ $<"); + puts(""); + + puts("mrblib_gem.rbtmp :"); + for_each_gem(" ", "/mrblib/*.rb", "\tcat", "> mrblib_gem.rbtmp", "mrblib"); + puts(""); + + puts(".PHONY : prepare-test"); + puts("prepare-test : mrbgemtest.ctmp"); + puts(""); + + puts("mrbgemtest.ctmp : mrbgemtest.rbtmp"); + puts("\t../../bin/mrbc -Bmrbgemtest_irep -omrbgemtest.ctmp mrbgemtest.rbtmp"); + puts(""); + + puts("mrbgemtest.rbtmp :"); + for_each_gem(" ", "/test/*.rb ", "\tcat", " > 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", "", "", ""); +} + +void +make_init_gems() +{ + puts("/*"); + puts(" * This file contains a list of all"); + puts(" * initializing methods which are"); + puts(" * necessary to bootstrap all gems."); + puts(" *"); + puts(" * IMPORTANT:"); + puts(" * This file was generated!"); + puts(" * All manual changes will get lost."); + puts(" */"); + + puts(""); + puts("#include \"mruby.h\""); + puts("#include \"mruby/irep.h\""); + puts("#include \"mruby/dump.h\""); + puts("#include \"mruby/string.h\""); + puts("#include \"mruby/proc.h\""); + puts(""); + + for_each_gem("void mrb_", "_gem_init(mrb_state*);\n", "", "", "src"); + + 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"); + + 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 +main (int argc, char *argv[]) +{ + if (argc == 2) { + if (strcmp(argv[1], "makefile") == 0) + make_gem_makefile(); + else if (strcmp(argv[1], "init_gems") == 0) + make_init_gems(); + else + return 1; + } + else { + puts("Argument missing! Options: 'makefile', 'init_gems'"); + return 1; + } + + return 0; +} diff --git a/test/Makefile b/test/Makefile index 18bc79b5a..efabdc367 100644 --- a/test/Makefile +++ b/test/Makefile @@ -68,13 +68,16 @@ $(OBJS) : %.o : %.c $(CC) $(ALL_CFLAGS) -MMD $(INCLUDES) -c $< -o $@ # Compile C source from merged mruby source -$(CLIB) : $(RLIB) $(MRBC) $(INIT) - $(MRBC) -Bmrbtest_irep -o$(DLIB) $(RLIB); $(CAT) $(INIT) $(DLIB) > $@ +$(CLIB) : ../mrbgems/g/mrbgemtest.ctmp $(RLIB) $(MRBC) $(INIT) + $(MRBC) -Bmrbtest_irep -o$(DLIB) $(RLIB); $(CAT) $(INIT) $(DLIB) ../mrbgems/g/mrbgemtest.ctmp > $@ # merge mruby sources $(RLIB) : $(ASSLIB) $(MRBS) $(CAT) $(ASSLIB) $(MRBS) > $@ +../mrbgems/g/mrbgemtest.ctmp : + @$(MAKE) prepare-test -C ../mrbgems + # clean up .PHONY : clean clean : diff --git a/test/init_mrbtest.c b/test/init_mrbtest.c index b9f09dd2f..2bc2f2e4b 100644 --- a/test/init_mrbtest.c +++ b/test/init_mrbtest.c @@ -5,13 +5,16 @@ #include "mruby/proc.h" extern const char mrbtest_irep[]; +extern const char mrbgemtest_irep[]; void mrb_init_mrbtest(mrb_state *mrb) { int n = mrb_read_irep(mrb, mrbtest_irep); + int m = mrb_read_irep(mrb, mrbgemtest_irep); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[m]), mrb_top_self(mrb)); if (mrb->exc) { mrb_p(mrb, mrb_obj_value(mrb->exc)); exit(0); -- cgit v1.2.3