xref: /OK3568_Linux_fs/buildroot/support/kconfig/patches/14-support-out-of-tree-config.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun---
2*4882a593Smuzhiyun conf.c     |    1
3*4882a593Smuzhiyun confdata.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++---------------
4*4882a593Smuzhiyun util.c     |   16 +++++++++++++--
5*4882a593Smuzhiyun 3 files changed, 61 insertions(+), 18 deletions(-)
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunIndex: kconfig/conf.c
8*4882a593Smuzhiyun===================================================================
9*4882a593Smuzhiyun--- kconfig.orig/conf.c
10*4882a593Smuzhiyun+++ kconfig/conf.c
11*4882a593Smuzhiyun@@ -565,7 +565,6 @@ int main(int ac, char **av)
12*4882a593Smuzhiyun 	}
13*4882a593Smuzhiyun 	name = av[optind];
14*4882a593Smuzhiyun 	conf_parse(name);
15*4882a593Smuzhiyun-	//zconfdump(stdout);
16*4882a593Smuzhiyun 	if (sync_kconfig) {
17*4882a593Smuzhiyun 		name = conf_get_configname();
18*4882a593Smuzhiyun 		if (stat(name, &tmpstat)) {
19*4882a593SmuzhiyunIndex: kconfig/confdata.c
20*4882a593Smuzhiyun===================================================================
21*4882a593Smuzhiyun--- kconfig.orig/confdata.c
22*4882a593Smuzhiyun+++ kconfig/confdata.c
23*4882a593Smuzhiyun@@ -13,6 +13,7 @@
24*4882a593Smuzhiyun #include <string.h>
25*4882a593Smuzhiyun #include <time.h>
26*4882a593Smuzhiyun #include <unistd.h>
27*4882a593Smuzhiyun+#include <libgen.h>
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #include "lkc.h"
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun@@ -76,9 +77,7 @@ const char *conf_get_configname(void)
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun const char *conf_get_autoconfig_name(void)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun-	char *name = getenv("KCONFIG_AUTOCONFIG");
36*4882a593Smuzhiyun-
37*4882a593Smuzhiyun-	return name ? name : "include/config/auto.conf";
38*4882a593Smuzhiyun+	return getenv("KCONFIG_AUTOCONFIG");
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun static char *conf_expand_value(const char *in)
42*4882a593Smuzhiyun@@ -748,6 +747,9 @@ int conf_write(const char *name)
43*4882a593Smuzhiyun 	char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1];
44*4882a593Smuzhiyun 	char *env;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun+	if (!name)
47*4882a593Smuzhiyun+		name = conf_get_configname();
48*4882a593Smuzhiyun+
49*4882a593Smuzhiyun 	dirname[0] = 0;
50*4882a593Smuzhiyun 	if (name && name[0]) {
51*4882a593Smuzhiyun 		struct stat st;
52*4882a593Smuzhiyun@@ -842,6 +844,7 @@ static int conf_split_config(void)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun 	const char *name;
55*4882a593Smuzhiyun 	char path[PATH_MAX+1];
56*4882a593Smuzhiyun+	char *opwd, *dir, *_name;
57*4882a593Smuzhiyun 	char *s, *d, c;
58*4882a593Smuzhiyun 	struct symbol *sym;
59*4882a593Smuzhiyun 	struct stat sb;
60*4882a593Smuzhiyun@@ -851,8 +854,20 @@ static int conf_split_config(void)
61*4882a593Smuzhiyun 	conf_read_simple(name, S_DEF_AUTO);
62*4882a593Smuzhiyun 	sym_calc_value(modules_sym);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun-	if (chdir("include/config"))
65*4882a593Smuzhiyun-		return 1;
66*4882a593Smuzhiyun+	opwd = malloc(256);
67*4882a593Smuzhiyun+	_name = strdup(name);
68*4882a593Smuzhiyun+	if (opwd == NULL || _name == NULL)
69*4882a593Smuzhiyun+ 		return 1;
70*4882a593Smuzhiyun+	opwd = getcwd(opwd, 256);
71*4882a593Smuzhiyun+	dir = dirname(_name);
72*4882a593Smuzhiyun+	if (dir == NULL) {
73*4882a593Smuzhiyun+		res = 1;
74*4882a593Smuzhiyun+		goto err;
75*4882a593Smuzhiyun+	}
76*4882a593Smuzhiyun+	if (chdir(dir)) {
77*4882a593Smuzhiyun+		res = 1;
78*4882a593Smuzhiyun+		goto err;
79*4882a593Smuzhiyun+	}
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun 	res = 0;
82*4882a593Smuzhiyun 	for_all_symbols(i, sym) {
83*4882a593Smuzhiyun@@ -945,9 +960,11 @@ static int conf_split_config(void)
84*4882a593Smuzhiyun 		close(fd);
85*4882a593Smuzhiyun 	}
86*4882a593Smuzhiyun out:
87*4882a593Smuzhiyun-	if (chdir("../.."))
88*4882a593Smuzhiyun-		return 1;
89*4882a593Smuzhiyun-
90*4882a593Smuzhiyun+	if (chdir(opwd))
91*4882a593Smuzhiyun+		res = 1;
92*4882a593Smuzhiyun+err:
93*4882a593Smuzhiyun+	free(opwd);
94*4882a593Smuzhiyun+	free(_name);
95*4882a593Smuzhiyun 	return res;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun@@ -957,25 +974,38 @@ int conf_write_autoconf(void)
99*4882a593Smuzhiyun 	const char *name;
100*4882a593Smuzhiyun 	FILE *out, *tristate, *out_h;
101*4882a593Smuzhiyun 	int i;
102*4882a593Smuzhiyun+	char dir[PATH_MAX+1], buf[PATH_MAX+1];
103*4882a593Smuzhiyun+	char *s;
104*4882a593Smuzhiyun+
105*4882a593Smuzhiyun+	strcpy(dir, conf_get_configname());
106*4882a593Smuzhiyun+	s = strrchr(dir, '/');
107*4882a593Smuzhiyun+	if (s)
108*4882a593Smuzhiyun+		s[1] = 0;
109*4882a593Smuzhiyun+	else
110*4882a593Smuzhiyun+		dir[0] = 0;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun 	sym_clear_all_valid();
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun-	file_write_dep("include/config/auto.conf.cmd");
115*4882a593Smuzhiyun+	sprintf(buf, "%s.config.cmd", dir);
116*4882a593Smuzhiyun+	file_write_dep(buf);
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun 	if (conf_split_config())
119*4882a593Smuzhiyun 		return 1;
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun-	out = fopen(".tmpconfig", "w");
122*4882a593Smuzhiyun+	sprintf(buf, "%s.tmpconfig", dir);
123*4882a593Smuzhiyun+	out = fopen(buf, "w");
124*4882a593Smuzhiyun 	if (!out)
125*4882a593Smuzhiyun 		return 1;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun-	tristate = fopen(".tmpconfig_tristate", "w");
128*4882a593Smuzhiyun+	sprintf(buf, "%s.tmpconfig_tristate", dir);
129*4882a593Smuzhiyun+	tristate = fopen(buf, "w");
130*4882a593Smuzhiyun 	if (!tristate) {
131*4882a593Smuzhiyun 		fclose(out);
132*4882a593Smuzhiyun 		return 1;
133*4882a593Smuzhiyun 	}
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun-	out_h = fopen(".tmpconfig.h", "w");
136*4882a593Smuzhiyun+	sprintf(buf, "%s.tmpconfig.h", dir);
137*4882a593Smuzhiyun+	out_h = fopen(buf, "w");
138*4882a593Smuzhiyun 	if (!out_h) {
139*4882a593Smuzhiyun 		fclose(out);
140*4882a593Smuzhiyun 		fclose(tristate);
141*4882a593Smuzhiyun@@ -1007,19 +1037,22 @@ int conf_write_autoconf(void)
142*4882a593Smuzhiyun 	name = getenv("KCONFIG_AUTOHEADER");
143*4882a593Smuzhiyun 	if (!name)
144*4882a593Smuzhiyun 		name = "include/generated/autoconf.h";
145*4882a593Smuzhiyun-	if (rename(".tmpconfig.h", name))
146*4882a593Smuzhiyun+	sprintf(buf, "%s.tmpconfig.h", dir);
147*4882a593Smuzhiyun+	if (rename(buf, name))
148*4882a593Smuzhiyun 		return 1;
149*4882a593Smuzhiyun 	name = getenv("KCONFIG_TRISTATE");
150*4882a593Smuzhiyun 	if (!name)
151*4882a593Smuzhiyun 		name = "include/config/tristate.conf";
152*4882a593Smuzhiyun-	if (rename(".tmpconfig_tristate", name))
153*4882a593Smuzhiyun+	sprintf(buf, "%s.tmpconfig_tristate", dir);
154*4882a593Smuzhiyun+	if (rename(buf, name))
155*4882a593Smuzhiyun 		return 1;
156*4882a593Smuzhiyun 	name = conf_get_autoconfig_name();
157*4882a593Smuzhiyun 	/*
158*4882a593Smuzhiyun 	 * This must be the last step, kbuild has a dependency on auto.conf
159*4882a593Smuzhiyun 	 * and this marks the successful completion of the previous steps.
160*4882a593Smuzhiyun 	 */
161*4882a593Smuzhiyun-	if (rename(".tmpconfig", name))
162*4882a593Smuzhiyun+	sprintf(buf, "%s.tmpconfig", dir);
163*4882a593Smuzhiyun+	if (rename(buf, name))
164*4882a593Smuzhiyun 		return 1;
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun 	return 0;
167*4882a593SmuzhiyunIndex: kconfig/util.c
168*4882a593Smuzhiyun===================================================================
169*4882a593Smuzhiyun--- kconfig.orig/util.c
170*4882a593Smuzhiyun+++ kconfig/util.c
171*4882a593Smuzhiyun@@ -34,6 +34,8 @@ struct file *file_lookup(const char *nam
172*4882a593Smuzhiyun /* write a dependency file as used by kbuild to track dependencies */
173*4882a593Smuzhiyun int file_write_dep(const char *name)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun+	char *str;
176*4882a593Smuzhiyun+	char buf[PATH_MAX+1], buf2[PATH_MAX+1], dir[PATH_MAX+1];
177*4882a593Smuzhiyun 	struct symbol *sym, *env_sym;
178*4882a593Smuzhiyun 	struct expr *e;
179*4882a593Smuzhiyun 	struct file *file;
180*4882a593Smuzhiyun@@ -41,7 +43,16 @@ int file_write_dep(const char *name)
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun 	if (!name)
183*4882a593Smuzhiyun 		name = ".kconfig.d";
184*4882a593Smuzhiyun-	out = fopen("..config.tmp", "w");
185*4882a593Smuzhiyun+
186*4882a593Smuzhiyun+	strcpy(dir, conf_get_configname());
187*4882a593Smuzhiyun+	str = strrchr(dir, '/');
188*4882a593Smuzhiyun+	if (str)
189*4882a593Smuzhiyun+		str[1] = 0;
190*4882a593Smuzhiyun+	else
191*4882a593Smuzhiyun+		dir[0] = 0;
192*4882a593Smuzhiyun+
193*4882a593Smuzhiyun+	sprintf(buf, "%s..config.tmp", dir);
194*4882a593Smuzhiyun+	out = fopen(buf, "w");
195*4882a593Smuzhiyun 	if (!out)
196*4882a593Smuzhiyun 		return 1;
197*4882a593Smuzhiyun 	fprintf(out, "deps_config := \\\n");
198*4882a593Smuzhiyun@@ -72,7 +83,8 @@ int file_write_dep(const char *name)
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun 	fprintf(out, "\n$(deps_config): ;\n");
201*4882a593Smuzhiyun 	fclose(out);
202*4882a593Smuzhiyun-	rename("..config.tmp", name);
203*4882a593Smuzhiyun+	sprintf(buf2, "%s%s", dir, name);
204*4882a593Smuzhiyun+	rename(buf, buf2);
205*4882a593Smuzhiyun 	return 0;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208