X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/016df92e89c5ce9cee28e9249d6e6877258daf9e..ca5fca38a56c90308636efa65657c83402de59cf:/tools/gras/stub_generator.c diff --git a/tools/gras/stub_generator.c b/tools/gras/stub_generator.c index 5fd470f128..6d565ef56c 100644 --- a/tools/gras/stub_generator.c +++ b/tools/gras/stub_generator.c @@ -16,16 +16,20 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(stubgen,gras,"Stub generator"); -const char *WARN = "/***********\n * DO NOT EDIT! THIS FILE WERE AUTOMATICALLY GENERATED FROM %s BY gras_stub_generator\n ***********/\n"; -const char *SIM_FILENAME = "_%s_simulator.c"; -const char *SIM_BINARYNAME = "%s_simulator"; -const char *SIM_FILENAME_LDADD = "_%s_simulator_LDADD"; -const char *SIM_FILENAME_SOURCES = "_%s_simulator_SOURCES"; -const char *RL_FILENAME = "_%s_%s.c"; -const char *RL_BINARYNAME = "%s_%s"; -const char *RL_FILENAME_LDADD = "%s_%s_LDADD"; -const char *RL_FILENAME_SOURCES = "%s_%s_SOURCES"; -const char *MAKEFILE_FILENAME = "%s.Makefile.am"; +#define WARN "/***********\n * DO NOT EDIT! THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM %s BY gras_stub_generator\n ***********/\n" +#define SIM_SOURCENAME "_%s_simulator.c" +#define SIM_OBJNAME "_%s_simulator.o" +#define SIM_BINARYNAME "%s_simulator" +#define SIM_SOURCENAME_LDADD "%s_simulator_LDADD" +#define SIM_SOURCENAME_SOURCES "%s_simulator_SOURCES" +#define RL_SOURCENAME "_%s_%s.c" +#define RL_OBJNAME "_%s_%s.o" +#define RL_BINARYNAME "%s_%s" +#define RL_SOURCENAME_LDADD "%s_%s_LDADD" +#define RL_SOURCENAME_SOURCES "%s_%s_SOURCES" +#define MAKEFILE_FILENAME_AM "%s.Makefile.am" +#define MAKEFILE_FILENAME_LOCAL "%s.Makefile.local" +#define MAKEFILE_FILENAME_REMOTE "%s.Makefile.remote" char *warning = NULL; @@ -42,57 +46,36 @@ const char *SIM_PREEMBULE = "char *gras_log=NULL;\n"; -const char *SIM_LAUNCH_FUNC = -"int launch_%s(int argc, char **argv) {\n" -" char **myargv=argv;\n" -" int myargc=argc;\n" -" int i;\n" -" int retcode;\n" -" \n" -" if (gras_log) {\n" -" myargv=malloc((argc+1) * sizeof(char**));\n" -" for (i=0; i\n" -"#include \n" -"#include \n" -"\n" -"/* user code */\n" -"int %s(int argc, char *argv[]);\n" -"\n" -"int main(int argc, char *argv[]){\n" -" int errcode;\n" -"\n" -" errcode=%s(argc,argv);\n" -" \n" -" return errcode;\n" -"}\n"; +#define RL_CODE \ +"#include \n" \ +"#include \n" \ +"#include \n" \ +"\n" \ +"/* user code */\n" \ +"int %s(int argc, char *argv[]);\n" \ +"\n" \ +"int main(int argc, char *argv[]){\n" \ +" int errcode;\n" \ +"\n" \ +" errcode=%s(argc,argv);\n"\ +" \n" \ +" return errcode;\n"\ +"}\n" /**********************************************/ /********* Parse XML deployment file **********/ @@ -139,7 +122,7 @@ xbt_dict_t process_function_set = NULL; static void parse_process_init(void) { - void *p = (void *) 1231; + void *p = (void *) 1234; xbt_dict_set(process_function_set, A_process_function, p, NULL); } @@ -150,14 +133,14 @@ static void generate_sim(char *project) void *data = NULL; char *filename = NULL; FILE *OUT = NULL; - filename = xbt_new(char,strlen(project) + strlen(SIM_FILENAME)); - sprintf(filename,SIM_FILENAME,project); + filename = xbt_new(char,strlen(project) + strlen(SIM_SOURCENAME)); + sprintf(filename,SIM_SOURCENAME,project); OUT=fopen(filename,"w"); xbt_assert1(OUT, "Unable to open %s for writing",filename); fprintf(OUT, "%s\n",warning); - fprintf(OUT, SIM_PREEMBULE); + fprintf(OUT, "%s", SIM_PREEMBULE); xbt_dict_foreach(process_function_set,cursor,key,data) { fprintf(OUT,"int %s(int argc,char *argv[]);\n",key); } @@ -171,13 +154,13 @@ static void generate_sim(char *project) } fprintf(OUT, "\n%s\n",warning); - fprintf(OUT, SIM_MAIN_PREEMBULE); + fprintf(OUT, "%s", SIM_MAIN_PREEMBULE); xbt_dict_foreach(process_function_set,cursor,key,data) { fprintf(OUT," MSG_function_register(\"%s\", launch_%s);\n",key,key); } - fprintf(OUT, SIM_MAIN_POSTEMBULE); + fprintf(OUT, "%s", SIM_MAIN_POSTEMBULE); fclose(OUT); - xbt_free(filename); + free(filename); } static void generate_rl(char *project) @@ -189,8 +172,8 @@ static void generate_rl(char *project) FILE *OUT = NULL; xbt_dict_foreach(process_function_set,cursor,key,data) { - filename = xbt_new(char,strlen(project) + strlen(RL_FILENAME) + strlen(key)); - sprintf(filename,RL_FILENAME,project,key); + filename = xbt_new(char,strlen(project) + strlen(RL_SOURCENAME) + strlen(key)); + sprintf(filename,RL_SOURCENAME,project,key); OUT=fopen(filename,"w"); xbt_assert1(OUT, "Unable to open %s for writing",filename); @@ -199,11 +182,11 @@ static void generate_rl(char *project) fprintf(OUT, RL_CODE, key,key); fprintf(OUT, "\n%s\n",warning); fclose(OUT); - xbt_free(filename); + free(filename); } } -static void generate_makefile(char *project, char *deployment) +static void generate_makefile_am(char *project, char *deployment) { xbt_dict_cursor_t cursor=NULL; char *key = NULL; @@ -211,8 +194,8 @@ static void generate_makefile(char *project, char *deployment) char *filename = NULL; FILE *OUT = NULL; - filename = xbt_new(char,strlen(project) + strlen(MAKEFILE_FILENAME)); - sprintf(filename,MAKEFILE_FILENAME, project); + filename = xbt_new(char,strlen(project) + strlen(MAKEFILE_FILENAME_AM)); + sprintf(filename,MAKEFILE_FILENAME_AM, project); OUT=fopen(filename,"w"); xbt_assert1(OUT, "Unable to open %s for writing",filename); @@ -220,7 +203,7 @@ static void generate_makefile(char *project, char *deployment) fprintf(OUT, "# AUTOMAKE variable definition\n"); fprintf(OUT, "INCLUDES= @CFLAGS_SimGrid@\n\n"); fprintf(OUT, "PROGRAMS="); - fprintf(OUT, SIM_FILENAME,project); + fprintf(OUT, SIM_BINARYNAME,project); xbt_dict_foreach(process_function_set,cursor,key,data) { fprintf(OUT, " "); @@ -228,35 +211,29 @@ static void generate_makefile(char *project, char *deployment) } fprintf(OUT, "\n\n"); - fprintf(OUT, SIM_FILENAME_SOURCES,project); - fprintf(OUT, "="); - fprintf(OUT, SIM_FILENAME,project); + fprintf(OUT, SIM_SOURCENAME_SOURCES,project); + fprintf(OUT, "=\t"); + fprintf(OUT, SIM_SOURCENAME,project); fprintf(OUT, " %s.c\n", project); + fprintf(OUT, SIM_SOURCENAME_LDADD, project); + fprintf(OUT, "=\tpath/to/libsimgrid.a\n\n"); xbt_dict_foreach(process_function_set,cursor,key,data) { - fprintf(OUT, RL_FILENAME_SOURCES, project,key); + fprintf(OUT, RL_SOURCENAME_SOURCES, project,key); fprintf(OUT, "=\t"); - fprintf(OUT, RL_FILENAME, project,key); + fprintf(OUT, RL_SOURCENAME, project,key); fprintf(OUT, " %s.c\n", project); - } - - fprintf(OUT, "\n\n"); - fprintf(OUT, SIM_FILENAME_LDADD, project); - fprintf(OUT, "=\tpath/to/libsimgrid.a\n"); - - - xbt_dict_foreach(process_function_set,cursor,key,data) { - fprintf(OUT, RL_FILENAME_LDADD, project, key); - fprintf(OUT, "=\tpath/to/libgras.a\n"); + fprintf(OUT, RL_SOURCENAME_LDADD, project, key); + fprintf(OUT, "=\tpath/to/libgras.a\n\n"); } fprintf(OUT, "\n# cleanup temps\n"); fprintf(OUT, "CLEANFILES= "); - fprintf(OUT, SIM_FILENAME, project); + fprintf(OUT, SIM_SOURCENAME, project); xbt_dict_foreach(process_function_set,cursor,key,data) { fprintf(OUT, " "); - fprintf(OUT, RL_FILENAME, project,key); + fprintf(OUT, RL_SOURCENAME, project,key); } fprintf(OUT, "\n"); @@ -264,12 +241,186 @@ static void generate_makefile(char *project, char *deployment) fprintf(OUT, "\n# A rule to generate the source file each time the deployment file changes\n"); xbt_dict_foreach(process_function_set,cursor,key,data) { - fprintf(OUT, RL_FILENAME, project,key); + fprintf(OUT, RL_SOURCENAME, project,key); fprintf(OUT, " "); } - fprintf(OUT, SIM_FILENAME, project); + fprintf(OUT, SIM_SOURCENAME, project); fprintf(OUT, ": %s\n", deployment); - fprintf(OUT, "\tstub_generator %s %s >/dev/null\n", project, filename); + fprintf(OUT, "\tstub_generator %s %s >/dev/null\n", project, deployment); + fclose(OUT); +} + + +static void generate_makefile_local(char *project, char *deployment) +{ + xbt_dict_cursor_t cursor=NULL; + char *key = NULL; + void *data = NULL; + char *filename = NULL; + FILE *OUT = NULL; + + filename = xbt_new(char,strlen(project) + strlen(MAKEFILE_FILENAME_LOCAL)); + sprintf(filename,MAKEFILE_FILENAME_LOCAL, project); + + OUT=fopen(filename,"w"); + xbt_assert1(OUT, "Unable to open %s for writing",filename); + + fprintf(OUT, "############ PROJECT COMPILING AND ARCHIVING #########\n"); + fprintf(OUT, "PROJECT_NAME=%s\n",project); + fprintf(OUT, + "DISTDIR=gras-$(PROJECT_NAME)\n\n" + "SIMGRID_INSTALL_PATH?= $(shell echo \"\\\"<<<< SIMGRID_INSTALL_PATH undefined !!! >>>>\\\"\")\n" + "CFLAGS = -O3 -w\n" + "INCLUDES = -I$(SIMGRID_INSTALL_PATH)/include\n" + "LIBS = -lm -L$(SIMGRID_INSTALL_PATH)/lib/ -lsimgrid\n" + "\n"); + + fprintf(OUT, "C_FILES = "); + fprintf(OUT, SIM_SOURCENAME" ",project); + xbt_dict_foreach(process_function_set,cursor,key,data) { + fprintf(OUT, RL_SOURCENAME " ",project, key); + } + fprintf(OUT, "%s.c\n", project); + + fprintf(OUT,"OBJ_FILES = \n"); + + fprintf(OUT, "BIN_FILES = "); + + fprintf(OUT, SIM_BINARYNAME " ",project); + xbt_dict_foreach(process_function_set,cursor,key,data) { + fprintf(OUT, RL_BINARYNAME " ", project, key); + } + fprintf(OUT, "\n"); + + fprintf(OUT, + "\n" + "all: $(BIN_FILES)\n" + "\n"); + fprintf(OUT, SIM_BINARYNAME ": " SIM_OBJNAME " %s.c\n",project, project, project); + xbt_dict_foreach(process_function_set,cursor,key,data) { + fprintf(OUT, RL_BINARYNAME " : " RL_OBJNAME " %s.c\n", project, key, project, key, project); + } + fprintf(OUT, + "\n" + "%%: %%.o\n" + "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS) $(LDADD) -o $@ \n" + "\n" + "%%.o: %%.c\n" + "\t$(CC) $(INCLUDES) $(DEFS) $(CFLAGS) -c -o $@ $<\n" + "\n" + "DIST_FILES= $(C_FILES) "MAKEFILE_FILENAME_LOCAL" "MAKEFILE_FILENAME_REMOTE"\n" + "distdir: $(DIST_FILES)\n" + "\trm -rf $(DISTDIR)\n" + "\tmkdir -p $(DISTDIR)\n" + "\tcp $^ $(DISTDIR)\n" + "\n" + "dist: clean distdir\n" + "\ttar c $(DISTDIR) | gzip -c > $(DISTDIR).tar.gz\n" + "\n" + "clean:\n" + "\trm -f $(BIN_FILES) $(OBJ_FILES) *~\n" + "\trm -rf $(DISTDIR)\n" + "\n" + ".SUFFIXES:\n" + ".PHONY : clean\n" + "\n", project, project); + + fprintf(OUT, "############ REMOTE COMPILING #########\n"); + fprintf(OUT, + "MACHINES ?= varekai.ucsd.edu sideshow.ucsd.edu dralion.ucsd.edu\n" + "INSTALL_PATH ?='$$HOME/tmp/src' ### Has to be an absolute path !!! \n" + "SRCDIR ?= ./\n" + "SIMGRID_VERSION ?=2.91\n" + "GRAS_PROJECT ?= %s\n" + "GRAS_PROJECT_URL ?= http://www-id.imag.fr/Laboratoire/Membres/Legrand_Arnaud/gras_test/\n" + "\n" + "remote:\n" + "\t@echo;echo \"----[ Compile the package on remote hosts ]----\"\n" + "\t@test -e $(SRCDIR)/buildlogs/ || mkdir -p $(SRCDIR)/buildlogs/\n" + "\t for site in $(MACHINES) ; do \\\n" + "\t machine=`echo $$site |sed 's/^\\([^%%]*\\)%%.*$$/\\1/'`;\\\n" + "\t machine2=`echo $$site |sed 's/^\\([^%%]*\\)%%\\(.*\\)$$/\\2/'`;\\\n" + "\t cmd_mkdir=\"\\\"sh -c 'env INSTALL_PATH=$(INSTALL_PATH) SIMGRID_INSTALL_PATH=$(INSTALL_PATH) \\\n" + "\t SIMGRID_VERSION=$(SIMGRID_VERSION) GRAS_PROJECT=$(GRAS_PROJECT) \\\n" + "\t GRAS_PROJECT_URL=$(GRAS_PROJECT_URL) mkdir -p $(INSTALL_PATH) 2>&1'\\\"\";\\\n" + "\t cmd_make=\"\\\"sh -c 'env INSTALL_PATH=$(INSTALL_PATH) SIMGRID_INSTALL_PATH=$(INSTALL_PATH) \\\n" + "\t SIMGRID_VERSION=$(SIMGRID_VERSION) GRAS_PROJECT=$(GRAS_PROJECT) \\\n" + "\t GRAS_PROJECT_URL=$(GRAS_PROJECT_URL) make -C $(INSTALL_PATH) -f "MAKEFILE_FILENAME_REMOTE" $(ACTION) 2>&1'\\\"\";\\\n" + "\t if echo $$site | grep '%%' >/dev/null ; then \\\n" + "\t echo \"----[ Compile on $$machine2 (behind $$machine) ]----\";\\\n" + "\t else \\\n" + "\t machine=$$site;\\\n" + "\t echo \"----[ Compile on $$machine ]----\";\\\n" + "\t fi;\\\n" + "\t if echo $$site | grep '%%' >/dev/null ; then \\\n" + "\t if ssh $$machine \"ssh -A $$machine2 $$cmd_mkdir\" 2>&1 > $(SRCDIR)/buildlogs/$$site.log;\\\n" + "\t then true; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi;\\\n" + "\t else \\\n" + "\t if ssh $$machine \"eval $$cmd_mkdir\" 2>&1 > $(SRCDIR)/buildlogs/$$site.log ;\\\n" + "\t then true; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi; \\\n" + "\t fi;\\\n" + "\t echo \"-- Copy the data over\"; \\\n" + "\t scp "MAKEFILE_FILENAME_REMOTE" $$site:$(INSTALL_PATH) ;\\\n" + "\t echo \"-- Compiling... (the output gets into $(SRCDIR)/buildlogs/$$site.log)\"; \\\n" + "\t if echo $$site | grep '%%' >/dev/null ; then \\\n" + "\t if ssh $$machine \"ssh -A $$machine2 $$cmd_make\" 2>&1 >> $(SRCDIR)/buildlogs/$$site.log;\\\n" + "\t then echo \"Sucessful\"; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi;echo; \\\n" + "\t else \\\n" + "\t if ssh $$machine \"eval $$cmd_make\" 2>&1 >> $(SRCDIR)/buildlogs/$$site.log ;\\\n" + "\t then echo \"Sucessful\"; else failed=1;echo \"Failed (check $(SRCDIR)/buildlogs/$$site.log)\"; fi;echo; \\\n" + "\t fi;\\\n" + "\t done;\n",project,project,project); + + fclose(OUT); +} + +static void generate_makefile_remote(char *project, char *deployment) +{ + xbt_dict_cursor_t cursor=NULL; + char *key = NULL; + void *data = NULL; + char *filename = NULL; + FILE *OUT = NULL; + + filename = xbt_new(char,strlen(project) + strlen(MAKEFILE_FILENAME_REMOTE)); + sprintf(filename,MAKEFILE_FILENAME_REMOTE, project); + + OUT=fopen(filename,"w"); + xbt_assert1(OUT, "Unable to open %s for writing",filename); + + fprintf(OUT, + "INSTALL_PATH ?= $(shell pwd)\n" + "\n" + "simgrid-$(SIMGRID_VERSION).tar.gz:\n" + "\twget -N http://gcl.ucsd.edu/simgrid/dl/simgrid-$(SIMGRID_VERSION).tar.gz\n" + "simgrid-$(SIMGRID_VERSION)/: simgrid-$(SIMGRID_VERSION).tar.gz\n" + "\ttar zxf $<\n" + "\tcd simgrid-$(SIMGRID_VERSION)/; \\\n" + "\t ./configure --prefix=$(INSTALL_PATH) ; \\\n" + "\t make all install\n" + "compile-simgrid: simgrid-$(SIMGRID_VERSION)\n" + "\n" + "gras-$(GRAS_PROJECT).tar.gz:\n" + "\twget -N $(GRAS_PROJECT_URL)/gras-$(GRAS_PROJECT).tar.gz\n" + "gras-$(GRAS_PROJECT)/: gras-$(GRAS_PROJECT).tar.gz\n" + "\ttar zxf $<\n" + "\tmake -C gras-$(GRAS_PROJECT)/ -f $(GRAS_PROJECT).Makefile.local all\n" + "compile-gras compile-gras-$(GRAS_PROJECT): gras-$(GRAS_PROJECT) compile-simgrid\n" + "\n" + "clean-simgrid:\n" + "\trm -rf simgrid-$(SIMGRID_VERSION)*\n" + "clean-gras clean-gras-$(GRAS_PROJECT):\n" + "\trm -rf gras-$(GRAS_PROJECT)*\n" + "clean: clean-simgrid clean-gras-$(GRAS_PROJECT)\n" + "\n" + ".PHONY: clean clean-simgrid clean-gras-$(GRAS_PROJECT) compile-simgrid compile-gras-$(GRAS_PROJECT)\n" + "\n"); + fclose(OUT); +} + +static void print(void *p) +{ + printf("%p",p); } int main(int argc, char *argv[]) @@ -294,10 +445,25 @@ int main(int argc, char *argv[]) warning = xbt_new(char,strlen(WARN)+strlen(deployment_file)+10); sprintf(warning,WARN,deployment_file); + if(XBT_LOG_ISENABLED(stubgen, xbt_log_priority_debug)) { + xbt_dict_cursor_t cursor=NULL; + char *key = NULL; + void *data = NULL; + + for (cursor=NULL, xbt_dict_cursor_first((process_function_set),&(cursor)) ; + xbt_dict_cursor_get_or_free(&(cursor),&(key),(void**)(&data)); + xbt_dict_cursor_step(cursor) ) { + DEBUG1("Function %s", key); + } + + xbt_dict_dump(process_function_set,print); + } + generate_sim(project_name); generate_rl(project_name); - generate_makefile(project_name, deployment_file); + generate_makefile_local(project_name, deployment_file); + generate_makefile_remote(project_name, deployment_file); - xbt_free(warning); + free(warning); return 0; }