On Wednesday 14 April 2010 6:03:53 am Alexandr Rybalko wrote: > Hi All, > > I made a patch for the config utility, which enables execution of config outside of the kernel source tree. > The main purpose is to avoid large number of configuration files for many boards. > I work on D-Link DIR-320 device (Broadcom BCM5354) which must have more than 4 different profiles with different kernel > config files. > If every device have 3-5 configs (with different hints files), every chip have ~ 5-10 vendors (producing devices on this chip), > every chip family have 10-20 chips (BCM5354 is a BCM4700 family), and platform have 10-20 family's, so we get 40000 files in conf > directory of platform :)
I think the patch would be simpler if you set ksrcdir to "../.." initially. Then most of the conditionals can be collapsed as ksrcdir could always be used in the code. You could just use a simple boolean in the main() routine to warn about multiple -k options (or just let the last -k option win and not bother with a warning). > Index: mkoptions.c > =================================================================== > --- mkoptions.c (revision 206411) > +++ mkoptions.c (working copy) > @@ -294,7 +294,11 @@ read_options(void) > char genopt[MAXPATHLEN]; > > SLIST_INIT(&otab); > - (void) snprintf(fname, sizeof(fname), "../../conf/options"); > + if ( *ksrcdir != '\0' ) > + (void) snprintf(fname, sizeof(fname), "%s/conf/options", > + ksrcdir); > + else > + (void) snprintf(fname, sizeof(fname), "../../conf/options"); > openit: > fp = fopen(fname, "r"); > if (fp == 0) { > @@ -306,7 +310,12 @@ next: > (void) fclose(fp); > if (first == 1) { > first++; > - (void) snprintf(fname, sizeof fname, > "../../conf/options.%s", machinename); > + if ( *ksrcdir != '\0' ) > + (void) snprintf(fname, sizeof fname, > + "%s/conf/options.%s", ksrcdir, machinename); > + else > + (void) snprintf(fname, sizeof fname, > + "../../conf/options.%s", machinename); > fp = fopen(fname, "r"); > if (fp != 0) > goto next; > Index: main.c > =================================================================== > --- main.c (revision 206411) > +++ main.c (working copy) > @@ -72,6 +72,7 @@ static const char rcsid[] = > > char * PREFIX; > char destdir[MAXPATHLEN]; > +char ksrcdir[MAXPATHLEN]; > char srcdir[MAXPATHLEN]; > > int debugging; > @@ -110,8 +111,9 @@ main(int argc, char **argv) > char xxx[MAXPATHLEN]; > char *kernfile; > > + *ksrcdir = '\0'; > kernfile = NULL; > - while ((ch = getopt(argc, argv, "Cd:gpVx:")) != -1) > + while ((ch = getopt(argc, argv, "Cd:gk:pVx:")) != -1) > switch (ch) { > case 'C': > filebased = 1; > @@ -125,6 +127,12 @@ main(int argc, char **argv) > case 'g': > debugging++; > break; > + case 'k': > + if (*ksrcdir == '\0') > + strlcpy(ksrcdir, optarg, sizeof(ksrcdir)); > + else > + errx(EXIT_FAILURE, "Kernel ksrcdir already > set"); > + break; > case 'p': > profiling++; > break; > @@ -164,7 +172,8 @@ main(int argc, char **argv) > len = strlen(destdir); > while (len > 1 && destdir[len - 1] == '/') > destdir[--len] = '\0'; > - get_srcdir(); > + if (*ksrcdir == '\0') > + get_srcdir(); > } else { > strlcpy(destdir, CDIR, sizeof(destdir)); > strlcat(destdir, PREFIX, sizeof(destdir)); > @@ -210,11 +219,14 @@ main(int argc, char **argv) > * for "sys" (to make genassym.c work along with #include <sys/xxx>) > * and similarly for "machine". > */ > - if (*srcdir == '\0') > - (void)snprintf(xxx, sizeof(xxx), "../../include"); > - else > + if (*ksrcdir != '\0') > (void)snprintf(xxx, sizeof(xxx), "%s/%s/include", > + ksrcdir, machinename); > + else if (*srcdir != '\0') > + (void)snprintf(xxx, sizeof(xxx), "%s/%s/include", > srcdir, machinename); > + else > + (void)snprintf(xxx, sizeof(xxx), "../../include"); > (void) unlink(path("machine")); > (void) symlink(xxx, path("machine")); > if (strcmp(machinename, machinearch) != 0) { > @@ -222,12 +234,15 @@ main(int argc, char **argv) > * make symbolic links in compilation directory for > * machinearch, if it is different than machinename. > */ > - if (*srcdir == '\0') > + if (*ksrcdir != '\0') > + (void)snprintf(xxx, sizeof(xxx), "%s/%s/include", > + ksrcdir, machinearch); > + else if (*srcdir != '\0') > + (void)snprintf(xxx, sizeof(xxx), "%s/%s/include", > + srcdir, machinearch); > + else > (void)snprintf(xxx, sizeof(xxx), "../../../%s/include", > machinearch); > - else > - (void)snprintf(xxx, sizeof(xxx), "%s/%s/include", > - srcdir, machinearch); > (void) unlink(path(machinearch)); > (void) symlink(xxx, path(machinearch)); > } > @@ -278,7 +293,7 @@ static void > usage(void) > { > > - fprintf(stderr, "usage: config [-CgpV] [-d destdir] sysname\n"); > + fprintf(stderr, "usage: config [-CgpV] [-k srcdir] [-d destdir] sysname\n"); > fprintf(stderr, " config -x kernel\n"); > exit(EX_USAGE); > } > Index: mkmakefile.c > =================================================================== > --- mkmakefile.c (revision 206411) > +++ mkmakefile.c (working copy) > @@ -116,7 +116,12 @@ makefile(void) > int versreq; > > read_files(); > - snprintf(line, sizeof(line), "../../conf/Makefile.%s", machinename); > + if (*ksrcdir != '\0') > + snprintf(line, sizeof(line), "%s/conf/Makefile.%s", > + ksrcdir, machinename); > + else > + snprintf(line, sizeof(line), "../../conf/Makefile.%s", > + machinename); > ifp = fopen(line, "r"); > if (ifp == 0) { > snprintf(line, sizeof(line), "Makefile.%s", machinename); > @@ -139,7 +144,9 @@ makefile(void) > fprintf(ofp, "DEBUG=-g\n"); > if (profiling) > fprintf(ofp, "PROFLEVEL=%d\n", profiling); > - if (*srcdir != '\0') > + if (*ksrcdir != '\0') > + fprintf(ofp,"S=%s\n", ksrcdir); > + else if (*srcdir != '\0') > fprintf(ofp,"S=%s\n", srcdir); > while (fgets(line, BUFSIZ, ifp) != 0) { > if (*line != '%') { > @@ -347,7 +354,12 @@ next: > printf("%s: missing include filename.\n", fname); > exit(1); > } > - (void) snprintf(ifname, sizeof(ifname), "../../%s", wd); > + if (*ksrcdir != '\0') > + (void) snprintf(ifname, sizeof(ifname), "%s/%s", > + ksrcdir, wd); > + else > + (void) snprintf(ifname, sizeof(ifname), "../../%s", > + wd); > read_file(ifname); > while (((wd = get_word(fp)) != (char *)EOF) && wd) > ; > @@ -544,9 +556,17 @@ read_files(void) > char fname[MAXPATHLEN]; > struct files_name *nl, *tnl; > > - (void) snprintf(fname, sizeof(fname), "../../conf/files"); > + if (*ksrcdir != '\0') > + (void) snprintf(fname, sizeof(fname), "%s/conf/files", > + ksrcdir); > + else > + (void) snprintf(fname, sizeof(fname), "../../conf/files"); > read_file(fname); > - (void) snprintf(fname, sizeof(fname), > + if (*ksrcdir != '\0') > + (void) snprintf(fname, sizeof(fname), > + "%s/conf/files.%s", ksrcdir, machinename); > + else > + (void) snprintf(fname, sizeof(fname), > "../../conf/files.%s", machinename); > read_file(fname); > for (nl = STAILQ_FIRST(&fntab); nl != NULL; nl = tnl) { > Index: config.8 > =================================================================== > --- config.8 (revision 206411) > +++ config.8 (working copy) > @@ -38,6 +38,7 @@ > .Nm > .Op Fl CVgp > .Op Fl d Ar destdir > +.Op Fl k Ar ksrcdir > .Ar SYSTEM_NAME > .Nm > .Op Fl x Ar kernel > @@ -78,6 +79,10 @@ Note that > does not append > .Ar SYSTEM_NAME > to the directory given. > +.It Fl k Ar ksrcdir > +Use > +.Ar ksrcdir > +as the kernel source tree directory, instead of the default one. > .It Fl g > Configure a system for debugging. > .It Fl x Ar kernel > Index: config.h > =================================================================== > --- config.h (revision 206411) > +++ config.h (working copy) > @@ -196,6 +196,8 @@ extern int maxusers; > > extern char *PREFIX; /* Config file name - for error messages */ > extern char srcdir[]; /* root of the kernel source tree */ > +extern char ksrcdir[]; /* root of the kernel source tree > + * set by -k flag */ > > #define eq(a,b) (!strcmp(a,b)) > #define ns(s) strdup(s) > Index: lang.l > =================================================================== > --- lang.l (revision 206411) > +++ lang.l (working copy) > @@ -259,7 +259,10 @@ include(const char *fname, int ateof) > fnamebuf = NULL; > fp = fopen(fname, "r"); > if (fp == NULL && fname[0] != '.' && fname[0] != '/') { > - asprintf(&fnamebuf, "../../conf/%s", fname); > + if (*ksrcdir != '\0') > + asprintf(&fnamebuf, "%s/conf/%s", ksrcdir, fname); > + else > + asprintf(&fnamebuf, "../../conf/%s", fname); > if (fnamebuf != NULL) { > fp = fopen(fnamebuf, "r"); > free(fnamebuf); > > > -- > Alexandr Rybalko <r...@dlink.ua> > aka Alex RAY <r...@ddteam.net> > _______________________________________________ > freebsd-hackers@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers > To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org" > -- John Baldwin _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"