build: scripts/config - update to kconfig-v5.14
[openwrt/staging/noltari.git] / scripts / config / confdata.c
index cff8d4523192e61fddaf1de8a87e02a1e0914446..dad0b471c7df31ec1922a770c2222f84ea1ec762 100644 (file)
@@ -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);
-               }
-       }
-}