Back&forth with Theo. A bit more logic.
Most trees are moveable, and it's possible to
do so when -b is not in use...
Index: config.h
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.sbin/config/config.h,v
retrieving revision 1.25
diff -u -p -r1.25 config.h
--- config.h 5 Dec 2012 23:20:26 -0000 1.25
+++ config.h 28 Oct 2013 07:44:56 -0000
@@ -339,6 +339,10 @@ void defoption(const char *name);
int devbase_has_instances(struct devbase *, int);
int deva_has_instances(struct deva *, int);
void setupdirs(void);
+int pflag;
+char *sflag;
+char *bflag;
+char *startdir;
/* mkheaders.c */
int mkheaders(void);
Index: main.c
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.sbin/config/main.c,v
retrieving revision 1.44
diff -u -p -r1.44 main.c
--- main.c 22 Jun 2012 22:02:29 -0000 1.44
+++ main.c 28 Oct 2013 18:36:33 -0000
@@ -93,13 +93,19 @@ usage(void)
exit(1);
}
+int pflag = 0;
+char *sflag = NULL;
+char *bflag = NULL;
+char *startdir;
+
int
main(int argc, char *argv[])
{
char *p;
const char *last_component;
char *outfile = NULL;
- int pflag, ch, eflag, uflag, fflag;
+ int ch, eflag, uflag, fflag;
+ char dirbuffer[PATH_MAX];
pflag = eflag = uflag = fflag = 0;
while ((ch = getopt(argc, argv, "egpfb:s:o:u")) != -1) {
@@ -148,10 +154,12 @@ main(int argc, char *argv[])
break;
case 'b':
+ bflag = optarg;
builddir = optarg;
break;
case 's':
+ sflag = optarg;
srcdir = optarg;
break;
@@ -163,7 +171,15 @@ main(int argc, char *argv[])
argc -= optind;
argv += optind;
if (argc > 1 || (eflag && argv[0] == NULL))
+
usage();
+ if (bflag) {
+ startdir = getcwd(dirbuffer, sizeof dirbuffer);
+ if (startdir == NULL)
+ warn("Use of -b and can't getcwd, no make config");
+ } else {
+ startdir = "../../conf";
+ }
if (eflag) {
#ifdef MAKE_BOOTSTRAP
Index: mkmakefile.c
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.sbin/config/mkmakefile.c,v
retrieving revision 1.37
diff -u -p -r1.37 mkmakefile.c
--- mkmakefile.c 17 Sep 2012 17:36:13 -0000 1.37
+++ mkmakefile.c 28 Oct 2013 18:36:46 -0000
@@ -60,6 +60,7 @@
static const char *srcpath(struct files *);
static int emitdefs(FILE *);
+static int emitreconfig(FILE *);
static int emitfiles(FILE *, int);
static int emitobjs(FILE *);
@@ -120,6 +121,10 @@ mkmakefile(void)
if ((*fn)(ofp))
goto wrerror;
}
+ if (startdir != NULL) {
+ if (emitreconfig(ofp) != 0)
+ goto wrerror;
+ }
if (ferror(ifp)) {
(void)fprintf(stderr,
"config: error reading %s (at line %d): %s\n",
@@ -271,6 +276,33 @@ emitdefs(FILE *fp)
for (nv = mkoptions; nv != NULL; nv = nv->nv_next)
if (fprintf(fp, "%s=%s\n", nv->nv_name, nv->nv_str) < 0)
return (1);
+ return (0);
+}
+
+static int
+emitreconfig(FILE *fp)
+{
+ if (fputs("\n"
+ ".PHONY: config\n"
+ "config:\n", fp) < 0)
+ return (1);
+ if (fprintf(fp, "\tcd %s && config ", startdir) < 0)
+ return (1);
+ if (pflag) {
+ if (fputs("-p ", fp) < 0)
+ return (1);
+ }
+ if (sflag) {
+ if (fprintf(fp, "-s %s ", sflag) < 0)
+ return (1);
+ }
+ if (bflag) {
+ if (fprintf(fp, "-b %s ", bflag) < 0)
+ return (1);
+ }
+ /* other options */
+ if (fprintf(fp, "%s\n", conffile) < 0)
+ return (1);
return (0);
}