Patch for config utility
John Baldwin
jhb at freebsd.org
Wed Apr 14 13:28:28 UTC 2010
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 <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
More information about the freebsd-embedded
mailing list