From owner-freebsd-small Sat Dec 9 14:16:14 2000 From owner-freebsd-small@FreeBSD.ORG Sat Dec 9 14:16:08 2000 Return-Path: Delivered-To: freebsd-small@freebsd.org Received: from genius.tao.org.uk (genesis.tao.org.uk [194.242.131.94]) by hub.freebsd.org (Postfix) with ESMTP id C33BC37B401 for ; Sat, 9 Dec 2000 14:16:05 -0800 (PST) Received: by genius.tao.org.uk (Postfix, from userid 100) id 537229B36; Sat, 9 Dec 2000 22:01:24 +0000 (GMT) Date: Sat, 9 Dec 2000 22:01:24 +0000 From: Josef Karthauser To: small@FreeBSD.ORG Cc: Luigi Rizzo Subject: Rewrite of Crunchgen - call for testers. Message-ID: <20001209220123.A57946@bsdi.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="lrZ03NoBR/3+SXJZ" Content-Disposition: inline User-Agent: Mutt/1.2.5i Sender: joe@tao.org.uk Sender: owner-freebsd-small@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG --lrZ03NoBR/3+SXJZ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi everyone, I've been working on crunchgen to get to better handle building objects in $MAKEOBJDIRPREFIX, even if it changes between generating the crunch.mk file and running it. I'd really appreciate it if you could test it if you've got a moment, and rely on it. i.e.: crunchgen foo.conf crunchgen -o -p /some/other/obj foo.conf make -f foo.mk MAKEOBJDIRPREFIX=/something/else make -f foo.mk etc, In particular if you use the 'special foo objpaths' config option please let me know whether it still does what you'd expect. Many thanks, Joe p.s. the patch should apply to both -current and 4-stable. -- Josef Karthauser [joe@FreeBSD.org, joe@tao.org.uk] ......... FreeBSD: The power to change the world ........ --lrZ03NoBR/3+SXJZ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=patch Index: crunchgen.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/crunch/crunchgen/crunchgen.c,v retrieving revision 1.17 diff -u -r1.17 crunchgen.c --- crunchgen.c 2000/11/30 21:14:54 1.17 +++ crunchgen.c 2000/12/09 21:53:42 @@ -65,6 +65,7 @@ char *name; /* program name */ char *ident; /* C identifier for the program name */ char *srcdir; + char *realsrcdir; char *objdir; char *objvar; /* Makefile variable to replace OBJS */ strlst_t *objs, *objpaths; @@ -502,8 +503,7 @@ gen_output_makefile(); status(""); fprintf(stderr, - "Run \"make -f %s objs exe\" to build crunched binary.\n", - outmkname); + "Run \"make -f %s\" to build crunched binary.\n", outmkname); } /* @@ -513,8 +513,8 @@ { char path[MAXPATHLEN]; char *srcparent; - strlst_t *s; char line[MAXLINELEN]; + FILE *f; snprintf(line, MAXLINELEN, "filling in parms for %s", p->name); status(line); @@ -528,20 +528,30 @@ if(is_dir(line)) p->srcdir = strdup(line); } - if(!p->objdir && p->srcdir) { - FILE *f; - p->objdir = p->srcdir; - snprintf(line, MAXLINELEN, "cd %s && echo -n %s`/bin/pwd`", - p->srcdir, objprefix); - f = popen(line,"r"); - if (f) { - path[0]='\0'; - fgets(path,sizeof path, f); - if (!pclose(f)) { - if(is_dir(path)) - p->objdir = strdup(path); - } - } + + /* Determine the actual srcdir (maybe symlinked). */ + snprintf(line, MAXLINELEN, "cd %s && echo -n `/bin/pwd`", p->srcdir); + f = popen(line,"r"); + if (f) { + path[0] = '\0'; + fgets(path, sizeof path, f); + if (!pclose(f)) { + p->realsrcdir = strdup(path); + } + } + if (!p->realsrcdir) + errx(1, "Can't execute: %s\n", line); + + /* Unless the option to make object files was specified the + * the objects will be built in the source directory unless + * an object directory already exists. + */ + if(!makeobj && !p->objdir && p->srcdir) { + snprintf(line, sizeof line, "%s/%s", objprefix, p->realsrcdir); + if (is_dir(line)) + p->objdir = strdup(line); + else + p->objdir = p->realsrcdir; } /* * XXX look for a Makefile.{name} in local directory first. @@ -556,24 +566,12 @@ if(!p->objs && p->srcdir && is_nonempty_file(path)) fillin_program_objs(p, path); - if(!p->objpaths && p->objdir && p->objs) - for(s = p->objs; s != NULL; s = s->next) { - snprintf(line, MAXLINELEN, "%s/%s", p->objdir, s->str); - add_string(&p->objpaths, line); - } - if(!p->srcdir && verbose) warnx("%s: %s: warning: could not find source directory", infilename, p->name); if(!p->objs && verbose) warnx("%s: %s: warning: could not find any .o files", infilename, p->name); - - if(!p->objpaths) { - warnx("%s: %s: error: no objpaths specified or calculated", - infilename, p->name); - p->goterror = goterror = 1; - } } void fillin_program_objs(prog_t *p, char *path) @@ -694,9 +692,11 @@ if(p->objs) { fprintf(cachef, "special %s objs", p->name); output_strlst(cachef, p->objs); + } + if(p->objpaths) { + fprintf(cachef, "special %s objpaths", p->name); + output_strlst(cachef, p->objpaths); } - fprintf(cachef, "special %s objpaths", p->name); - output_strlst(cachef, p->objpaths); } fclose(cachef); } @@ -816,6 +816,13 @@ fprintf(outmk, "LIBS="); output_strlst(outmk, libs); + if (makeobj) { + fprintf(outmk, "MAKEOBJDIRPREFIX?=%s\n", objprefix); + fprintf(outmk, "MAKE=env MAKEOBJDIRPREFIX=$(MAKEOBJDIRPREFIX) make\n"); + } else { + fprintf(outmk, "MAKE=make\n"); + } + if (buildopts) { fprintf(outmk, "BUILDOPTS+="); output_strlst(outmk, buildopts); @@ -834,13 +841,13 @@ 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)\n", execfname, execfname); fprintf(outmk, "\t$(CC) -static -o %s %s.o $(CRUNCHED_OBJS) $(LIBS)\n", execfname, execfname); fprintf(outmk, "\tstrip %s\n", execfname); - fprintf(outmk, "all: objs exe\nobjs: $(SUBMAKE_TARGETS)\n"); - fprintf(outmk, "exe: %s\n", execfname); fprintf(outmk, "realclean: clean subclean\n"); fprintf(outmk, "clean:\n\trm -f %s *.lo *.o *_stub.c\n", execfname); @@ -856,6 +863,16 @@ 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_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_OBJS=", p->ident); output_strlst(outmk, p->objs); if (p->buildopts != NULL) { @@ -865,20 +882,27 @@ fprintf(outmk, "%s_make:\n", p->ident); fprintf(outmk, "\t(cd $(%s_SRCDIR) && ", p->ident); if (makeobj) - fprintf(outmk, "make obj && "); + fprintf(outmk, "$(MAKE) obj && "); fprintf(outmk, "\\\n"); - fprintf(outmk, "\t\tmake $(BUILDOPTS) $(%s_OPTS) depend && \\\n" - "\t\tmake $(BUILDOPTS) $(%s_OPTS) $(%s_OBJS))\n", + fprintf(outmk, "\t\t$(MAKE) $(BUILDOPTS) $(%s_OPTS) depend && \\\n" + "\t\t$(MAKE) $(BUILDOPTS) $(%s_OPTS) $(%s_OBJS))\n", p->ident, p->ident, p->ident); fprintf(outmk, "%s_clean:\n", p->ident); - fprintf(outmk, "\t(cd $(%s_SRCDIR) && make clean)\n\n", p->ident); + fprintf(outmk, "\t(cd $(%s_SRCDIR) && $(MAKE) clean)\n\n", 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_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_stub.c:\n", p->name); fprintf(outmk, "\techo \"" --lrZ03NoBR/3+SXJZ-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-small" in the body of the message