This file contains some assistance for using "make *config".

Use "make help" to list all of the possible configuration targets.

The xconfig ('qconf') and menuconfig ('mconf') programs also
have embedded help text.  Be sure to check it for navigation,
search, and other general help text.

======================================================================
General
--------------------------------------------------

New kernel releases often introduce new config symbols.  Often more
important, new kernel releases may rename config symbols.  When
this happens, using a previously working .config file and running
"make oldconfig" won't necessarily produce a working new kernel
for you, so you may find that you need to see what NEW kernel
symbols have been introduced.

To see a list of new config symbols when using "make oldconfig", use

	cp user/some/old.config .config
	yes "" | make oldconfig >conf.new

and the config program will list as (NEW) any new symbols that have
unknown values.  Of course, the .config file is also updated with
new (default) values, so you can use:

	grep "(NEW)" conf.new

to see the new config symbols or you can 'diff' the previous and
new .config files to see the differences:

	diff .config.old .config | less

(Yes, we need something better here.)

______________________________________________________________________
Environment variables for '*config'

KCONFIG_CONFIG
--------------------------------------------------
This environment variable can be used to specify a default kernel config
file name to override the default name of ".config".

KCONFIG_OVERWRITECONFIG
--------------------------------------------------
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
break symlinks when .config is a symlink to somewhere else.

______________________________________________________________________
Environment variables for '{allyes/allmod/allno/rand}config'

KCONFIG_ALLCONFIG
--------------------------------------------------
(partially based on lkml email from/by Rob Landley, re: miniconfig)
--------------------------------------------------
The allyesconfig/allmodconfig/allnoconfig/randconfig variants can
also use the environment variable KCONFIG_ALLCONFIG as a flag or a
filename that contains config symbols that the user requires to be
set to a specific value.  If KCONFIG_ALLCONFIG is used without a
filename, "make *config" checks for a file named
"all{yes/mod/no/def/random}.config" (corresponding to the *config command
that was used) for symbol values that are to be forced.  If this file
is not found, it checks for a file named "all.config" to contain forced
values.

This enables you to create "miniature" config (miniconfig) or custom
config files containing just the config symbols that you are interested
in.  Then the kernel config system generates the full .config file,
including symbols of your miniconfig file.

This 'KCONFIG_ALLCONFIG' file is a config file which contains
(usually a subset of all) preset config symbols.  These variable
settings are still subject to normal dependency checks.

Examples:
	KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
or
	KCONFIG_ALLCONFIG=mini.config make allnoconfig
or
	make KCONFIG_ALLCONFIG=mini.config allnoconfig

These examples will disable most options (allnoconfig) but enable or
disable the options that are explicitly listed in the specified
mini-config files.

______________________________________________________________________
Environment variables for 'silentoldconfig'

KCONFIG_NOSILENTUPDATE
--------------------------------------------------
If this variable has a non-blank value, it prevents silent kernel
config updates (requires explicit updates).

KCONFIG_AUTOCONFIG
--------------------------------------------------
This environment variable can be set to specify the path & name of the
"auto.conf" file.  Its default value is "include/config/auto.conf".

KCONFIG_TRISTATE
--------------------------------------------------
This environment variable can be set to specify the path & name of the
"tristate.conf" file.  Its default value is "include/config/tristate.conf".

KCONFIG_AUTOHEADER
--------------------------------------------------
This environment variable can be set to specify the path & name of the
"autoconf.h" (header) file.
Its default value is "include/generated/autoconf.h".


======================================================================
menuconfig
--------------------------------------------------

SEARCHING for CONFIG symbols

Searching in menuconfig:

	The Search function searches for kernel configuration symbol
	names, so you have to know something close to what you are
	looking for.

	Example:
		/hotplug
		This lists all config symbols that contain "hotplug",
		e.g., HOTPLUG, HOTPLUG_CPU, MEMORY_HOTPLUG.

	For search help, enter / followed TAB-TAB-TAB (to highlight
	<Help>) and Enter.  This will tell you that you can also use
	regular expressions (regexes) in the search string, so if you
	are not interested in MEMORY_HOTPLUG, you could try

		/^hotplug

______________________________________________________________________
User interface options for 'menuconfig'

MENUCONFIG_COLOR
--------------------------------------------------
It is possible to select different color themes using the variable
MENUCONFIG_COLOR.  To select a theme use:

	make MENUCONFIG_COLOR=<theme> menuconfig

Available themes are:
  mono       => selects colors suitable for monochrome displays
  blackbg    => selects a color scheme with black background
  classic    => theme with blue background. The classic look
  bluetitle  => a LCD friendly version of classic. (default)

MENUCONFIG_MODE
--------------------------------------------------
This mode shows all sub-menus in one large tree.

Example:
	make MENUCONFIG_MODE=single_menu menuconfig


======================================================================
xconfig
--------------------------------------------------

Searching in xconfig:

	The Search function searches for kernel configuration symbol
	names, so you have to know something close to what you are
	looking for.

	Example:
		Ctrl-F hotplug
	or
		Menu: File, Search, hotplug

	lists all config symbol entries that contain "hotplug" in
	the symbol name.  In this Search dialog, you may change the
	config setting for any of the entries that are not grayed out.
	You can also enter a different search string without having
	to return to the main menu.


======================================================================
gconfig
--------------------------------------------------

Searching in gconfig:

	None (gconfig isn't maintained as well as xconfig or menuconfig);
	however, gconfig does have a few more viewing choices than
	xconfig does.

###
