#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Linux Module Utilities"

config DEPMOD
	bool "depmod"
	default n
	help
	  depmod generates modules.dep (FIXME: elaborate)

config INSMOD
	bool "insmod"
	default n
	help
	  insmod is used to load specified modules in the running kernel.

config FEATURE_INSMOD_VERSION_CHECKING
	bool "Module version checking"
	default n
	depends on INSMOD && FEATURE_2_4_MODULES
	help
	  Support checking of versions for modules.  This is used to
	  ensure that the kernel and module are made for each other.

config FEATURE_INSMOD_KSYMOOPS_SYMBOLS
	bool "Add module symbols to kernel symbol table"
	default n
	depends on INSMOD && FEATURE_2_4_MODULES
	help
	  By adding module symbols to the kernel symbol table, Oops messages
	  occuring within kernel modules can be properly debugged.  By enabling
	  this feature, module symbols will always be added to the kernel symbol
	  table for properly debugging support.  If you are not interested in
	  Oops messages from kernel modules, say N.

config FEATURE_INSMOD_LOADINKMEM
	bool "In kernel memory optimization (uClinux only)"
	default n
	depends on INSMOD && FEATURE_2_4_MODULES
	help
	  This is a special uClinux only memory optimization that lets insmod
	  load the specified kernel module directly into kernel space, reducing
	  memory usage by preventing the need for two copies of the module
	  being loaded into memory.

config FEATURE_INSMOD_LOAD_MAP
	bool "Enable load map (-m) option"
	default n
	depends on INSMOD && ( FEATURE_2_4_MODULES || FEATURE_2_6_MODULES )
	help
	  Enabling this, one would be able to get a load map
	  output on stdout. This makes kernel module debugging
	  easier.
	  If you don't plan to debug kernel modules, you
	  don't need this option.

config FEATURE_INSMOD_LOAD_MAP_FULL
	bool "Symbols in load map"
	default y
	depends on FEATURE_INSMOD_LOAD_MAP
	help
	  Without this option, -m will only output section
	  load map.  With this option, -m will also output
	  symbols load map.

config RMMOD
	bool "rmmod"
	default n
	help
	  rmmod is used to unload specified modules from the kernel.

config LSMOD
	bool "lsmod"
	default n
	help
	  lsmod is used to display a list of loaded modules.

config FEATURE_LSMOD_PRETTY_2_6_OUTPUT
	bool "Pretty output for 2.6.x Linux kernels"
	default n
	depends on LSMOD
	help
	  This option makes output format of lsmod adjusted to
	  the format of module-init-tools for Linux kernel 2.6.

config MODPROBE
	bool "modprobe"
	default n
	help
	  Handle the loading of modules, and their dependencies on a high
	  level.

	  Note that in the state, modprobe does not understand multiple
	  module options from the configuration file. See option below.

config FEATURE_MODPROBE_MULTIPLE_OPTIONS
	bool
	prompt "Multiple options parsing"
	default y
	depends on MODPROBE
	help
	  Allow modprobe to understand more than one option to pass to
	  modules.

	  This is a WIP, while waiting for a common argument parsing
	  common amongst all BB applets (shell, modprobe, etc...) and
	  adds around 600 bytes on x86, 700 bytes on ARM. The code is
	  biggish and uggly, but just works.

	  Saying Y here is not a bad idea if you're not that short
	  on storage capacity.

config FEATURE_MODPROBE_FANCY_ALIAS
	bool
	prompt "Fancy alias parsing"
	default y
	depends on MODPROBE && FEATURE_2_6_MODULES
	help
	  Say 'y' here to enable parsing of aliases with underscore/dash
	  mismatch between module name and file name, along with bus-specific
	  aliases (such as pci:... or usb:... aliases).

config FEATURE_MODPROBE_BLACKLIST
	bool
	prompt "Blacklist support"
	default n
	depends on MODPROBE && FEATURE_2_6_MODULES
	help
	  Say 'y' here to enable support for the 'blacklist' command in 
	  modprobe.conf. This prevents the alias resolver to resolve 
	  blacklisted modules. This is useful if you want to prevent your 
	  hardware autodetection scripts to load modules like evdev, frame 
	  buffer drivers etc.

comment "Options common to multiple modutils"
	depends on INSMOD || RMMOD || MODPROBE || LSMOD || DEPMOD

config FEATURE_CHECK_TAINTED_MODULE
	# Simulate indentation
	bool "Support tainted module checking with new kernels"
	default y
	depends on INSMOD || LSMOD
	help
	  Support checking for tainted modules.  These are usually binary
	  only modules that will make the linux-kernel list ignore your
	  support request.
	  This option is required to support GPLONLY modules.

config FEATURE_2_4_MODULES
	# Simulate indentation
	bool "Support version 2.2.x to 2.4.x Linux kernels"
	default y
	depends on INSMOD || RMMOD || MODPROBE
	help
	  Support module loading for 2.2.x and 2.4.x Linux kernels.

	  Note:
	  This is automatically enabled if 2.6 modules are not enabled.

config FEATURE_2_6_MODULES
	# Simulate indentation
	bool "Support version 2.6.x Linux kernels"
	default y
	depends on INSMOD || RMMOD || MODPROBE
	help
	  Support module loading for newer 2.6.x Linux kernels.

config DEFAULT_MODULES_DIR
	# Simulate indentation
	string "default directory containing modules"
	default "/lib/modules"
	depends on INSMOD || RMMOD || MODPROBE || DEPMOD
	help
	  Directory that contains kernel modules.
	  Defaults to "/lib/modules"

config DEFAULT_DEPMOD_FILE
	# Simulate indentation
	string "default name of modules.dep"
	default "modules.dep"
	depends on INSMOD || RMMOD || MODPROBE || DEPMOD
	help
	  Filename that contains kernel modules dependencies.
	  Defaults to "modules.dep"

config FEATURE_QUERY_MODULE_INTERFACE
	bool
	default y
	depends on FEATURE_2_4_MODULES && !FEATURE_2_6_MODULES


endmenu

