#include #include #include char* toolname = "gen-imakefile"; #define RUNONLY 1 #define RUNLIB 2 #define LIBONLY 3 int main(int argc, char* argv[],char* envp[]) { DIR* dir; struct dirent* d; FILE *fp; char target[256]; char* suffix; int flag = RUNONLY; int printbslash; if (argc == 1 || argc > 3) { fprintf(stderr,"%s: incorrect commmand arguement.\n",toolname); fprintf(stderr,"\t\t%s [ run-exec | lib | runlib ] subdir\n",toolname); exit(1); } if (strcmp(argv[1],"buildlib") == 0) { flag = LIBONLY; argc--; argv++; } else if (strcmp(argv[1],"buildrunlib") == 0) { flag = RUNLIB; argc--; argv++; } else if (strcmp(argv[1],"buildrun") == 0) { flag = RUNONLY; argc--; argv++; } if (argc != 2) { fprintf(stderr,"%s: incorrect commmand arguement.\n",toolname); fprintf(stderr,"\t\t%s: [ run-exec | lib | runlib ] subdir\n"); exit(1); } dir = opendir(argv[1]); if (dir == NULL) { fprintf(stderr,"%s: unable to open directory %s\n\t",toolname,argv[1]); perror(argv[1]); fprintf(stderr,"\n"); exit(1); } sprintf(target,"%s/Imakefile",argv[1]); fp = fopen(target,"w"); if (fp == NULL) { fprintf(stderr,"%s: unable to open %s for output\n\t",toolname,target); perror(target); fprintf(stderr,"\n"); exit(1); } fprintf(fp,"/* generated Imakefile. DONT EDIT!!! */\n\n\n"); fprintf(fp,"SIMI = SI\n"); fprintf(fp,"CCC = CC\n"); fprintf(fp,"SRCS1 = main.C make_instance-DEM.C lex.yy.c\n\n\n"); fprintf(fp,"OBJS1 = main.o make_instance-DEM.o lex.yy.o\n\n\n"); fprintf(fp,"SRCS2 = "); d = readdir(dir); d = readdir(dir); printbslash = 0; for (d = readdir(dir); d != NULL; d = readdir(dir)) { suffix = strrchr(d->d_name,'.'); if (suffix == NULL) continue; if (strcmp(suffix,".C") == 0 || strcmp(suffix,".c") == 0) { if ((strcmp(d->d_name,"main.C") == 0) || (strcmp(d->d_name,"make_instance-DEM.C") == 0) || (strcmp(d->d_name,"lex.yy.c") == 0)) continue; if (printbslash) fprintf(fp,"\\\n"); printbslash = 1; fprintf(fp,"\t\t%s",d->d_name); } } fprintf(fp,"\n\n"); rewinddir(dir); fprintf(fp,"OBJS2 = "); d = readdir(dir); d = readdir(dir); printbslash = 0; for (d = readdir(dir); d != NULL; d = readdir(dir)) { suffix = strrchr(d->d_name,'.'); if (suffix == NULL) continue; if (strcmp(suffix,".C") == 0 || strcmp(suffix,".c") == 0) { if ((strcmp(d->d_name,"main.C") == 0) || (strcmp(d->d_name,"make_instance-DEM.C") == 0) || (strcmp(d->d_name,"lex.yy.c") == 0)) continue; if (printbslash) fprintf(fp,"\\\n"); printbslash = 1; sprintf(target,"%s",d->d_name); *(strrchr(target,'.')+1) = 'o'; fprintf(fp,"\t\t%s",target); } } fprintf(fp,"\n\n"); fprintf(fp,"SRCS3 = $(EXTRASRCS)\n\n"); fprintf(fp,"OBJS3 = $(EXTRAOBJS)\n\n"); fprintf(fp,"SRCS = $(SRCS1) $(SRCS2) $(SRCS3)\n\n"); fprintf(fp,"OBJS = $(OBJS1) $(OBJS2) $(OBJS3)\n\n"); if (flag == RUNONLY || flag == RUNLIB) { fprintf(fp,"AllTarget(run-exec)\n"); fprintf(fp,"run-exec: $(OBJS)\n"); fprintf(fp,"\tRemoveTargetProgram($@)\n"); fprintf(fp,"\tif [ `basename $(CCC)` = gcc ]; then \\\n\t\t$(CCC) $(ALLINCLUDES) $(OCFLAGS) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) -lg++;\\\n\telse\t\t$(CCC) $(ALLINCLUDES) $(OCFLAGS) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS);\\\n\tfi\n"); } if (flag == RUNLIB || flag == LIBONLY) { fprintf(fp,"DemeterEnvLibraryTarget(Concat($(TARGETLIBDIR)/lib,$(TARGETLIBNAME).a),$(OBJS2),$(OBJS3))\n\n"); fprintf(fp,"DemeterEnvHeadersTarget(Concat($(TARGETINCLUDEDIR)/,$(TARGETINCLUDENAME).h))\n\n"); } fprintf(fp,"DependTarget()\n\n"); closedir(dir); fclose(fp); return (0); }