summaryrefslogblamecommitdiffstats
path: root/support/kconfig/patches/14-support-out-of-tree-config.patch
blob: 9fa6384d315d7dac6ac31a4c4cbfa06cf14d470f (plain) (tree)
1
2
3
4
5
6
7
8
   
                   
                                                                                
                                  
                                                   
 
                    
                                                                   


                      




                            


                                             
                                                                   

                          
                 
 




                                                        
                                            

  
                                               
                   








                                             
                   
  
                         
                              



                                 
                    
                                          


                                           
                         


                                          
                         












                                 
                    













                           
                     
                                     
                   
              
























                                                       







                                                     




                                            
                                 
                     

                                            
                                                      



                                            







                                                      









                                                                           
                    
                                                                   

                      
                   







                                                                      
                    
















                                            
                   








                                              
---
 conf.c     |    1 
 confdata.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++---------------
 util.c     |   16 +++++++++++++--
 3 files changed, 61 insertions(+), 18 deletions(-)

Index: config/conf.c
===================================================================
--- config.orig/conf.c
+++ config/conf.c
@@ -503,7 +503,6 @@
 	}
 	name = av[optind];
 	conf_parse(name);
-	//zconfdump(stdout);
 	if (sync_kconfig) {
 		name = conf_get_configname();
 		if (stat(name, &tmpstat)) {
Index: config/confdata.c
===================================================================
--- config.orig/confdata.c
+++ config/confdata.c
@@ -71,9 +71,7 @@
 
 const char *conf_get_autoconfig_name(void)
 {
-	char *name = getenv("KCONFIG_AUTOCONFIG");
-
-	return name ? name : "include/config/auto.conf";
+	return getenv("KCONFIG_AUTOCONFIG");
 }
 
 static char *conf_expand_value(const char *in)
@@ -565,6 +563,9 @@
 	int use_timestamp = 1;
 	char *env;
 
+	if (!name)
+		name = conf_get_configname();
+
 	dirname[0] = 0;
 	if (name && name[0]) {
 		struct stat st;
@@ -671,6 +672,7 @@
 {
 	const char *name;
 	char path[PATH_MAX+1];
+	char *opwd, *dir, *_name;
 	char *s, *d, c;
 	struct symbol *sym;
 	struct stat sb;
@@ -679,8 +681,20 @@
 	name = conf_get_autoconfig_name();
 	conf_read_simple(name, S_DEF_AUTO);
 
-	if (chdir("include/config"))
-		return 1;
+	opwd = malloc(256);
+	_name = strdup(name);
+	if (opwd == NULL || _name == NULL)
+ 		return 1;
+	opwd = getcwd(opwd, 256);
+	dir = dirname(_name);
+	if (dir == NULL) {
+		res = 1;
+		goto err;
+	}
+	if (chdir(dir)) {
+		res = 1;
+		goto err;
+	}
 
 	res = 0;
 	for_all_symbols(i, sym) {
@@ -773,9 +787,11 @@
 		close(fd);
 	}
 out:
-	if (chdir("../.."))
-		return 1;
-
+	if (chdir(opwd))
+		res = 1;
+err:
+	free(opwd);
+	free(_name);
 	return res;
 }
 
@@ -787,25 +803,38 @@
 	FILE *out, *tristate, *out_h;
 	time_t now;
 	int i;
+	char dir[PATH_MAX+1], buf[PATH_MAX+1];
+	char *s;
+
+	strcpy(dir, conf_get_configname());
+	s = strrchr(dir, '/');
+	if (s)
+		s[1] = 0;
+	else
+		dir[0] = 0;
 
 	sym_clear_all_valid();
 
-	file_write_dep("include/config/auto.conf.cmd");
+	sprintf(buf, "%s.config.cmd", dir);
+	file_write_dep(buf);
 
 	if (conf_split_config())
 		return 1;
 
-	out = fopen(".tmpconfig", "w");
+	sprintf(buf, "%s.tmpconfig", dir);
+	out = fopen(buf, "w");
 	if (!out)
 		return 1;
 
-	tristate = fopen(".tmpconfig_tristate", "w");
+	sprintf(buf, "%s.tmpconfig_tristate", dir);
+	tristate = fopen(buf, "w");
 	if (!tristate) {
 		fclose(out);
 		return 1;
 	}
 
-	out_h = fopen(".tmpconfig.h", "w");
+	sprintf(buf, "%s.tmpconfig.h", dir);
+	out_h = fopen(buf, "w");
 	if (!out_h) {
 		fclose(out);
 		fclose(tristate);
@@ -885,19 +914,22 @@
 	name = getenv("KCONFIG_AUTOHEADER");
 	if (!name)
 		name = "include/generated/autoconf.h";
-	if (rename(".tmpconfig.h", name))
+	sprintf(buf, "%s.tmpconfig.h", dir);
+	if (rename(buf, name))
 		return 1;
 	name = getenv("KCONFIG_TRISTATE");
 	if (!name)
 		name = "include/config/tristate.conf";
-	if (rename(".tmpconfig_tristate", name))
+	sprintf(buf, "%s.tmpconfig_tristate", dir);
+	if (rename(buf, name))
 		return 1;
 	name = conf_get_autoconfig_name();
 	/*
 	 * This must be the last step, kbuild has a dependency on auto.conf
 	 * and this marks the successful completion of the previous steps.
 	 */
-	if (rename(".tmpconfig", name))
+	sprintf(buf, "%s.tmpconfig", dir);
+	if (rename(buf, name))
 		return 1;
 
 	return 0;
Index: config/util.c
===================================================================
--- config.orig/util.c
+++ config/util.c
@@ -147,6 +147,8 @@
 /* write a dependency file as used by kbuild to track dependencies */
 int file_write_dep(const char *name)
 {
+	char *str;
+	char buf[PATH_MAX+1], buf2[PATH_MAX+1], dir[PATH_MAX+1];
 	struct symbol *sym, *env_sym;
 	struct expr *e;
 	struct file *file;
@@ -154,7 +156,16 @@
 
 	if (!name)
 		name = ".kconfig.d";
-	out = fopen("..config.tmp", "w");
+
+	strcpy(dir, conf_get_configname());
+	str = strrchr(dir, '/');
+	if (str)
+		str[1] = 0;
+	else
+		dir[0] = 0;
+
+	sprintf(buf, "%s..config.tmp", dir);
+	out = fopen(buf, "w");
 	if (!out)
 		return 1;
 	fprintf(out, "deps_config := \\\n");
@@ -185,7 +196,8 @@
 
 	fprintf(out, "\n$(deps_config): ;\n");
 	fclose(out);
-	rename("..config.tmp", name);
+	sprintf(buf2, "%s%s", dir, name);
+	rename(buf, buf2);
 	return write_make_deps(NULL);
 }