aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/basic/Makefile6
-rw-r--r--scripts/basic/split-include.c226
-rw-r--r--scripts/kconfig/confdata.c121
-rw-r--r--scripts/kconfig/expr.h3
4 files changed, 123 insertions, 233 deletions
diff --git a/scripts/basic/Makefile b/scripts/basic/Makefile
index f22e94c3a2d1..2f60070f9733 100644
--- a/scripts/basic/Makefile
+++ b/scripts/basic/Makefile
@@ -1,17 +1,15 @@
1### 1###
2# Makefile.basic list the most basic programs used during the build process. 2# Makefile.basic list the most basic programs used during the build process.
3# The programs listed herein is what is needed to do the basic stuff, 3# 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.
5# This initial step is needed to avoid files to be recompiled 5# This initial step is needed to avoid files to be recompiled
6# when kernel configuration changes (which is what happens when 6# when kernel configuration changes (which is what happens when
7# .config is included by main Makefile. 7# .config is included by main Makefile.
8# --------------------------------------------------------------------------- 8# ---------------------------------------------------------------------------
9# fixdep: Used to generate dependency information during build process 9# 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/...
12# docproc: Used in Documentation/docbook 10# docproc: Used in Documentation/docbook
13 11
14hostprogs-y := fixdep split-include docproc 12hostprogs-y := fixdep docproc
15always := $(hostprogs-y) 13always := $(hostprogs-y)
16 14
17# fixdep is needed to compile other host programs 15# fixdep is needed to compile other host programs
diff --git a/scripts/basic/split-include.c b/scripts/basic/split-include.c
deleted file mode 100644
index 459c45276cb1..000000000000
--- a/scripts/basic/split-include.c
+++ /dev/null
@@ -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
44int 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}
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index ca693fcd023f..e28cd0c2ca08 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -5,6 +5,7 @@
5 5
6#include <sys/stat.h> 6#include <sys/stat.h>
7#include <ctype.h> 7#include <ctype.h>
8#include <fcntl.h>
8#include <stdio.h> 9#include <stdio.h>
9#include <stdlib.h> 10#include <stdlib.h>
10#include <string.h> 11#include <string.h>
@@ -520,6 +521,119 @@ int conf_write(const char *name)
520 return 0; 521 return 0;
521} 522}
522 523
524int 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 }
630out:
631 if (chdir("../.."))
632 return 1;
633
634 return res;
635}
636
523int conf_write_autoconf(void) 637int conf_write_autoconf(void)
524{ 638{
525 struct symbol *sym; 639 struct symbol *sym;
@@ -529,8 +643,13 @@ int conf_write_autoconf(void)
529 time_t now; 643 time_t now;
530 int i, l; 644 int i, l;
531 645
646 sym_clear_all_valid();
647
532 file_write_dep("include/config/auto.conf.cmd"); 648 file_write_dep("include/config/auto.conf.cmd");
533 649
650 if (conf_split_config())
651 return 1;
652
534 out = fopen(".tmpconfig", "w"); 653 out = fopen(".tmpconfig", "w");
535 if (!out) 654 if (!out)
536 return 1; 655 return 1;
@@ -558,8 +677,6 @@ int conf_write_autoconf(void)
558 "#define AUTOCONF_INCLUDED\n", 677 "#define AUTOCONF_INCLUDED\n",
559 sym_get_string_value(sym), ctime(&now)); 678 sym_get_string_value(sym), ctime(&now));
560 679
561 sym_clear_all_valid();
562
563 for_all_symbols(i, sym) { 680 for_all_symbols(i, sym) {
564 sym_calc_value(sym); 681 sym_calc_value(sym);
565 if (!(sym->flags & SYMBOL_WRITE) || !sym->name) 682 if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index 998cf4f656b8..ffd42c7007ee 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -65,6 +65,7 @@ enum symbol_type {
65 65
66enum { 66enum {
67 S_DEF_USER, /* main user value */ 67 S_DEF_USER, /* main user value */
68 S_DEF_AUTO,
68}; 69};
69 70
70struct symbol { 71struct symbol {
@@ -97,7 +98,7 @@ struct symbol {
97#define SYMBOL_WARNED 0x8000 98#define SYMBOL_WARNED 0x8000
98#define SYMBOL_DEF 0x10000 99#define SYMBOL_DEF 0x10000
99#define SYMBOL_DEF_USER 0x10000 100#define SYMBOL_DEF_USER 0x10000
100#define SYMBOL_DEF2 0x20000 101#define SYMBOL_DEF_AUTO 0x20000
101#define SYMBOL_DEF3 0x40000 102#define SYMBOL_DEF3 0x40000
102#define SYMBOL_DEF4 0x80000 103#define SYMBOL_DEF4 0x80000
103 104