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

menu "Archival Utilities"

config CONFIG_AR
	bool "ar"
	default n
	help
	  ar is an archival utility program used to create, modify, and
	  extract contents from archives.  An archive is a single file holding
	  a collection of other files in a structure that makes it possible to
	  retrieve the original individual files (called archive members).
	  The original files' contents, mode (permissions), timestamp, owner,
	  and group are preserved in the archive, and can be restored on
	  extraction.

	  The stored filename is limited to 15 characters. (for more information
	  see long filename support).
	  ar has 60 bytes of overheads for every stored file.

	  This implementation of ar can extract archives, it cannot create or
	  modify them.
	  On an x86 system, the ar applet adds about 1K.

	  Unless you have a specific application which requires ar, you should
	  probably say N here.

config CONFIG_FEATURE_AR_LONG_FILENAMES
	bool "  Enable support for long filenames (not need for debs)"
	default n
	depends on CONFIG_AR
	help
	  By default the ar format can only store the first 15 characters of the
	  filename, this option removes that limitation.
	  It supports the GNU ar long filename method which moves multiple long
	  filenames into a the data section of a new ar entry.

config CONFIG_BUNZIP2
	bool "bunzip2"
	default n
	help
	  bunzip2 is a compression utility using the Burrows-Wheeler block
	  sorting text compression algorithm, and Huffman coding.  Compression
	  is generally considerably better than that achieved by more
	  conventional LZ77/LZ78-based compressors, and approaches the
	  performance of the PPM family of statistical compressors.  
	  
	  The BusyBox bunzip2 applet is limited to de-compression only.
	  On an x86 system, this applet adds about 11K.
	  
	  Unless you have a specific application which requires bunzip2, you
	  should probably say N here.

config CONFIG_CPIO
	bool "cpio"
	default n
	help
	  cpio is an archival utility program used to create, modify, and extract
	  contents from archives.
	  cpio has 110 bytes of overheads for every stored file.

	  This implementation of cpio can extract cpio archives created in the
	  "newc" or "crc" format, it cannot create or modify them. 

	  Unless you have a specific application which requires cpio, you should
	  probably say N here.

config CONFIG_DPKG
	bool "dpkg"
	default n
	help
	  dpkg is a medium-level tool to install, build, remove and manage Debian packages.
	  
	  This implementation of dpkg has a number of limitations, you should use the
	  official dpkg if possible.

config CONFIG_DPKG_DEB
	bool "dpkg_deb"
	default n
	help
	  dpkg-deb packs, unpacks and provides information about Debian archives.
	  
	  This implementation of dpkg-deb cannot pack archives.
	  
	  Unless you have a specific application which requires dpkg-deb, you should
	  probably say N here.

config CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
	bool "  extract only (-x)"
	default n
	depends on CONFIG_DPKG_DEB
	help
	  This reduces dpkg-deb to the equivalent of "ar -p <deb> data.tar.gz | tar -zx".
	  However it saves space as none of the extra dpkg-deb, ar or tar options are 
	  needed, they are linked to internally.

config CONFIG_GUNZIP
	bool "gunzip"
	default n
	help
	  gunzip is used to decompress archives created by gzip.
	  You can use the `-t' option to test the integrity of
	  an archive, without decompressing it.

config CONFIG_FEATURE_GUNZIP_UNCOMPRESS
	bool "  Uncompress support"
	default n
	depends on CONFIG_GUNZIP
	help
	  Enable if you want gunzip to have the ability to decompress
	  archives created by the program compress (not much
	  used anymore).

config CONFIG_GZIP
	bool "gzip"
	default n
	help
	  gzip is used to compress files.
	  It's probably the most widely used UNIX compression program.

config CONFIG_RPM2CPIO
	bool "rpm2cpio"
	default n
	help
	  Converts an RPM file into a CPIO archive.

config CONFIG_RPM
	bool "rpm"
	default n
	help
	  Mini RPM applet - queries and extracts

config CONFIG_TAR
	bool "tar"
	default n
	help
	  tar is an archiving program. It's commonly used with gzip to
	  create compressed archives. It's probably the most widely used
	  UNIX archive program.

config CONFIG_FEATURE_TAR_CREATE
	bool "  Enable archive creation"
	default y
	depends on CONFIG_TAR
	help
	  If you enable this option you'll be able to create
	  tar archives using the `-c' option.

