Commit e162f6d2 authored by Daniel Bovensiepen's avatar Daniel Bovensiepen

Modify GEM build process to support external GEMs outside of the mruby tree

parent a76647ea
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
# by each Gem. It integrates important constants # by each Gem. It integrates important constants
# for usage inside of a Gem. # for usage inside of a Gem.
# mruby src root ifeq ($(strip $(MRUBY_ROOT)),)
MRUBY_ROOT := ../../../ # mruby src root
MRUBY_ROOT := ../../../
endif
# Tools # Tools
CC := gcc CC := gcc
...@@ -40,14 +42,14 @@ gem_mixlib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mixlib_init.ctmp ...@@ -40,14 +42,14 @@ gem_mixlib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mixlib_init.ctmp
cat $^ > $@ cat $^ > $@
gem_mixlib_init.ctmp : gem_mixlib_init.ctmp :
../../generator gem_mixlib $(GEM) > $@ $(MRUBY_ROOT)mrbgems/generator gem_mixlib $(GEM) > $@
# Building target for C files # Building target for C files
gem-c-files : gem_srclib.o gem-c-files : gem_srclib.o
$(AR) rs gem.a $(GEM_OBJECTS) $< $(AR) rs gem.a $(GEM_OBJECTS) $<
gem_srclib.c : gem_srclib.c :
../../generator gem_srclib $(GEM) > $@ $(MRUBY_ROOT)mrbgems/generator gem_srclib $(GEM) > $@
# Building target for Ruby Files # Building target for Ruby Files
gem-rb-files : gem_mrblib.o gem-rb-files : gem_mrblib.o
...@@ -57,13 +59,13 @@ gem_mrblib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mrblib_init.ctmp ...@@ -57,13 +59,13 @@ gem_mrblib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mrblib_init.ctmp
cat $^ > $@ cat $^ > $@
gem_mrblib_header.ctmp : gem_mrblib_header.ctmp :
../../generator gem_mrblib > $@ $(MRUBY_ROOT)mrbgems/generator gem_mrblib > $@
gem_mrblib_init.ctmp : gem_mrblib_init.ctmp :
../../generator gem_mrblib $(GEM) > $@ $(MRUBY_ROOT)mrbgems/generator gem_mrblib $(GEM) > $@
gem_mrblib_irep.ctmp : gem_mrblib.rbtmp gem_mrblib_irep.ctmp : gem_mrblib.rbtmp
../../../bin/mrbc -Bgem_mrblib_irep_$(GEM) -o$@ $< $(MRUBY_ROOT)bin/mrbc -Bgem_mrblib_irep_$(GEM) -o$@ $<
gem_mrblib.rbtmp : gem_mrblib.rbtmp :
cat $(GEM_RB_FILES) > $@ cat $(GEM_RB_FILES) > $@
......
...@@ -7,26 +7,10 @@ ...@@ -7,26 +7,10 @@
#include <mrbconf.h> #include <mrbconf.h>
#include <stdlib.h> #include <stdlib.h>
static int char *get_file_name(char *path)
one (const struct dirent *unused)
{ {
return 1; char *base = strrchr(path, '/');
} return base ? base+1 : path;
/*
* 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;
} }
/* /*
...@@ -48,7 +32,7 @@ directory_exists(char path[4096]) { ...@@ -48,7 +32,7 @@ directory_exists(char path[4096]) {
static char* static char*
for_each_gem (char before[1024], char after[1024], for_each_gem (char before[1024], char after[1024],
char start[1024], char end[1024], char start[1024], char end[1024],
char dir_to_skip[1024]) int full_path)
{ {
/* active GEM check */ /* active GEM check */
FILE *active_gem_file; FILE *active_gem_file;
...@@ -58,16 +42,6 @@ for_each_gem (char before[1024], char after[1024], ...@@ -58,16 +42,6 @@ for_each_gem (char before[1024], char after[1024],
char gem_list[1024][1024] = { { 0 }, { 0 } }; char gem_list[1024][1024] = { { 0 }, { 0 } };
int gem_index; int gem_index;
int i; int i;
int gem_active;
int cnt;
/* folder check */
struct dirent **eps;
int n;
char gemname[1024] = { 0 };
char gemname_path[4096] = { 0 };
char src_path[4096] = { 0 };
struct stat attribut;
/* return value */ /* return value */
char* complete_line = malloc(4096 + sizeof(char)); char* complete_line = malloc(4096 + sizeof(char));
...@@ -91,72 +65,18 @@ for_each_gem (char before[1024], char after[1024], ...@@ -91,72 +65,18 @@ for_each_gem (char before[1024], char after[1024],
else else
gem_name[char_index++] = gem_char; gem_name[char_index++] = gem_char;
} }
if (gem_index > 0) {
/* clean close of the last GEM name */
gem_name[char_index++] = '\0';
strcpy(gem_list[gem_index++], gem_name);
}
fclose(active_gem_file); fclose(active_gem_file);
} }
else { /* Error: Active GEM list couldn't be loaded */ } else { /* Error: Active GEM list couldn't be loaded */ }
n = scandir("./g", &eps, one, alphasort); for(i = 0; i < gem_index; i++) {
if (n >= 0) { strcat(complete_line, before);
/* iterate over each file and figure out what is a GEM and what not */ if (full_path == TRUE)
for (cnt = 0; cnt < n; ++cnt) { strcat(complete_line, gem_list[i]);
strcpy(gemname, eps[cnt]->d_name); else
strcpy(gemname_path, "./g/"); strcat(complete_line, get_file_name(gem_list[i]));
strcat(gemname_path, gemname); strcat(complete_line, after);
/* we ignore all the default files */
if (strcmp(gemname, ".") == 0)
continue;
if (strcmp(gemname, "..") == 0)
continue;
if (strcmp(gemname, ".gitignore") == 0)
continue;
/* In case the current location isn't a folder we skip it */
stat(gemname_path, &attribut);
if (S_ISDIR(attribut.st_mode) == 0) {
continue;
}
/* Check if user has activated this GEM */
gem_active = 0;
for(i = 0; i <= gem_index; i++) {
if (strcmp(gem_list[i], gemname) != 0)
gem_active = FALSE;
else {
/* Current GEM is active */
gem_active = TRUE;
break;
}
}
/* In case the current GEM isn't active we skip it */
if (gem_active == FALSE)
continue;
/* sometimes we are only interested in GEMs
with a specific folder.
*/
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); strcat(complete_line, end);
...@@ -184,7 +104,7 @@ make_gem_makefile() ...@@ -184,7 +104,7 @@ make_gem_makefile()
"endif\n\n"); "endif\n\n");
/* is there any GEM available? */ /* is there any GEM available? */
gem_check = for_each_gem("", "", "", "", ""); gem_check = for_each_gem("", "", "", "", TRUE);
if (strcmp(gem_check, "") == 0) if (strcmp(gem_check, "") == 0)
gem_empty = TRUE; gem_empty = TRUE;
else else
...@@ -200,7 +120,7 @@ make_gem_makefile() ...@@ -200,7 +120,7 @@ make_gem_makefile()
/* Call make for every GEM */ /* Call make for every GEM */
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", "", "", TRUE)
); );
printf("\n"); printf("\n");
} }
...@@ -212,7 +132,7 @@ make_gem_makefile() ...@@ -212,7 +132,7 @@ make_gem_makefile()
); );
if (!gem_empty) if (!gem_empty)
printf("%s", printf("%s",
for_each_gem(" ", "/test/*.rb ", "\tcat", " > mrbgemtest.rbtmp", "test") for_each_gem(" ", "/test/*.rb ", "\tcat", " > mrbgemtest.rbtmp", TRUE)
); );
else else
printf("\t../generator rbtmp > mrbgemtest.rbtmp"); printf("\t../generator rbtmp > mrbgemtest.rbtmp");
...@@ -226,7 +146,7 @@ make_gem_makefile() ...@@ -226,7 +146,7 @@ make_gem_makefile()
"\t$(RM) *.c *.d *.rbtmp *.ctmp *.o mrbtest\n"); "\t$(RM) *.c *.d *.rbtmp *.ctmp *.o mrbtest\n");
if (!gem_empty) if (!gem_empty)
printf("%s", printf("%s",
for_each_gem("\t@$(MAKE) clean -C ", " $(MAKE_FLAGS)\n", "", "", "") for_each_gem("\t@$(MAKE) clean -C ", " $(MAKE_FLAGS)\n", "", "", TRUE)
); );
} }
...@@ -241,11 +161,10 @@ void ...@@ -241,11 +161,10 @@ void
make_gem_makefile_list() make_gem_makefile_list()
{ {
printf("%s", printf("%s",
for_each_gem(" ", "", "GEM_LIST := ", "\n", "") for_each_gem(" ", "", "GEM_LIST := ", "\n", TRUE)
); );
printf("GEM_ARCHIVE_FILES := $(addprefix $(MRUBY_ROOT)/mrbgems/g/, $(GEM_LIST))\n" printf("GEM_ARCHIVE_FILES := $(addsuffix /gem.a, $(GEM_LIST))\n"
"GEM_ARCHIVE_FILES := $(addsuffix /gem.a, $(GEM_ARCHIVE_FILES))\n"
"GEM_ARCHIVE_FILES += $(MRUBY_ROOT)/mrbgems/gem_init.a\n\n"); "GEM_ARCHIVE_FILES += $(MRUBY_ROOT)/mrbgems/gem_init.a\n\n");
} }
...@@ -269,7 +188,7 @@ make_gem_init() ...@@ -269,7 +188,7 @@ make_gem_init()
/* Protoype definition of all initialization methods */ /* Protoype definition of all initialization methods */
printf("\n%s", printf("\n%s",
for_each_gem("void GENERATED_TMP_mrb_", "_gem_init(mrb_state*);\n", "", "", "") for_each_gem("void GENERATED_TMP_mrb_", "_gem_init(mrb_state*);\n", "", "", FALSE)
); );
printf("\n"); printf("\n");
...@@ -277,7 +196,7 @@ make_gem_init() ...@@ -277,7 +196,7 @@ make_gem_init()
printf("void\n" printf("void\n"
"mrb_init_mrbgems(mrb_state *mrb) {\n"); "mrb_init_mrbgems(mrb_state *mrb) {\n");
printf( "%s", printf( "%s",
for_each_gem(" GENERATED_TMP_mrb_", "_gem_init(mrb);\n", "", "", "") for_each_gem(" GENERATED_TMP_mrb_", "_gem_init(mrb);\n", "", "", FALSE)
); );
printf("}"); printf("}");
} }
......
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