kconfig: Add option to get the full help text with listnewconfig
[carl9170fw.git] / config / conf.c
index 89d87de2c93b8acb2d1c976d7f1c2edaa6ab77d5..5f1758c73ccf1762114c542ce08bbd5340822550 100644 (file)
@@ -22,6 +22,7 @@ static void check_conf(struct menu *menu);
 
 enum input_mode {
        oldaskconfig,
+       syncconfig,
        oldconfig,
        allnoconfig,
        allyesconfig,
@@ -31,11 +32,14 @@ enum input_mode {
        defconfig,
        savedefconfig,
        listnewconfig,
+       helpnewconfig,
+       olddefconfig,
 };
 static enum input_mode input_mode = oldaskconfig;
 
 static int indent = 1;
 static int tty_stdio;
+static int sync_kconfig;
 static int conf_cnt;
 static char line[PATH_MAX];
 static struct menu *rootEntry;
@@ -87,7 +91,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
        line[0] = '\n';
        line[1] = 0;
 
-       if (!sym_is_changable(sym)) {
+       if (!sym_is_changeable(sym)) {
                printf("%s\n", def);
                line[0] = '\n';
                line[1] = 0;
@@ -96,6 +100,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
 
        switch (input_mode) {
        case oldconfig:
+       case syncconfig:
                if (sym_has_value(sym)) {
                        printf("%s\n", def);
                        return 0;
@@ -230,7 +235,7 @@ static int conf_choice(struct menu *menu)
 
        sym = menu->sym;
        is_new = !sym_has_value(sym);
-       if (sym_is_changable(sym)) {
+       if (sym_is_changeable(sym)) {
                conf_sym(menu);
                sym_calc_value(sym);
                switch (sym_get_tristate_value(sym)) {
@@ -288,6 +293,7 @@ static int conf_choice(struct menu *menu)
                printf("[1-%d?]: ", cnt);
                switch (input_mode) {
                case oldconfig:
+               case syncconfig:
                        if (!is_new) {
                                cnt = def;
                                printf("%d\n", cnt);
@@ -413,7 +419,7 @@ static void check_conf(struct menu *menu)
 
        sym = menu->sym;
        if (sym && !sym_has_value(sym)) {
-               if (sym_is_changable(sym) ||
+               if (sym_is_changeable(sym) ||
                    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
                        if (input_mode == listnewconfig) {
                                if (sym->name) {
@@ -429,6 +435,11 @@ static void check_conf(struct menu *menu)
                                                printf("%s%s=%s\n", CONFIG_, sym->name, str);
                                        }
                                }
+                       } else if (input_mode == helpnewconfig) {
+                               printf("-----\n");
+                               print_help(menu);
+                               printf("-----\n");
+
                        } else {
                                if (!conf_cnt++)
                                        printf("*\n* Restart config...\n*\n");
@@ -443,9 +454,10 @@ static void check_conf(struct menu *menu)
 }
 
 static struct option long_opts[] = {
-       {"askconfig",       no_argument,       NULL, oldaskconfig},
-       {"config",          no_argument,       NULL, oldconfig},
-       {"defconfig",       optional_argument, NULL, defconfig},
+       {"oldaskconfig",    no_argument,       NULL, oldaskconfig},
+       {"oldconfig",       no_argument,       NULL, oldconfig},
+       {"syncconfig",      no_argument,       NULL, syncconfig},
+       {"defconfig",       required_argument, NULL, defconfig},
        {"savedefconfig",   required_argument, NULL, savedefconfig},
        {"allnoconfig",     no_argument,       NULL, allnoconfig},
        {"allyesconfig",    no_argument,       NULL, allyesconfig},
@@ -453,6 +465,8 @@ static struct option long_opts[] = {
        {"alldefconfig",    no_argument,       NULL, alldefconfig},
        {"randconfig",      no_argument,       NULL, randconfig},
        {"listnewconfig",   no_argument,       NULL, listnewconfig},
+       {"helpnewconfig",   no_argument,       NULL, helpnewconfig},
+       {"olddefconfig",    no_argument,       NULL, olddefconfig},
        {NULL, 0, NULL, 0}
 };
 
@@ -462,10 +476,12 @@ static void conf_usage(const char *progname)
        printf("Usage: %s [-s] [option] <kconfig-file>\n", progname);
        printf("[option] is _one_ of the following:\n");
        printf("  --listnewconfig         List new options\n");
-       printf("  --askconfig             Start a new configuration using a line-oriented program\n");
-       printf("  --config                Update a configuration using a provided .config as base\n");
-       printf("  --silentconfig          Same as config, but quietly, additionally update deps\n");
-       printf("  --noconfig              Same as silentconfig but set new symbols to no\n");
+       printf("  --helpnewconfig         List new options and help text\n");
+       printf("  --oldaskconfig          Start a new configuration using a line-oriented program\n");
+       printf("  --oldconfig             Update a configuration using a provided .config as base\n");
+       printf("  --syncconfig            Similar to oldconfig but generates configuration in\n"
+              "                          include/{generated/,config/}\n");
+       printf("  --olddefconfig          Same as oldconfig but sets new symbols to their default value\n");
        printf("  --defconfig <file>      New config with default defined in <file>\n");
        printf("  --savedefconfig <file>  Save the minimal current configuration to <file>\n");
        printf("  --allnoconfig           New config where all options are answered with no\n");
@@ -480,7 +496,6 @@ int main(int ac, char **av)
        const char *progname = av[0];
        int opt;
        const char *name, *defconfig_file = NULL /* gcc uninit */;
-       struct stat tmpstat;
        int no_conf_write = 0;
 
        tty_stdio = isatty(0) && isatty(1);
@@ -498,8 +513,8 @@ int main(int ac, char **av)
                         * Suppress distracting "configuration written to ..."
                         */
                        conf_set_message_callback(NULL);
-                        sync_kconfig = 1;
-                       break
+                       sync_kconfig = 1;
+                       break;
                case defconfig:
                case savedefconfig:
                        defconfig_file = optarg;
@@ -536,6 +551,8 @@ int main(int ac, char **av)
                case allmodconfig:
                case alldefconfig:
                case listnewconfig:
+               case helpnewconfig:
+               case olddefconfig:
                        break;
                case '?':
                        conf_usage(progname);
@@ -554,8 +571,6 @@ int main(int ac, char **av)
 
        switch (input_mode) {
        case defconfig:
-               if (!defconfig_file)
-                       defconfig_file = conf_get_default_confname();
                if (conf_read(defconfig_file)) {
                        fprintf(stderr,
                                "***\n"
@@ -566,9 +581,12 @@ int main(int ac, char **av)
                }
                break;
        case savedefconfig:
+       case syncconfig:
        case oldaskconfig:
        case oldconfig:
        case listnewconfig:
+       case helpnewconfig:
+       case olddefconfig:
                conf_read(NULL);
                break;
        case allnoconfig:
@@ -608,6 +626,18 @@ int main(int ac, char **av)
                break;
        }
 
+       if (sync_kconfig) {
+               name = getenv("KCONFIG_NOSILENTUPDATE");
+               if (name && *name) {
+                       if (conf_get_changed()) {
+                               fprintf(stderr,
+                                       "\n*** The configuration requires explicit update.\n\n");
+                               return 1;
+                       }
+                       no_conf_write = 1;
+               }
+       }
+
        switch (input_mode) {
        case allnoconfig:
                conf_set_all_new_symbols(def_no);
@@ -637,12 +667,17 @@ int main(int ac, char **av)
                /* fall through */
        case oldconfig:
        case listnewconfig:
+       case helpnewconfig:
+       case syncconfig:
                /* Update until a loop caused no more changes */
                do {
                        conf_cnt = 0;
                        check_conf(&rootmenu);
                } while (conf_cnt);
                break;
+       case olddefconfig:
+       default:
+               break;
        }
 
        if (input_mode == savedefconfig) {
@@ -651,16 +686,31 @@ int main(int ac, char **av)
                                defconfig_file);
                        return 1;
                }
-       } else if (input_mode != listnewconfig) {
-               /*
-                * build so we shall update autoconf.
-                */
+       } else if (input_mode != listnewconfig && input_mode != helpnewconfig) {
                if (!no_conf_write && conf_write(NULL)) {
                        fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
                        exit(1);
                }
-               if (conf_write_autoconf()) {
-                       fprintf(stderr, "\n*** Error during update of the configuration.\n\n");
+
+               /*
+                * Create auto.conf if it does not exist.
+                * This prevents GNU Make 4.1 or older from emitting
+                * "include/generated/auto.conf: No such file or directory"
+                * in the top-level Makefile
+                *
+                * syncconfig always creates or updates auto.conf because it is
+                * used during the build.
+                */
+
+               /*
+                * In our cmake case, we always want to update the autogenerated
+                * files.
+                */
+               sync_kconfig = 1;
+
+               if (conf_write_autoconf(sync_kconfig) && sync_kconfig) {
+                       fprintf(stderr,
+                               "\n*** Error during sync of the configuration.\n\n");
                        return 1;
                }
        }