Patch for config utility
Alexandr Rybalko
ray at dlink.ua
Wed Apr 14 13:46:00 UTC 2010
On Wed, 14 Apr 2010 09:06:28 -0400
John Baldwin <jhb at freebsd.org> wrote:
>> 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).
Thanks for review.
I try to use more simplify, using existing srcdir variable, but in some places I get problem with full and relative paths, so I
add different variable with full path to kernel source tree.
>>
>> > 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 <ray at dlink.ua>
>> > aka Alex RAY <ray at ddteam.net>
>> > _______________________________________________
>> > freebsd-hackers at freebsd.org mailing list
>> > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>> > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>> >
>>
>> --
>> John Baldwin
--
Alexandr Rybalko <ray at dlink.ua>
aka Alex RAY <ray at ddteam.net>
More information about the freebsd-hackers
mailing list