diff options
Diffstat (limited to 'scripts/kconfig/confdata.c')
| -rw-r--r-- | scripts/kconfig/confdata.c | 277 | 
1 files changed, 47 insertions, 230 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 2568dbe16ed6..cf72680cd769 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -33,7 +33,7 @@ static bool is_dir(const char *path)  	struct stat st;  	if (stat(path, &st)) -		return 0; +		return false;  	return S_ISDIR(st.st_mode);  } @@ -130,19 +130,14 @@ static size_t depfile_prefix_len;  static int conf_touch_dep(const char *name)  {  	int fd, ret; -	const char *s; -	char *d, c; +	char *d; -	/* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ -	if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) +	/* check overflow: prefix + name + '\0' must fit in buffer. */ +	if (depfile_prefix_len + strlen(name) + 1 > sizeof(depfile_path))  		return -1;  	d = depfile_path + depfile_prefix_len; -	s = name; - -	while ((c = *s++)) -		*d++ = (c == '_') ? '/' : tolower(c); -	strcpy(d, ".h"); +	strcpy(d, name);  	/* Assume directory path already exists. */  	fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); @@ -360,28 +355,46 @@ int conf_read_simple(const char *name, int def)  	if (name) {  		in = zconf_fopen(name);  	} else { -		struct property *prop; +		char *env;  		name = conf_get_configname();  		in = zconf_fopen(name);  		if (in)  			goto load; -		sym_add_change_count(1); -		if (!sym_defconfig_list) +		conf_set_changed(true); + +		env = getenv("KCONFIG_DEFCONFIG_LIST"); +		if (!env)  			return 1; -		for_all_defaults(sym_defconfig_list, prop) { -			if (expr_calc_value(prop->visible.expr) == no || -			    prop->expr->type != E_SYMBOL) -				continue; -			sym_calc_value(prop->expr->left.sym); -			name = sym_get_string_value(prop->expr->left.sym); -			in = zconf_fopen(name); +		while (1) { +			bool is_last; + +			while (isspace(*env)) +				env++; + +			if (!*env) +				break; + +			p = env; +			while (*p && !isspace(*p)) +				p++; + +			is_last = (*p == '\0'); + +			*p = '\0'; + +			in = zconf_fopen(env);  			if (in) {  				conf_message("using defaults found in %s", -					 name); +					     env);  				goto load;  			} + +			if (is_last) +				break; + +			env = p + 1;  		}  	}  	if (!in) @@ -426,7 +439,7 @@ load:  			if (def == S_DEF_USER) {  				sym = sym_find(line + 2 + strlen(CONFIG_));  				if (!sym) { -					sym_add_change_count(1); +					conf_set_changed(true);  					continue;  				}  			} else { @@ -465,11 +478,11 @@ load:  					 * Reading from include/config/auto.conf  					 * If CONFIG_FOO previously existed in  					 * auto.conf but it is missing now, -					 * include/config/foo.h must be touched. +					 * include/config/FOO must be touched.  					 */  					conf_touch_dep(line + strlen(CONFIG_));  				else -					sym_add_change_count(1); +					conf_set_changed(true);  				continue;  			} @@ -517,7 +530,7 @@ int conf_read(const char *name)  	int conf_unsaved = 0;  	int i; -	sym_set_change_count(0); +	conf_set_changed(false);  	if (conf_read_simple(name, S_DEF_USER)) {  		sym_calc_value(modules_sym); @@ -575,7 +588,8 @@ int conf_read(const char *name)  		}  	} -	sym_add_change_count(conf_warnings || conf_unsaved); +	if (conf_warnings || conf_unsaved) +		conf_set_changed(true);  	return 0;  } @@ -920,7 +934,7 @@ next:  		if (is_same(name, tmpname)) {  			conf_message("No change to %s", name);  			unlink(tmpname); -			sym_set_change_count(0); +			conf_set_changed(false);  			return 0;  		} @@ -932,7 +946,7 @@ next:  	conf_message("configuration written to %s", name); -	sym_set_change_count(0); +	conf_set_changed(false);  	return 0;  } @@ -1100,26 +1114,20 @@ int conf_write_autoconf(int overwrite)  	return 0;  } -static int sym_change_count; +static bool conf_changed;  static void (*conf_changed_callback)(void); -void sym_set_change_count(int count) +void conf_set_changed(bool val)  { -	int _sym_change_count = sym_change_count; -	sym_change_count = count; -	if (conf_changed_callback && -	    (bool)_sym_change_count != (bool)count) +	if (conf_changed_callback && conf_changed != val)  		conf_changed_callback(); -} -void sym_add_change_count(int count) -{ -	sym_set_change_count(count + sym_change_count); +	conf_changed = val;  }  bool conf_get_changed(void)  { -	return sym_change_count; +	return conf_changed;  }  void conf_set_changed_callback(void (*fn)(void)) @@ -1127,54 +1135,6 @@ void conf_set_changed_callback(void (*fn)(void))  	conf_changed_callback = fn;  } -static bool randomize_choice_values(struct symbol *csym) -{ -	struct property *prop; -	struct symbol *sym; -	struct expr *e; -	int cnt, def; - -	/* -	 * If choice is mod then we may have more items selected -	 * and if no then no-one. -	 * In both cases stop. -	 */ -	if (csym->curr.tri != yes) -		return false; - -	prop = sym_get_choice_prop(csym); - -	/* count entries in choice block */ -	cnt = 0; -	expr_list_for_each_sym(prop->expr, e, sym) -		cnt++; - -	/* -	 * find a random value and set it to yes, -	 * set the rest to no so we have only one set -	 */ -	def = (rand() % cnt); - -	cnt = 0; -	expr_list_for_each_sym(prop->expr, e, sym) { -		if (def == cnt++) { -			sym->def[S_DEF_USER].tri = yes; -			csym->def[S_DEF_USER].val = sym; -		} -		else { -			sym->def[S_DEF_USER].tri = no; -		} -		sym->flags |= SYMBOL_DEF_USER; -		/* clear VALID to get value calculated */ -		sym->flags &= ~SYMBOL_VALID; -	} -	csym->flags |= SYMBOL_DEF_USER; -	/* clear VALID to get value calculated */ -	csym->flags &= ~(SYMBOL_VALID); - -	return true; -} -  void set_all_choice_values(struct symbol *csym)  {  	struct property *prop; @@ -1194,146 +1154,3 @@ void set_all_choice_values(struct symbol *csym)  	/* clear VALID to get value calculated */  	csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);  } - -bool conf_set_all_new_symbols(enum conf_def_mode mode) -{ -	struct symbol *sym, *csym; -	int i, cnt, pby, pty, ptm;	/* pby: probability of bool     = y -					 * pty: probability of tristate = y -					 * ptm: probability of tristate = m -					 */ - -	pby = 50; pty = ptm = 33; /* can't go as the default in switch-case -				   * below, otherwise gcc whines about -				   * -Wmaybe-uninitialized */ -	if (mode == def_random) { -		int n, p[3]; -		char *env = getenv("KCONFIG_PROBABILITY"); -		n = 0; -		while( env && *env ) { -			char *endp; -			int tmp = strtol( env, &endp, 10 ); -			if( tmp >= 0 && tmp <= 100 ) { -				p[n++] = tmp; -			} else { -				errno = ERANGE; -				perror( "KCONFIG_PROBABILITY" ); -				exit( 1 ); -			} -			env = (*endp == ':') ? endp+1 : endp; -			if( n >=3 ) { -				break; -			} -		} -		switch( n ) { -		case 1: -			pby = p[0]; ptm = pby/2; pty = pby-ptm; -			break; -		case 2: -			pty = p[0]; ptm = p[1]; pby = pty + ptm; -			break; -		case 3: -			pby = p[0]; pty = p[1]; ptm = p[2]; -			break; -		} - -		if( pty+ptm > 100 ) { -			errno = ERANGE; -			perror( "KCONFIG_PROBABILITY" ); -			exit( 1 ); -		} -	} -	bool has_changed = false; - -	for_all_symbols(i, sym) { -		if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID)) -			continue; -		switch (sym_get_type(sym)) { -		case S_BOOLEAN: -		case S_TRISTATE: -			has_changed = true; -			switch (mode) { -			case def_yes: -				sym->def[S_DEF_USER].tri = yes; -				break; -			case def_mod: -				sym->def[S_DEF_USER].tri = mod; -				break; -			case def_no: -				if (sym->flags & SYMBOL_ALLNOCONFIG_Y) -					sym->def[S_DEF_USER].tri = yes; -				else -					sym->def[S_DEF_USER].tri = no; -				break; -			case def_random: -				sym->def[S_DEF_USER].tri = no; -				cnt = rand() % 100; -				if (sym->type == S_TRISTATE) { -					if (cnt < pty) -						sym->def[S_DEF_USER].tri = yes; -					else if (cnt < (pty+ptm)) -						sym->def[S_DEF_USER].tri = mod; -				} else if (cnt < pby) -					sym->def[S_DEF_USER].tri = yes; -				break; -			default: -				continue; -			} -			if (!(sym_is_choice(sym) && mode == def_random)) -				sym->flags |= SYMBOL_DEF_USER; -			break; -		default: -			break; -		} - -	} - -	sym_clear_all_valid(); - -	/* -	 * We have different type of choice blocks. -	 * If curr.tri equals to mod then we can select several -	 * choice symbols in one block. -	 * In this case we do nothing. -	 * If curr.tri equals yes then only one symbol can be -	 * selected in a choice block and we set it to yes, -	 * and the rest to no. -	 */ -	if (mode != def_random) { -		for_all_symbols(i, csym) { -			if ((sym_is_choice(csym) && !sym_has_value(csym)) || -			    sym_is_choice_value(csym)) -				csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES; -		} -	} - -	for_all_symbols(i, csym) { -		if (sym_has_value(csym) || !sym_is_choice(csym)) -			continue; - -		sym_calc_value(csym); -		if (mode == def_random) -			has_changed |= randomize_choice_values(csym); -		else { -			set_all_choice_values(csym); -			has_changed = true; -		} -	} - -	return has_changed; -} - -void conf_rewrite_mod_or_yes(enum conf_def_mode mode) -{ -	struct symbol *sym; -	int i; -	tristate old_val = (mode == def_y2m) ? yes : mod; -	tristate new_val = (mode == def_y2m) ? mod : yes; - -	for_all_symbols(i, sym) { -		if (sym_get_type(sym) == S_TRISTATE && -		    sym->def[S_DEF_USER].tri == old_val) -			sym->def[S_DEF_USER].tri = new_val; -	} -	sym_clear_all_valid(); -}  |