History

kconfig: integrate split config into silentoldconfig

Now that kconfig can load multiple configurations, it becomes simple to integrate the split config step, by simply comparing the new .config file with the old auto.conf (and then saving the new auto.conf). A nice side effect is that this saves a bit of disk space and cache, as no data needs to be read from or saved into the splitted config files anymore (e.g. include/config is now 648KB instead of 5.2MB).

Roman Zippel committed 20 years ago

Commit 2e3646e1 parent 669bfad8 files · +129 −246Browse files

Showing the changes to scripts (4 of 8 files). Show all

Unified · Split

4 files
  1. scripts/basic/Makefile +2 −4
  2. scripts/basic/split-include.c +0 −226
  3. scripts/kconfig/confdata.c +119 −2
  4. scripts/kconfig/expr.h +2 −1
scripts/basic/Makefile+2−4
@@ -1,17 +1,15 @@
11 ###
22 # Makefile.basic list the most basic programs used during the build process.
33 # The programs listed herein is what is needed to do the basic stuff,
4−# such as splitting .config and fix dependency file.
4+# such as fix dependency file.
55 # This initial step is needed to avoid files to be recompiled
66 # when kernel configuration changes (which is what happens when
77 # .config is included by main Makefile.
88 # ---------------------------------------------------------------------------
99 # fixdep: Used to generate dependency information during build process
10−# split-include: Divide all config symbols up in a number of files in
11−# include/config/...
1210 # docproc: Used in Documentation/docbook
1311
14−hostprogs-y := fixdep split-include docproc
12+hostprogs-y := fixdep docproc
1513 always := $(hostprogs-y)
1614
1715 # fixdep is needed to compile other host programs
scripts/basic/split-include.c+0−226
@@ -1,226 +0,0 @@
1−/*
2− * split-include.c
3− *
4− * Copyright abandoned, Michael Chastain, <mailto:mec@shout.net>.
5− * This is a C version of syncdep.pl by Werner Almesberger.
6− *
7− * This program takes autoconf.h as input and outputs a directory full
8− * of one-line include files, merging onto the old values.
9− *
10− * Think of the configuration options as key-value pairs. Then there
11− * are five cases:
12− *
13− * key old value new value action
14− *
15− * KEY-1 VALUE-1 VALUE-1 leave file alone
16− * KEY-2 VALUE-2A VALUE-2B write VALUE-2B into file
17− * KEY-3 - VALUE-3 write VALUE-3 into file
18− * KEY-4 VALUE-4 - write an empty file
19− * KEY-5 (empty) - leave old empty file alone
20− */
21−
22−#include <sys/stat.h>
23−#include <sys/types.h>
24−
25−#include <ctype.h>
26−#include <errno.h>
27−#include <fcntl.h>
28−#include <stdio.h>
29−#include <stdlib.h>
30−#include <string.h>
31−#include <unistd.h>
32−
33−#define ERROR_EXIT(strExit) \
34− { \
35− const int errnoSave = errno; \
36− fprintf(stderr, "%s: ", str_my_name); \
37− errno = errnoSave; \
38− perror((strExit)); \
39− exit(1); \
40− }
41−
42−
43−
44−int main(int argc, const char * argv [])
45−{
46− const char * str_my_name;
47− const char * str_file_autoconf;
48− const char * str_dir_config;
49−
50− FILE * fp_config;
51− FILE * fp_target;
52− FILE * fp_find;
53−
54− int buffer_size;
55−
56− char * line;
57− char * old_line;
58− char * list_target;
59− char * ptarget;
60−
61− struct stat stat_buf;
62−
63− /* Check arg count. */
64− if (argc != 3)
65− {
66− fprintf(stderr, "%s: wrong number of arguments.\n", argv[0]);
67− exit(1);
68− }
69−
70− str_my_name = argv[0];
71− str_file_autoconf = argv[1];
72− str_dir_config = argv[2];
73−
74− /* Find a buffer size. */
75− if (stat(str_file_autoconf, &stat_buf) != 0)
76− ERROR_EXIT(str_file_autoconf);
77− buffer_size = 2 * stat_buf.st_size + 4096;
78−
79− /* Allocate buffers. */
80− if ( (line = malloc(buffer_size)) == NULL
81− || (old_line = malloc(buffer_size)) == NULL
82− || (list_target = malloc(buffer_size)) == NULL )
83− ERROR_EXIT(str_file_autoconf);
84−
85− /* Open autoconfig file. */
86− if ((fp_config = fopen(str_file_autoconf, "r")) == NULL)
87− ERROR_EXIT(str_file_autoconf);
88−
89− /* Make output directory if needed. */
90− if (stat(str_dir_config, &stat_buf) != 0)
91− {
92− if (mkdir(str_dir_config, 0755) != 0)
93− ERROR_EXIT(str_dir_config);
94− }
95−
96− /* Change to output directory. */
97− if (chdir(str_dir_config) != 0)
98− ERROR_EXIT(str_dir_config);
99−
100− /* Put initial separator into target list. */
101− ptarget = list_target;
102− *ptarget++ = '\n';
103−
104− /* Read config lines. */
105− while (fgets(line, buffer_size, fp_config))
106− {
107− const char * str_config;
108− int is_same;
109− int itarget;
110−
111− if (line[0] != '#')
112− continue;
113− if ((str_config = strstr(line, "CONFIG_")) == NULL)
114− continue;
115−
116− /* Make the output file name. */
117− str_config += sizeof("CONFIG_") - 1;
118− for (itarget = 0; !isspace(str_config[itarget]); itarget++)
119− {
120− int c = (unsigned char) str_config[itarget];
121− if (isupper(c)) c = tolower(c);
122− if (c == '_') c = '/';
123− ptarget[itarget] = c;
124− }
125− ptarget[itarget++] = '.';
126− ptarget[itarget++] = 'h';
127− ptarget[itarget++] = '\0';
128−
129− /* Check for existing file. */
130− is_same = 0;
131− if ((fp_target = fopen(ptarget, "r")) != NULL)
132− {
133− fgets(old_line, buffer_size, fp_target);
134− if (fclose(fp_target) != 0)
135− ERROR_EXIT(ptarget);
136− if (!strcmp(line, old_line))
137− is_same = 1;
138− }
139−
140− if (!is_same)
141− {
142− /* Auto-create directories. */
143− int islash;
144− for (islash = 0; islash < itarget; islash++)
145− {
146− if (ptarget[islash] == '/')
147− {
148− ptarget[islash] = '\0';
149− if (stat(ptarget, &stat_buf) != 0
150− && mkdir(ptarget, 0755) != 0)
151− ERROR_EXIT( ptarget );
152− ptarget[islash] = '/';
153− }
154− }
155−
156− /* Write the file. */
157− if ((fp_target = fopen(ptarget, "w" )) == NULL)
158− ERROR_EXIT(ptarget);
159− fputs(line, fp_target);
160− if (ferror(fp_target) || fclose(fp_target) != 0)
161− ERROR_EXIT(ptarget);
162− }
163−
164− /* Update target list */
165− ptarget += itarget;
166− *(ptarget-1) = '\n';
167− }
168−
169− /*
170− * Close autoconfig file.
171− * Terminate the target list.
172− */
173− if (fclose(fp_config) != 0)
174− ERROR_EXIT(str_file_autoconf);
175− *ptarget = '\0';
176−
177− /*
178− * Fix up existing files which have no new value.
179− * This is Case 4 and Case 5.
180− *
181− * I re-read the tree and filter it against list_target.
182− * This is crude. But it avoids data copies. Also, list_target
183− * is compact and contiguous, so it easily fits into cache.
184− *
185− * Notice that list_target contains strings separated by \n,
186− * with a \n before the first string and after the last.
187− * fgets gives the incoming names a terminating \n.
188− * So by having an initial \n, strstr will find exact matches.
189− */
190−
191− fp_find = popen("find * -type f -name \"*.h\" -print", "r");
192− if (fp_find == 0)
193− ERROR_EXIT( "find" );
194−
195− line[0] = '\n';
196− while (fgets(line+1, buffer_size, fp_find))
197− {
198− if (strstr(list_target, line) == NULL)
199− {
200− /*
201− * This is an old file with no CONFIG_* flag in autoconf.h.
202− */
203−
204− /* First strip the \n. */
205− line[strlen(line)-1] = '\0';
206−
207− /* Grab size. */
208− if (stat(line+1, &stat_buf) != 0)
209− ERROR_EXIT(line);
210−
211− /* If file is not empty, make it empty and give it a fresh date. */
212− if (stat_buf.st_size != 0)
213− {
214− if ((fp_target = fopen(line+1, "w")) == NULL)
215− ERROR_EXIT(line);
216− if (fclose(fp_target) != 0)
217− ERROR_EXIT(line);
218− }
219− }
220− }
221−
222− if (pclose(fp_find) != 0)
223− ERROR_EXIT("find");
224−
225− return 0;
226−}
scripts/kconfig/confdata.c+119−2
@@ -5,6 +5,7 @@ · 4 unmodified lines
55
66 #include <sys/stat.h>
77 #include <ctype.h>
8+#include <fcntl.h>
89 #include <stdio.h>
910 #include <stdlib.h>
1011 #include <string.h>
@@ -520,6 +521,119 @@ int conf_write(const char *name) · 509 unmodified lines
520521 return 0;
521522 }
522523
524+int conf_split_config(void)
525+{
526+ char *name, path[128];
527+ char *s, *d, c;
528+ struct symbol *sym;
529+ struct stat sb;
530+ int res, i, fd;
531+
532+ name = getenv("KCONFIG_AUTOCONFIG");
533+ if (!name)
534+ name = "include/config/auto.conf";
535+ conf_read_simple(name, S_DEF_AUTO);
536+
537+ if (chdir("include/config"))
538+ return 1;
539+
540+ res = 0;
541+ for_all_symbols(i, sym) {
542+ sym_calc_value(sym);
543+ if ((sym->flags & SYMBOL_AUTO) || !sym->name)
544+ continue;
545+ if (sym->flags & SYMBOL_WRITE) {
546+ if (sym->flags & SYMBOL_DEF_AUTO) {
547+ /*
548+ * symbol has old and new value,
549+ * so compare them...
550+ */
551+ switch (sym->type) {
552+ case S_BOOLEAN:
553+ case S_TRISTATE:
554+ if (sym_get_tristate_value(sym) ==
555+ sym->def[S_DEF_AUTO].tri)
556+ continue;
557+ break;
558+ case S_STRING:
559+ case S_HEX:
560+ case S_INT:
561+ if (!strcmp(sym_get_string_value(sym),
562+ sym->def[S_DEF_AUTO].val))
563+ continue;
564+ break;
565+ default:
566+ break;
567+ }
568+ } else {
569+ /*
570+ * If there is no old value, only 'no' (unset)
571+ * is allowed as new value.
572+ */
573+ switch (sym->type) {
574+ case S_BOOLEAN:
575+ case S_TRISTATE:
576+ if (sym_get_tristate_value(sym) == no)
577+ continue;
578+ break;
579+ default:
580+ break;
581+ }
582+ }
583+ } else if (!(sym->flags & SYMBOL_DEF_AUTO))
584+ /* There is neither an old nor a new value. */
585+ continue;
586+ /* else
587+ * There is an old value, but no new value ('no' (unset)
588+ * isn't saved in auto.conf, so the old value is always
589+ * different from 'no').
590+ */
591+
592+ /* Replace all '_' and append ".h" */
593+ s = sym->name;
594+ d = path;
595+ while ((c = *s++)) {
596+ c = tolower(c);
597+ *d++ = (c == '_') ? '/' : c;
598+ }
599+ strcpy(d, ".h");
600+
601+ /* Assume directory path already exists. */
602+ fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
603+ if (fd == -1) {
604+ if (errno != ENOENT) {
605+ res = 1;
606+ break;
607+ }
608+ /*
609+ * Create directory components,
610+ * unless they exist already.
611+ */
612+ d = path;
613+ while ((d = strchr(d, '/'))) {
614+ *d = 0;
615+ if (stat(path, &sb) && mkdir(path, 0755)) {
616+ res = 1;
617+ goto out;
618+ }
619+ *d++ = '/';
620+ }
621+ /* Try it again. */
622+ fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
623+ if (fd == -1) {
624+ res = 1;
625+ break;
626+ }
627+ }
628+ close(fd);
629+ }
630+out:
631+ if (chdir("../.."))
632+ return 1;
633+
634+ return res;
635+}
636+
523637 int conf_write_autoconf(void)
524638 {
525639 struct symbol *sym;
@@ -529,8 +643,13 @@ int conf_write_autoconf(void) · 3 unmodified lines
529643 time_t now;
530644 int i, l;
531645
646+ sym_clear_all_valid();
647+
532648 file_write_dep("include/config/auto.conf.cmd");
533649
650+ if (conf_split_config())
651+ return 1;
652+
534653 out = fopen(".tmpconfig", "w");
535654 if (!out)
536655 return 1;
@@ -558,8 +677,6 @@ int conf_write_autoconf(void) · 21 unmodified lines
558677 "#define AUTOCONF_INCLUDED\n",
559678 sym_get_string_value(sym), ctime(&now));
560679
561− sym_clear_all_valid();
562−
563680 for_all_symbols(i, sym) {
564681 sym_calc_value(sym);
565682 if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
scripts/kconfig/expr.h+2−1
@@ -65,6 +65,7 @@ enum symbol_type { · 64 unmodified lines
6565
6666 enum {
6767 S_DEF_USER, /* main user value */
68+ S_DEF_AUTO,
6869 };
6970
7071 struct symbol {
@@ -97,7 +98,7 @@ struct symbol { · 26 unmodified lines
9798 #define SYMBOL_WARNED 0x8000
9899 #define SYMBOL_DEF 0x10000
99100 #define SYMBOL_DEF_USER 0x10000
100−#define SYMBOL_DEF2 0x20000
101+#define SYMBOL_DEF_AUTO 0x20000
101102 #define SYMBOL_DEF3 0x40000
102103 #define SYMBOL_DEF4 0x80000
103104

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t