build: scripts/config - update to kconfig-v5.14
Functional Changes ---------- ------- - make 'imply' not impose any restrictions: allow symbols implied by y to become m - change "modules" from sub-option to first-level attribute Bugfixes -------- - nconf: fix core dump when searching in empty menu - nconf: stop endless search loops - xconfig: fix content of the main widget - xconfig: fix support for the split view mode Other Changes ----- ------- - highlight xconfig 'comment' lines with '***' - xconfig: navigate menus on hyperlinks - xconfig: drop support for Qt4 - improve host ncurses detection Update the 'option modules' usage to just 'modules' in Config.in. Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
This commit is contained in:
committed by
Petr Štetiar
parent
73ea763c0d
commit
009293c52e
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
@@ -32,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);
|
||||
}
|
||||
@@ -129,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);
|
||||
@@ -384,28 +380,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)
|
||||
@@ -434,7 +448,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 {
|
||||
@@ -470,11 +484,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;
|
||||
}
|
||||
|
||||
@@ -519,7 +533,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);
|
||||
@@ -577,7 +591,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;
|
||||
}
|
||||
@@ -922,7 +937,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;
|
||||
}
|
||||
|
||||
@@ -934,7 +949,7 @@ next:
|
||||
|
||||
conf_message("configuration written to %s", name);
|
||||
|
||||
sym_set_change_count(0);
|
||||
conf_set_changed(false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1105,26 +1120,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))
|
||||
@@ -1132,54 +1141,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;
|
||||
@@ -1199,147 +1160,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;
|
||||
|
||||
sym_clear_all_valid();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* 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_add_change_count(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user