kconfig: introduce nonint_oldconfig and loose_nonint_oldconfig
Aristeu Rozanski [Thu, 6 May 2010 16:48:34 +0000 (12:48 -0400)]
This patch has been around for a long time in Fedora and Red Hat Enterprise
Linux kernels and it may be useful for others. The nonint_oldconfig target
will fail and print the unset config options while loose_nonint_oldconfig will
simply let the config option unset. They're useful in distro kernel packages
where the config files are built using a combination of smaller config files.

Arjan van de Ven wrote the initial nonint_config and Roland McGrath added the
loose_nonint_oldconfig.

Signed-off-by: Arjan van de Ven <arjan@redhat.com> [defunct email]
Whatevered-by: Kyle McMartin <kyle@redhat.com>
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
Acked-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Aristeu Rozanski <aris@redhat.com>
[mmarek: whitespace fixes]
Signed-off-by: Michal Marek <mmarek@suse.cz>

scripts/kconfig/Makefile
scripts/kconfig/conf.c

index 75bdf5a..f8d1ee3 100644 (file)
@@ -62,6 +62,12 @@ localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
        fi
        $(Q)rm -f .tmp.config
 
+nonint_oldconfig: $(obj)/conf
+       $< -b $(Kconfig)
+
+loose_nonint_oldconfig: $(obj)/conf
+       $< -B $(Kconfig)
+
 # Create new linux.pot file
 # Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
 # The symlink is used to repair a deficiency in arch/um
@@ -126,6 +132,10 @@ help:
        @echo  '  allmodconfig    - New config selecting modules when possible'
        @echo  '  allyesconfig    - New config where all options are accepted with yes'
        @echo  '  allnoconfig     - New config where all options are answered with no'
+       @echo  '  nonint_oldconfig - Checks the current configuration and fails if an option is '
+       @echo  '                    not set'
+       @echo  '  loose_nonint_oldconfig - Same as nonint_oldconfig, but updates the config file with '
+       @echo  '                    missing config options as unset'
 
 # lxdialog stuff
 check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
index 9960d1c..3fa4abf 100644 (file)
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
+/* Return codes */
+#define EUNSETOPT      2       /* if -B and -b are used and unset config
+                                * options were found */
+
 static void conf(struct menu *menu);
 static void check_conf(struct menu *menu);
 
@@ -23,6 +27,8 @@ enum {
        ask_all,
        ask_new,
        ask_silent,
+       dont_ask,
+       dont_ask_dont_tell,
        set_default,
        set_yes,
        set_mod,
@@ -37,6 +43,7 @@ static int sync_kconfig;
 static int conf_cnt;
 static char line[128];
 static struct menu *rootEntry;
+static int unset_variables;
 
 static void print_help(struct menu *menu)
 {
@@ -360,7 +367,10 @@ static void conf(struct menu *menu)
 
                switch (prop->type) {
                case P_MENU:
-                       if (input_mode == ask_silent && rootEntry != menu) {
+                       if ((input_mode == ask_silent ||
+                            input_mode == dont_ask ||
+                            input_mode == dont_ask_dont_tell) &&
+                           rootEntry != menu) {
                                check_conf(menu);
                                return;
                        }
@@ -418,10 +428,23 @@ static void check_conf(struct menu *menu)
        if (sym && !sym_has_value(sym)) {
                if (sym_is_changable(sym) ||
                    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
-                       if (!conf_cnt++)
-                               printf(_("*\n* Restart config...\n*\n"));
-                       rootEntry = menu_get_parent_menu(menu);
-                       conf(rootEntry);
+                       if (input_mode == dont_ask ||
+                           input_mode == dont_ask_dont_tell) {
+                               if (input_mode == dont_ask &&
+                                   sym->name && !sym_is_choice_value(sym)) {
+                                       if (!unset_variables)
+                                               fprintf(stderr, "The following"
+                                                 " variables are not set:\n");
+                                       fprintf(stderr, "CONFIG_%s\n",
+                                                       sym->name);
+                                       unset_variables++;
+                               }
+                       } else {
+                               if (!conf_cnt++)
+                                       printf(_("*\n* Restart config...\n*\n"));
+                               rootEntry = menu_get_parent_menu(menu);
+                               conf(rootEntry);
+                       }
                }
        }
 
@@ -439,7 +462,7 @@ int main(int ac, char **av)
        bindtextdomain(PACKAGE, LOCALEDIR);
        textdomain(PACKAGE);
 
-       while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) {
+       while ((opt = getopt(ac, av, "osbBdD:nmyrh")) != -1) {
                switch (opt) {
                case 'o':
                        input_mode = ask_silent;
@@ -448,6 +471,12 @@ int main(int ac, char **av)
                        input_mode = ask_silent;
                        sync_kconfig = 1;
                        break;
+               case 'b':
+                       input_mode = dont_ask;
+                       break;
+               case 'B':
+                       input_mode = dont_ask_dont_tell;
+                       break;
                case 'd':
                        input_mode = set_default;
                        break;
@@ -525,6 +554,8 @@ int main(int ac, char **av)
        case ask_silent:
        case ask_all:
        case ask_new:
+       case dont_ask:
+       case dont_ask_dont_tell:
                conf_read(NULL);
                break;
        case set_no:
@@ -586,12 +617,16 @@ int main(int ac, char **av)
                conf(&rootmenu);
                input_mode = ask_silent;
                /* fall through */
+       case dont_ask:
+       case dont_ask_dont_tell:
        case ask_silent:
                /* Update until a loop caused no more changes */
                do {
                        conf_cnt = 0;
                        check_conf(&rootmenu);
-               } while (conf_cnt);
+               } while (conf_cnt &&
+                        (input_mode != dont_ask &&
+                         input_mode != dont_ask_dont_tell));
                break;
        }
 
@@ -607,11 +642,11 @@ int main(int ac, char **av)
                        fprintf(stderr, _("\n*** Error during update of the kernel configuration.\n\n"));
                        return 1;
                }
-       } else {
+       } else if (!unset_variables || input_mode != dont_ask) {
                if (conf_write(NULL)) {
                        fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
                        exit(1);
                }
        }
-       return 0;
+       return unset_variables ? EUNSETOPT : 0;
 }