Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
That's the way, (aha aha) I like it (aha aha) !
[simgrid.git] / tools / gras / stub_generator.c
index 97a6b79..6d565ef 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(stubgen,gras,"Stub generator");
 
-#define WARN "/***********\n * DO NOT EDIT! THIS FILE WERE AUTOMATICALLY GENERATED FROM %s BY gras_stub_generator\n ***********/\n"
-#define SIM_FILENAME  "_%s_simulator.c"
+#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_FILENAME_LDADD  "%s_simulator_LDADD"
-#define SIM_FILENAME_SOURCES  "%s_simulator_SOURCES"
-#define RL_FILENAME  "_%s_%s.c"
+#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_FILENAME_LDADD  "%s_%s_LDADD"
-#define RL_FILENAME_SOURCES  "%s_%s_SOURCES"
-#define MAKEFILE_FILENAME  "%s.Makefile.am"
+#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;
 
@@ -118,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);
 }
 
@@ -129,8 +133,8 @@ 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);
@@ -168,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);
@@ -182,7 +186,7 @@ static void generate_rl(char *project)
   }
 }
 
-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;
@@ -190,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);
@@ -207,29 +211,29 @@ static void generate_makefile(char *project, char *deployment)
   }
 
   fprintf(OUT, "\n\n");
-  fprintf(OUT, SIM_FILENAME_SOURCES,project);
+  fprintf(OUT, SIM_SOURCENAME_SOURCES,project);
   fprintf(OUT, "=\t");
-  fprintf(OUT, SIM_FILENAME,project);
+  fprintf(OUT, SIM_SOURCENAME,project);
   fprintf(OUT, " %s.c\n", project);
-  fprintf(OUT, SIM_FILENAME_LDADD, 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, RL_FILENAME_LDADD, project, key);
+    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");
 
@@ -237,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[])
@@ -267,9 +445,24 @@ 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);
 
   free(warning);
   return 0;