kconfig: implement KCONFIG_PROBABILITY for rand{,package}config
authorPeter Korsgaard <jacmet@sunsite.dk>
Fri, 23 Jul 2010 12:15:18 +0000 (14:15 +0200)
committerPeter Korsgaard <jacmet@sunsite.dk>
Fri, 23 Jul 2010 12:27:30 +0000 (14:27 +0200)
rand{,package}config enables configuration options with 50% probability,
which isn't always what we want in BR (because the "big" configs take a
long time to build and limits the chance of a randconfig detecting a
missing dependency), so introduce a KCONFIG_PROBABILITY environment
variable to tweak the probability between 0 (all options off) and 100
(all options on).

To use, simply set the environment variable before running make or pass
it on the make command line - E.G.

make randpackageconfig KCONFIG_PROBABILITY=10

Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
package/config/confdata.c

index 728f708ca20f66e3996a1f0467ee671619442053..38424702a9f0f56c45efbbf05b6ec165e1c661c3 100644 (file)
@@ -845,7 +845,16 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
        struct symbol *sym, *csym;
        struct property *prop;
        struct expr *e;
-       int i, cnt, def;
+       int i, cnt, def, prob = 50;
+
+       if (mode == def_random) {
+               char *endp, *env = getenv("KCONFIG_PROBABILITY");
+               if (env && *env) {
+                       int tmp = (int)strtol(env, &endp, 10);
+                       if (*endp == '\0' && tmp >= 0 && tmp <= 100)
+                               prob = tmp;
+               }
+       }
 
        for_all_symbols(i, sym) {
                if (sym_has_value(sym))
@@ -864,8 +873,15 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
                                sym->def[S_DEF_USER].tri = no;
                                break;
                        case def_random:
-                               cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
-                               sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
+                               cnt = (rand() % 100) - (100 - prob);
+                               if (cnt < 0)
+                                       sym->def[S_DEF_USER].tri = no;
+                               else
+                                       if ((sym_get_type(sym) == S_TRISTATE)
+                                           && (cnt > prob/2))
+                                               sym->def[S_DEF_USER].tri = mod;
+                                       else
+                                               sym->def[S_DEF_USER].tri = yes;
                                break;
                        default:
                                continue;