config CONFIG_FEATURE_TAR_BZIP2
	bool "  Enable -j option to handle .tar.bz2 files"
	default n
	depends on CONFIG_TAR
	help
	  If you enable this option you'll be able to extract
	  archives compressed with bzip2.

config CONFIG_FEATURE_TAR_FROM
	bool "  Enable -X (exclude from) and -T (include from) options)"
	default n
	depends on CONFIG_TAR
	help
	  If you enable this option you'll be able to specify
	  a list of files to include or exclude from an archive.

config CONFIG_FEATURE_TAR_GZIP
	bool "  Enable -z option"
	default y
	depends on CONFIG_TAR
	help
	  If you enable this option tar will be able to call gzip,
	  when creating or extracting tar gziped archives.

config CONFIG_FEATURE_TAR_COMPRESS
	bool "  Enable -Z option"
	default n
	depends on CONFIG_TAR
	help
	  If you enable this option tar will be able to call uncompress,
	  when extracting .tar.Z archives.

config CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
	bool "  Enable support for old tar header format"
	default N
	depends on CONFIG_TAR
	help
	  This option is required to unpack archives created in
	  the old GNU format; help to kill this old format by
	  repacking your ancient archives with the new format.

config CONFIG_FEATURE_TAR_GNU_EXTENSIONS
	bool "  Enable support for some GNU tar extensions"
	default y
	depends on CONFIG_TAR
	help
	  With this option busybox supports GNU long filenames and 
	  linknames.

config CONFIG_FEATURE_TAR_LONG_OPTIONS
	bool "  Enable long options"
	default n
	depends on CONFIG_TAR
	help
		Enable use of long options, increases size by about 400 Bytes

config CONFIG_UNCOMPRESS
	bool "uncompress"
	default n
	help
	  uncompress is used to decompress archives created by compress.
	  Not much used anymore, replaced by gzip/gunzip.

config CONFIG_UNZIP
	bool "unzip"
	default n
	help
	  unzip will list or extract files from a ZIP archive,
	  commonly found on DOS/WIN systems. The default behavior
	  (with no options) is to extract the archive into the
	  current directory. Use the `-d' option to extract to a
	  directory of your choice.

comment "Common options for cpio and tar"
	depends on CONFIG_CPIO || CONFIG_TAR

config CONFIG_FEATURE_UNARCHIVE_TAPE
	bool "  Enable tape drive support"
	default n
	depends on CONFIG_CPIO || CONFIG_TAR
	help
	  I don't think this is needed anymore.

comment "Common options for dpkg and dpkg_deb"
	depends on CONFIG_DPKG || CONFIG_DPKG_DEB

config CONFIG_FEATURE_DEB_TAR_GZ
	bool "  gzip debian packages (normal)"
	default y if CONFIG_DPKG || CONFIG_DPKG_DEB
	depends on CONFIG_DPKG || CONFIG_DPKG_DEB
	help
	  This is the default compression method inside the debian ar file.
	  
	  If you want compatibility with standard .deb's you should say yes here.

config CONFIG_FEATURE_DEB_TAR_BZ2
	bool "  bzip2 debian packages"
	default n
	depends on CONFIG_DPKG || CONFIG_DPKG_DEB
	help
	  This allows dpkg and dpkg-deb to extract deb's that are compressed internally
	  with bzip2 instead of gzip.
	  
	  You only want this if you are creating your own custom debian packages that
	  use an internal control.tar.bz2 or data.tar.bz2.

endmenu
