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

menu "Linux Module Utilities"

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 "lsmod 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" if NITPICK
	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" if NITPICK
	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).

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

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.

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 FEATURE_QUERY_MODULE_INTERFACE
	bool
	default y
	depends on FEATURE_2_4_MODULES && !FEATURE_2_6_MODULES


endmenu

