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 @@
# by each Gem. It integrates important constants
# for usage inside of a Gem.
# mruby src root
MRUBY_ROOT := ../../../
ifeq ($(strip $(MRUBY_ROOT)),)
# mruby src root
MRUBY_ROOT := ../../../
endif
# Tools
CC := gcc
......@@ -40,14 +42,14 @@ gem_mixlib.c : gem_mrblib_header.ctmp gem_mrblib_irep.ctmp gem_mixlib_init.ctmp
cat $^ > $@
gem_mixlib_init.ctmp :
../../generator gem_mixlib $(GEM) > $@
$(MRUBY_ROOT)mrbgems/generator gem_mixlib $(GEM) > $@
# Building target for C files
gem-c-files : gem_srclib.o
$(AR) rs gem.a $(GEM_OBJECTS) $<
gem_srclib.c :
../../generator gem_srclib $(GEM) > $@
$(MRUBY_ROOT)mrbgems/generator gem_srclib $(GEM) > $@
# Building target for Ruby Files
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
cat $^ > $@
gem_mrblib_header.ctmp :
../../generator gem_mrblib > $@
$(MRUBY_ROOT)mrbgems/generator gem_mrblib > $@
gem_mrblib_init.ctmp :
../../generator gem_mrblib $(GEM) > $@
$(MRUBY_ROOT)mrbgems/generator gem_mrblib $(GEM) > $@
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 :
cat $(GEM_RB_FILES) > $@
......
......@@ -7,26 +7,10 @@
#include <mrbconf.h>
#include <stdlib.h>
static int
one (const struct dirent *unused)
char *get_file_name(char *path)
{
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;
char *base = strrchr(path, '/');
return base ? base+1 : path;
}
/*
......@@ -48,7 +32,7 @@ directory_exists(char path[4096]) {
static char*
for_each_gem (char before[1024], char after[1024],
char start[1024], char end[1024],
char dir_to_skip[1024])
int full_path)
{
/* active GEM check */
FILE *active_gem_file;
......@@ -58,16 +42,6 @@ for_each_gem (char before[1024], char after[1024],
char gem_list[1024][1024] = { { 0 }, { 0 } };
int gem_index;
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 */
char* complete_line = malloc(4096 + sizeof(char));
......@@ -91,72 +65,18 @@ for_each_gem (char before[1024], char after[1024],
else
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);
}
else { /* Error: Active GEM list couldn't be loaded */ }
n = scandir("./g", &eps, one, alphasort);
if (n >= 0) {
/* iterate over each file and figure out what is a GEM and what not */
for (cnt = 0; cnt < n; ++cnt) {
strcpy(gemname, eps[cnt]->d_name);
strcpy(gemname_path, "./g/");
strcat(gemname_path, gemname);
/* 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.");
for(i = 0; i < gem_index; i++) {
strcat(complete_line, before);
if (full_path == TRUE)
strcat(complete_line, gem_list[i]);
else
strcat(complete_line, get_file_name(gem_list[i]));
strcat(complete_line, after);
}
strcat(complete_line, end);
......@@ -184,7 +104,7 @@ make_gem_makefile()
"endif\n\n");
/* is there any GEM available? */
gem_check = for_each_gem("", "", "", "", "");
gem_check = for_each_gem("", "", "", "", TRUE);
if (strcmp(gem_check, "") == 0)
gem_empty = TRUE;
else
......@@ -200,7 +120,7 @@ make_gem_makefile()
/* Call make for every GEM */
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");
}
......@@ -212,7 +132,7 @@ make_gem_makefile()
);
if (!gem_empty)
printf("%s",
for_each_gem(" ", "/test/*.rb ", "\tcat", " > mrbgemtest.rbtmp", "test")
for_each_gem(" ", "/test/*.rb ", "\tcat", " > mrbgemtest.rbtmp", TRUE)
);
else
printf("\t../generator rbtmp > mrbgemtest.rbtmp");
......@@ -226,7 +146,7 @@ make_gem_makefile()
"\t$(RM) *.c *.d *.rbtmp *.ctmp *.o mrbtest\n");
if (!gem_empty)
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
make_gem_makefile_list()
{
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"
"GEM_ARCHIVE_FILES := $(addsuffix /gem.a, $(GEM_ARCHIVE_FILES))\n"
printf("GEM_ARCHIVE_FILES := $(addsuffix /gem.a, $(GEM_LIST))\n"
"GEM_ARCHIVE_FILES += $(MRUBY_ROOT)/mrbgems/gem_init.a\n\n");
}
......@@ -269,7 +188,7 @@ make_gem_init()
/* Protoype definition of all initialization methods */
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");
......@@ -277,7 +196,7 @@ make_gem_init()
printf("void\n"
"mrb_init_mrbgems(mrb_state *mrb) {\n");
printf( "%s",
for_each_gem(" GENERATED_TMP_mrb_", "_gem_init(mrb);\n", "", "", "")
for_each_gem(" GENERATED_TMP_mrb_", "_gem_init(mrb);\n", "", "", FALSE)
);
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