コード例 #1
0
ファイル: crunchgen.c プロジェクト: jyin0813/OpenBSD-src
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);
}
コード例 #2
0
ファイル: crunchgen.c プロジェクト: jyin0813/OpenBSD-src
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);
}
コード例 #3
0
ファイル: crunchgen.c プロジェクト: 2trill2spill/freebsd
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");
}
コード例 #4
0
ファイル: crunchgen.c プロジェクト: jyin0813/OpenBSD-src
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");
}
コード例 #5
0
ファイル: crunchgen.c プロジェクト: 2trill2spill/freebsd
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);
}
コード例 #6
0
ファイル: crunchgen.c プロジェクト: 2trill2spill/freebsd
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);
}