diff options
-rw-r--r-- | usr.sbin/config/config.8 | 17 | ||||
-rw-r--r-- | usr.sbin/config/config.h | 3 | ||||
-rw-r--r-- | usr.sbin/config/config.y | 4 | ||||
-rw-r--r-- | usr.sbin/config/lang.l | 2 | ||||
-rw-r--r-- | usr.sbin/config/main.c | 70 | ||||
-rw-r--r-- | usr.sbin/config/mkmakefile.c | 2 |
6 files changed, 79 insertions, 19 deletions
diff --git a/usr.sbin/config/config.8 b/usr.sbin/config/config.8 index ad3af6b..85da1a6 100644 --- a/usr.sbin/config/config.8 +++ b/usr.sbin/config/config.8 @@ -41,6 +41,7 @@ .Sh SYNOPSIS .Nm config .Op Fl gpr +.Op Fl d Ar destdir .Ar SYSTEM_NAME .Sh DESCRIPTION This is the old version of the @@ -73,6 +74,13 @@ section below). Available options and operands: .Pp .Bl -tag -width SYSTEM_NAME +.It Fl d Ar destdir +Use +.Ar destdir +as the output directory, instead of the default one. Note +that config does not append +.Ar SYSTEM_NAME +to the directory given. .It Fl g Configure a system for debugging. .It Fl p @@ -104,8 +112,11 @@ represents one of the architectures supported by FreeBSD. .Nm Config creates the directory .Pa ../../compile/SYSTEM_NAME -as necessary and place all output files there. -If the directory already exists and the +or the one given with the +.Fl d +option +as necessary and places all output files there. +If the output directory already exists and the .Fl r flag was specified, it will be removed first. The output of @@ -222,7 +233,7 @@ list of files specific to .Em ERNIE system .It Pa /sys/compile/SYSTEM_NAME -kernel build directory for system +default kernel build directory for system .Pa SYSTEM_NAME . .El .Sh SEE ALSO diff --git a/usr.sbin/config/config.h b/usr.sbin/config/config.h index d1fdb3e..5b7eef7 100644 --- a/usr.sbin/config/config.h +++ b/usr.sbin/config/config.h @@ -41,8 +41,6 @@ #include <stdlib.h> #include <string.h> -#define NODEV ((dev_t)-1) - struct file_list { struct file_list *f_next; char *f_fn; /* the name */ @@ -177,6 +175,7 @@ extern int maxusers; extern int old_config_present; /* Old config/build directory still there */ extern char *PREFIX; /* Config file name - for error messages */ +extern char srcdir[]; /* root of the kernel source tree */ #define eq(a,b) (!strcmp(a,b)) #define ns(s) strdup(s) diff --git a/usr.sbin/config/config.y b/usr.sbin/config/config.y index 2a3d989..5c6d1da 100644 --- a/usr.sbin/config/config.y +++ b/usr.sbin/config/config.y @@ -5,6 +5,7 @@ } %token ANY +%token ARCH %token AT %token BUS %token COMMA @@ -23,7 +24,6 @@ %token IOMEM %token IOSIZ %token IRQ -%token MACHINE %token MAXUSERS %token MINUS %token NEXUS @@ -133,7 +133,7 @@ Spec: ; Config_spec: - MACHINE Save_id + ARCH Save_id = { if (!strcmp($2, "i386")) { machine = MACHINE_I386; diff --git a/usr.sbin/config/lang.l b/usr.sbin/config/lang.l index fe685ec..16c27ba 100644 --- a/usr.sbin/config/lang.l +++ b/usr.sbin/config/lang.l @@ -66,7 +66,7 @@ struct kt { { "iomem", IOMEM }, { "iosiz", IOSIZ }, { "irq", IRQ }, - { "machine", MACHINE }, + { "machine", ARCH }, /* MACHINE is defined in /sys/param.h */ { "makeoptions", MAKEOPTIONS }, { "maxusers", MAXUSERS }, { "nexus", NEXUS }, diff --git a/usr.sbin/config/main.c b/usr.sbin/config/main.c index 7c74a7f..fa6fe9f 100644 --- a/usr.sbin/config/main.c +++ b/usr.sbin/config/main.c @@ -49,6 +49,7 @@ static const char rcsid[] = #include <sys/stat.h> #include <sys/file.h> #include <sys/mman.h> +#include <sys/param.h> #include <ctype.h> #include <err.h> #include <stdio.h> @@ -65,14 +66,20 @@ static const char rcsid[] = #define FALSE (0) #endif +#define CDIR "../../compile/" + char * PREFIX; +char destdir[MAXPATHLEN]; +char srcdir[MAXPATHLEN]; + static int no_config_clobber = TRUE; int old_config_present; int debugging; int profiling; -static void usage __P((void)); static void configfile __P((void)); +static void get_srcdir __P((void)); +static void usage __P((void)); /* * Config builds a set of files for building a UNIX @@ -85,11 +92,17 @@ main(argc, argv) { struct stat buf; - int ch; + int ch, len; char *p; - while ((ch = getopt(argc, argv, "gprn")) != -1) + while ((ch = getopt(argc, argv, "d:gprn")) != -1) switch (ch) { + case 'd': + if (*destdir == '\0') + strcpy(destdir, optarg); + else + errx(2, "directory already set"); + break; case 'g': debugging++; break; @@ -117,6 +130,16 @@ main(argc, argv) if (freopen(PREFIX = *argv, "r", stdin) == NULL) err(2, "%s", PREFIX); + if (*destdir != '\0') { + len = strlen(destdir); + while (len > 1 && destdir[len - 1] == '/') + destdir[--len] = '\0'; + get_srcdir(); + } else { + strcpy(destdir, CDIR); + strcat(destdir, PREFIX); + } + p = path((char *)NULL); if (stat(p, &buf)) { if (mkdir(p, 0777)) @@ -164,8 +187,12 @@ main(argc, argv) */ { char xxx[80]; - - (void) snprintf(xxx, sizeof(xxx), "../../%s/include", machinename); + if (*srcdir == '\0') + (void)snprintf(xxx, sizeof(xxx), "../../%s/include", + machinename); + else + (void)snprintf(xxx, sizeof(xxx), "%s/%s/include", + srcdir, machinename); (void) symlink(xxx, path("machine")); } options(); /* make options .h files */ @@ -176,10 +203,34 @@ main(argc, argv) exit(0); } +/* + * get_srcdir + * determine the root of the kernel source tree + * and save that in srcdir. + */ +static void +get_srcdir() +{ + int i; + char *p; + + (void)getcwd(srcdir, sizeof(srcdir)); + for (i = 0; i < 2; i++) { + p = strrchr(srcdir, '/'); + if (p != NULL) + *p = '\0'; + } + + /* Sanity check */ + p = strrchr(srcdir, '/'); + if (p == NULL || strcmp(p + 1, "sys")) + errx(2, "non-standard kernel source tree"); +} + static void usage() { - fprintf(stderr, "usage: config [-gpr] sysname\n"); + fprintf(stderr, "usage: config [-gpr] [-d destdir] sysname\n"); exit(1); } @@ -302,11 +353,8 @@ path(file) { register char *cp; -#define CDIR "../../compile/" - cp = malloc((unsigned int)(sizeof(CDIR) + strlen(PREFIX) + - (file ? strlen(file) : 0) + 2)); - (void) strcpy(cp, CDIR); - (void) strcat(cp, PREFIX); + cp = malloc((size_t)(strlen(destdir) + (file ? strlen(file) : 0) + 2)); + (void) strcpy(cp, destdir); if (file) { (void) strcat(cp, "/"); (void) strcat(cp, file); diff --git a/usr.sbin/config/mkmakefile.c b/usr.sbin/config/mkmakefile.c index 1b80772..96f8610 100644 --- a/usr.sbin/config/mkmakefile.c +++ b/usr.sbin/config/mkmakefile.c @@ -181,6 +181,8 @@ makefile() fprintf(ofp, "PROF=-pg\n"); fprintf(ofp, "PROFLEVEL=%d\n", profiling); } + if (*srcdir != '\0') + fprintf(ofp,"S=%s\n", srcdir); while (fgets(line, BUFSIZ, ifp) != 0) { if (*line != '%') { fprintf(ofp, "%s", line); |