void prog_makefile_rules(FILE * outmk, prog_t * p) { fprintf(outmk, "\n# -------- %s\n\n", p->name); if (p->srcdir && p->objs) { fprintf(outmk, "%s_SRCDIR=%s\n", p->ident, p->srcdir); fprintf(outmk, "%s_OBJS=", p->ident); output_strlst(outmk, p->objs); fprintf(outmk, "%s_make:\n", p->ident); fprintf(outmk, "\tcd $(%s_SRCDIR) && exec $(MAKE) -f %s $(%s_OBJS)\n\n", p->ident, p->mf_name, p->ident); } else fprintf(outmk, "%s_make:\n\t@echo \"** cannot make objs for %s\"\n\n", p->ident, p->name); fprintf(outmk, "%s_OBJPATHS=", p->ident); output_strlst(outmk, p->objpaths); fprintf(outmk, "%s_stub.c:\n", p->name); fprintf(outmk, "\techo \"" "int _crunched_%s_stub(int argc, char **argv, char **envp)" "{return main(argc,argv,envp);}\" >$@\n", p->ident); fprintf(outmk, "%s.lo: %s_stub.o $(%s_OBJPATHS)\n", p->name, p->name, p->ident); fprintf(outmk, "\t$(LINK) -o $@ %s_stub.o $(%s_OBJPATHS)\n", p->name, p->ident); fprintf(outmk, "\tcrunchide -k %s_crunched_%s_stub $@\n", elf_names ? "" : "_", p->ident); }
void gen_specials_cache(void) { FILE *cachef; prog_t *p; snprintf(line, sizeof(line), "generating %s", cachename); status(line); if ((cachef = fopen(cachename, "w")) == NULL) { perror(cachename); goterror = 1; return; } fprintf(cachef, "# %s - parm cache generated from %s by crunchgen %s\n\n", cachename, infilename, CRUNCH_VERSION); for (p = progs; p != NULL; p = p->next) { fprintf(cachef, "\n"); if (p->srcdir) fprintf(cachef, "special %s srcdir %s\n", p->name, p->srcdir); if (p->mf_name) fprintf(cachef, "special %s mf_name %s\n", p->name, p->mf_name); if (p->objdir) fprintf(cachef, "special %s objdir %s\n", p->name, p->objdir); if (p->objs) { fprintf(cachef, "special %s objs", p->name); output_strlst(cachef, p->objs); } fprintf(cachef, "special %s objpaths", p->name); output_strlst(cachef, p->objpaths); } fclose(cachef); }
void top_makefile_rules(FILE *outmk) { prog_t *p; fprintf(outmk, "LD?= ld\n"); if ( subtract_strlst(&libs, &libs_so) ) fprintf(outmk, "# NOTE: Some LIBS declarations below overridden by LIBS_SO\n"); fprintf(outmk, "LIBS+="); output_strlst(outmk, libs); fprintf(outmk, "LIBS_SO+="); output_strlst(outmk, libs_so); if (makeobj) { fprintf(outmk, "MAKEOBJDIRPREFIX?=%s\n", objprefix); fprintf(outmk, "MAKEENV=env MAKEOBJDIRPREFIX=$(MAKEOBJDIRPREFIX)\n"); fprintf(outmk, "CRUNCHMAKE=$(MAKEENV) $(MAKE)\n"); } else { fprintf(outmk, "CRUNCHMAKE=$(MAKE)\n"); } if (buildopts) { fprintf(outmk, "BUILDOPTS+="); output_strlst(outmk, buildopts); } fprintf(outmk, "CRUNCHED_OBJS="); for (p = progs; p != NULL; p = p->next) fprintf(outmk, " %s.lo", p->name); fprintf(outmk, "\n"); fprintf(outmk, "SUBMAKE_TARGETS="); for (p = progs; p != NULL; p = p->next) fprintf(outmk, " %s_make", p->ident); fprintf(outmk, "\nSUBCLEAN_TARGETS="); for (p = progs; p != NULL; p = p->next) fprintf(outmk, " %s_clean", p->ident); fprintf(outmk, "\n\n"); fprintf(outmk, "all: objs exe\nobjs: $(SUBMAKE_TARGETS)\n"); fprintf(outmk, "exe: %s\n", execfname); fprintf(outmk, "%s: %s.o $(CRUNCHED_OBJS) $(SUBMAKE_TARGETS)\n", execfname, execfname); fprintf(outmk, ".if defined(LIBS_SO) && !empty(LIBS_SO)\n"); fprintf(outmk, "\t$(CC) -o %s %s.o $(CRUNCHED_OBJS) \\\n", execfname, execfname); fprintf(outmk, "\t\t-Xlinker -Bstatic $(LIBS) \\\n"); fprintf(outmk, "\t\t-Xlinker -Bdynamic $(LIBS_SO)\n"); fprintf(outmk, ".else\n"); fprintf(outmk, "\t$(CC) -static -o %s %s.o $(CRUNCHED_OBJS) $(LIBS)\n", execfname, execfname); fprintf(outmk, ".endif\n"); fprintf(outmk, "realclean: clean subclean\n"); fprintf(outmk, "clean:\n\trm -f %s *.lo *.o *_stub.c\n", execfname); fprintf(outmk, "subclean: $(SUBCLEAN_TARGETS)\n"); }
void top_makefile_rules(FILE * outmk) { prog_t *p; strlst_t *l; fprintf(outmk, "STRIP?=strip\n"); fprintf(outmk, "LINK=$(LD) -dc -r\n"); fprintf(outmk, "LIBS="); for (l = libdirs; l != NULL; l = l->next) fprintf(outmk, " -L%s", l->str); output_strlst(outmk, libs); fprintf(outmk, "CRUNCHED_OBJS="); for (p = progs; p != NULL; p = p->next) fprintf(outmk, " %s.lo", p->name); fprintf(outmk, "\n"); fprintf(outmk, "SUBMAKE_TARGETS="); for (p = progs; p != NULL; p = p->next) fprintf(outmk, " %s_make", p->ident); fprintf(outmk, "\n\n"); fprintf(outmk, "%s: %s.o $(CRUNCHED_OBJS)\n", execfname, execfname); fprintf(outmk, "\t$(CC) -static -o $@ %s.o $(CRUNCHED_OBJS) $(LIBS)\n", execfname); fprintf(outmk, "\t$(STRIP) %s\n", execfname); fprintf(outmk, "all: objs exe\nobjs: $(SUBMAKE_TARGETS)\n"); fprintf(outmk, "exe: %s\n", execfname); fprintf(outmk, "clean:\n\trm -f %s *.lo *.o *_stub.c\n", execfname); fprintf(outmk, ".PHONY: all objs exe clean $(SUBMAKE_TARGETS)\n\n"); }
void fillin_program_objs(prog_t *p, char *path) { char *obj, *cp; int fd, rc; FILE *f; char *objvar="OBJS"; strlst_t *s; char line[MAXLINELEN]; /* discover the objs from the srcdir Makefile */ if ((fd = mkstemp(tempfname)) == -1) { perror(tempfname); exit(1); } if ((f = fdopen(fd, "w")) == NULL) { warn("%s", tempfname); goterror = 1; return; } if (p->objvar) objvar = p->objvar; /* * XXX include outhdrname (e.g. to contain Make variables) */ if (outhdrname[0] != '\0') fprintf(f, ".include \"%s\"\n", outhdrname); fprintf(f, ".include \"%s\"\n", path); fprintf(f, ".POSIX:\n"); if (buildopts) { fprintf(f, "BUILDOPTS+="); output_strlst(f, buildopts); } fprintf(f, ".if defined(PROG)\n"); fprintf(f, "%s?=${PROG}.o\n", objvar); fprintf(f, ".endif\n"); fprintf(f, "loop:\n\t@echo 'OBJS= '${%s}\n", objvar); fprintf(f, "crunchgen_objs:\n" "\t@cd %s && %s -f %s $(BUILDOPTS) $(%s_OPTS)", p->srcdir, path_make, tempfname, p->ident); for (s = p->buildopts; s != NULL; s = s->next) fprintf(f, " %s", s->str); fprintf(f, " loop\n"); fclose(f); snprintf(line, MAXLINELEN, "cd %s && %s -f %s -B crunchgen_objs", p->srcdir, path_make, tempfname); if ((f = popen(line, "r")) == NULL) { warn("submake pipe"); goterror = 1; return; } while(fgets(line, MAXLINELEN, f)) { if (strncmp(line, "OBJS= ", 6)) { warnx("make error: %s", line); goterror = 1; continue; } cp = line + 6; while (isspace((unsigned char)*cp)) cp++; while(*cp) { obj = cp; while (*cp && !isspace((unsigned char)*cp)) cp++; if (*cp) *cp++ = '\0'; add_string(&p->objs, obj); while (isspace((unsigned char)*cp)) cp++; } } if ((rc=pclose(f)) != 0) { warnx("make error: make returned %d", rc); goterror = 1; } unlink(tempfname); }
void prog_makefile_rules(FILE *outmk, prog_t *p) { strlst_t *lst; fprintf(outmk, "\n# -------- %s\n\n", p->name); fprintf(outmk, "%s_OBJDIR=", p->ident); if (p->objdir) fprintf(outmk, "%s", p->objdir); else fprintf(outmk, "$(MAKEOBJDIRPREFIX)/$(%s_REALSRCDIR)\n", p->ident); fprintf(outmk, "\n"); fprintf(outmk, "%s_OBJPATHS=", p->ident); if (p->objpaths) output_strlst(outmk, p->objpaths); else { for (lst = p->objs; lst != NULL; lst = lst->next) { fprintf(outmk, " $(%s_OBJDIR)/%s", p->ident, lst->str); } fprintf(outmk, "\n"); } fprintf(outmk, "$(%s_OBJPATHS): .NOMETA\n", p->ident); if (p->srcdir && p->objs) { fprintf(outmk, "%s_SRCDIR=%s\n", p->ident, p->srcdir); fprintf(outmk, "%s_REALSRCDIR=%s\n", p->ident, p->realsrcdir); fprintf(outmk, "%s_OBJS=", p->ident); output_strlst(outmk, p->objs); if (p->buildopts != NULL) { fprintf(outmk, "%s_OPTS+=", p->ident); output_strlst(outmk, p->buildopts); } #if 0 fprintf(outmk, "$(%s_OBJPATHS): %s_make\n\n", p->ident, p->ident); #endif fprintf(outmk, "%s_make:\n", p->ident); fprintf(outmk, "\t(cd $(%s_SRCDIR) && ", p->ident); if (makeobj) fprintf(outmk, "$(CRUNCHMAKE) obj && "); fprintf(outmk, "\\\n"); fprintf(outmk, "\t\t$(CRUNCHMAKE) $(BUILDOPTS) $(%s_OPTS) depend &&", p->ident); fprintf(outmk, "\\\n"); fprintf(outmk, "\t\t$(CRUNCHMAKE) $(BUILDOPTS) $(%s_OPTS) " "$(%s_OBJS))", p->ident, p->ident); fprintf(outmk, "\n"); fprintf(outmk, "%s_clean:\n", p->ident); fprintf(outmk, "\t(cd $(%s_SRCDIR) && $(CRUNCHMAKE) $(BUILDOPTS) clean cleandepend)\n\n", p->ident); } else { fprintf(outmk, "%s_make:\n", p->ident); fprintf(outmk, "\t@echo \"** cannot make objs for %s\"\n\n", p->name); } if (p->libs) { fprintf(outmk, "%s_LIBS=", p->ident); output_strlst(outmk, p->libs); } fprintf(outmk, "%s_stub.c:\n", p->name); fprintf(outmk, "\techo \"" "extern int main(int argc, char **argv, char **envp); " "int _crunched_%s_stub(int argc, char **argv, char **envp)" "{return main(argc,argv,envp);}\" >%s_stub.c\n", p->ident, p->name); fprintf(outmk, "%s.lo: %s_stub.o $(%s_OBJPATHS)", p->name, p->name, p->ident); if (p->libs) fprintf(outmk, " $(%s_LIBS)", p->ident); fprintf(outmk, "\n"); fprintf(outmk, "\t$(CC) -nostdlib -Wl,-dc -r -o %s.lo %s_stub.o $(%s_OBJPATHS)", p->name, p->name, p->ident); if (p->libs) fprintf(outmk, " $(%s_LIBS)", p->ident); fprintf(outmk, "\n"); fprintf(outmk, "\tcrunchide -k _crunched_%s_stub ", p->ident); for (lst = p->keeplist; lst != NULL; lst = lst->next) fprintf(outmk, "-k _%s ", lst->str); fprintf(outmk, "%s.lo\n", p->name); }