#
# 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 FEATURE_DEPMOD_PRUNE_FANCY
	bool "fancy dependency pruning"
	default n
	depends on DEPMOD
	help
	  By default modules.dep contains all dependencies as listed by
	  the modules.
	  If you enable this option then we remove implied modules from
	  the dependencies.
	  This makes depmod somewhat bigger but generates a smaller
	  modules.dep file.

	  If unsure, say N.

config FEATURE_DEPMOD_ALIAS
	bool "alias support"
	default n
	depends on DEPMOD
	help
	  By default modules.dep does not contain alias information.
	  Enable this to emit aliases of the form:

	    alias pcmcia:m*c*f03fn*pfn*pa*pb*pc*pd* parport_cs

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

