CML2 seems to be unnecessary in kbuild-2.5. It's good to have CML2-supporting code in the archive, but it's not really needed for current versions.
Keith: Do you have any plan on how to split kbuild-2.5 up in "manageable pieces" Linus likes? Haven't really looked closely at the code, but could the new-style Makefiles.in somewhat "easily" be transformed to the previous per-directory Makefiles? Then one big advantage of kbuild-2.5, the new _easier_ Makefile-syntax with its Makefile.in files, could be merged first. Dominik
--- linux/Makefile-2.5.original Fri May 24 01:27:05 2002 +++ linux/Makefile-2.5 Fri May 24 09:30:27 2002 @@ -84,9 +84,6 @@ KBUILD_TIME := # \time -f "%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k" export KBUILD_TIME -# The default version of CML to use. -KBUILD_CML := 1 - # CDPATH gets in the way by writing messages when the directory could be # ambiguous. We know better, directories in kbuild are never ambiguous. CDPATH := --- linux/Makefile.in.original Fri May 24 09:25:09 2002 +++ linux/Makefile.in Fri May 24 09:26:13 2002 @@ -260,10 +260,6 @@ # it to $(KERNELRELEASE), that can contain upper case words which must be left # alone. -# If CML2 consistently handles ${VARIABLE} then remove uppercasetovar, but you -# still have to eval the strings to expand them when we want them expanded. -# Also the strings are quoted, eval gets rid of the quotes. - uppercasetovar := sed -e 's/\([^A-Za-z0-9_]\)/:\1:/g; s/:\([A-Z][A-Z0-9_]*\):/:$${\1}:/g; s/:\([^A-Za-z0-9_]\):/\1/g' # Evaluate the install variables, replacing upper case strings with variables. --- linux/scripts/Makefile-2.5.original Fri May 24 09:21:32 2002 +++ linux/scripts/Makefile-2.5 Fri May 24 09:23:27 2002 @@ -498,7 +498,7 @@ # compilation without having to rewrite the config code. # The CML1 config utilities expect to read [Cc]onfig.in files from a single -# source tree, CML2 does the same for .cml files. However the [Cc]onfig.in/.cml +# source tree, However the [Cc]onfig.in/.cml # files could be spread over several input trees and could even be generated in # the object tree. Build a tree of symlinks under .tmp_config/links, pointing # to the relevant location for each config file, plus Configure.help, @@ -513,9 +513,6 @@ tmp_config_links := $(tmp_config)links/ export tmp_config_links tmp_config_files := .config .config.old .force_default include/linux/autoconf.h -ifeq ($(KBUILD_CML),2) - tmp_config_files += config.out rules.out rules-2.5.cml -endif MRPROPER += $(tmp_config_files) tmp_config_copyout := cd $(KBUILD_OBJTREE) && \ echo $(tmp_config_files) | \ @@ -529,9 +526,6 @@ lxdialog-objtree := $(scripts_objtree)lxdialog/ split_config := $(scripts_objtree)split-include $(KBUILD_OBJTREE)include/linux/autoconf.h $(KBUILD_OBJTREE)config_settings -# Start of CML1 code -ifeq ($(KBUILD_CML),1) - # Add the 2.5 options to the end of the config. Some CML1 code cannot handle # source arch/$(ARCH)/boot/config.in for the installation menu, no variable # expansion on the source command. Symlinks to the rescue (again). @@ -722,250 +716,6 @@ @$(note_cml_inputs) endif # second_pass -endif -# End of CML1 code - -# Start of CML2 code -ifeq ($(KBUILD_CML),2) - -cml_inputs := egrep '(defconfig|Config(ure)?\.help|\.cml |\.py ).* s 1 ' $(KBUILD_OBJTREE).tmp_filelist | grep -v '^/rules-2.5.cml' -note_cml_inputs := $(cml_inputs) > $(KBUILD_OBJTREE).tmp_cml_inputs - -# Create and/or read the extra cml2 files required for kbuild 2.5. Most of the -# '-2.5' files will disappear after the code is in the main kernel tree, the -# files are compatibility glue with cml2 for 2.4. - -# Yeuch. $(tmp_config_links) is carefully defined with a trailing / for -# consistency with the rest of kbuild. make assigns $@ _without_ the trailing -# '/'. - -$(tmp_config_links): $(KBUILD_OBJTREE).tmp_filelist - @rm -rf $@ - @cd $(KBUILD_OBJTREE) - @mkdir -p $(KBUILD_OBJTREE)include/linux $@/include/linux - @cd $@ && \ - ( \ - $(cml_inputs) | $(AWK) '{sub(/[^\/]*$$/, "", $$1); print "mkdir -p ." $$1}' && \ - $(cml_inputs) | $(AWK) '{print "ln -sf " $$2 " ." $$1}' \ - ) | $(KBUILD_SHELL) - @$(tmp_config_copyout) -# Arch independent rules-2.5.cml header - @( \ - echo "# Generated by scripts/Makefile-2.5. Do not edit."; \ - echo ""; \ - echo "derive KBUILD_2_5 from y"; \ - echo "derive Y from y"; \ - echo "derive M from MODULES==y ? m : y"; \ - echo "derive KBUILD_GCC_VERSION from \"$(gcc_version)\""; \ - echo "derive KBUILD_CRITICAL from \"CONFIG_SMP CONFIG_KBUILD_GCC_VERSION\""; \ - echo ""; \ - echo "source \"symbols-2.5.cml\""; \ - echo ""; \ - echo "source \"rules.cml\""; \ - echo ""; \ - echo "menu main"; \ - echo " addon"; \ - echo " installation"; \ - ) > $@/.tmp_rules-2.5.cml -# Arch independent rules-2.5.cml kludge. - @( \ - echo ""; \ - echo "# To solve the problem of the various install formats appearing on multiple arch"; \ - echo "# dependent menus (which breaks some assumptions in CML2), ESR suggested using"; \ - echo "# private variables in each architecture and deriving the install format from"; \ - echo "# all the private variables. The derive statements below must be changed for"; \ - echo "# each new architecture that is sourced."; \ - echo "#"; \ - echo "# The private variables point to common help text like VMLINUX_help, using the"; \ - echo "# 'like' keyword introduced in CML2 1.9.11. The help variables cannot be"; \ - echo "# vmlinux etc. themselves, CML2 complains if a variable has help text and is"; \ - echo "# derived, so we need separate _help variables. Alas CML2 then complains that"; \ - echo "# the _help variables do not appear on a menu, so put them on a menu and always"; \ - echo "# suppress the menu."; \ - echo "#"; \ - echo "# I am a kludge, I am a kludge, I am the walrus, coo coo ca choo."; \ - echo "#"; \ - echo "# It would be so much easier if CML2 allowed multiple uses of the same variable"; \ - echo "# and required that only one occurrence was visible at once. KAO"; \ - echo ""; \ - echo "menus hide_the_cml2_help_variables \"Do not use this menu, it is a hiding place for the help variables (kludge)\""; \ - echo "menu hide_the_cml2_help_variables"; \ - echo " VMLINUX_help"; \ - echo " VMLINUZ_help"; \ - echo " BZIMAGE_help"; \ - echo " ZIMAGE_help"; \ - echo " VMLINUX_SREC_help"; \ - echo " VMLINUX_BIN_help"; \ - echo "menu main"; \ - echo " hide_the_cml2_help_variables"; \ - echo "unless n suppress hide_the_cml2_help_variables"; \ - ) >> $@/.tmp_rules-2.5.cml -# Arch dependent global rules-2.5.cml code, change for each new architecture. See above. - @( \ - echo ""; \ - echo "source \"arch/i386/boot/rules-2.5.cml\""; \ - echo ""; \ - echo "derive VMLINUX from VMLINUX_X86"; \ - echo "derive VMLINUZ from VMLINUZ_X86"; \ - echo "derive BZIMAGE from BZIMAGE_X86"; \ - echo "derive ZIMAGE from ZIMAGE_X86"; \ - echo "derive VMLINUX_SREC from n"; \ - echo "derive VMLINUX_BIN from n"; \ - ) >> $@/.tmp_rules-2.5.cml -# Arch independent rules-2.5.cml trailer - @( \ - echo ""; \ - echo "# The arch specific entries in menu installation are created by the arch rules,"; \ - echo "# now add the common entries."; \ - echo ""; \ - echo "menu installation"; \ - echo " INSTALL_PREFIX {INSTALL_PREFIX_NAME$$}"; \ - echo " INSTALL_KERNEL_NAME$$"; \ - echo " INSTALL_SYSTEM_MAP {INSTALL_SYSTEM_MAP_NAME$$}"; \ - echo " INSTALL_CONFIG {INSTALL_CONFIG_NAME$$}"; \ - echo " INSTALL_VMLINUX {INSTALL_VMLINUX_NAME$$}"; \ - echo " INSTALL_SCRIPT {INSTALL_SCRIPT_NAME$$}"; \ - echo ""; \ - echo "default INSTALL_PREFIX_NAME from \"\""; \ - echo "default INSTALL_KERNEL_NAME from \"/lib/modules/KERNELRELEASE/KERNELBASENAME\""; \ - echo "default INSTALL_SYSTEM_MAP_NAME from \"/lib/modules/KERNELRELEASE/System.map\""; \ - echo "default INSTALL_CONFIG_NAME from \"/lib/modules/KERNELRELEASE/.config\""; \ - echo "default INSTALL_VMLINUX_NAME from \"/lib/modules/KERNELRELEASE/vmlinux\""; \ - echo "default INSTALL_SCRIPT_NAME from \"\""; \ - echo "unless VMLINUX!=y suppress INSTALL_VMLINUX"; \ - ) >> $@/.tmp_rules-2.5.cml - @cmp -s $@/.tmp_rules-2.5.cml $@/rules-2.5.cml || mv -f $@/.tmp_rules-2.5.cml $@/rules-2.5.cml - -archsymbol := $(shell echo $(ARCH) | sed -e s/i.86/x86/ -e s/sparc$$/sparc32/ -e s/mips$$/mips32/ | tr "[a-z]" "[A-Z]") -cmlopts := -D$(archsymbol) -B $(KERNELRELEASE) $(CONFIGOPTS) rules.out -PYTHON2 := $(shell $(KBUILD_SHELL) $(scripts_srctree)kwhich python2 python) -cmlconfigure := cd $(tmp_config_links) && $(PYTHON2) -O scripts/cmlconfigure.py -cml.config := cd $(tmp_config_links) && $(PYTHON2) -O scripts/configtrans.py -h include/linux/autoconf.h -s .config config.out && touch config.out - -# Rebuild rules.out if any of the cml_input timestamps have changed, or if -# rules.out is older than the generated rules-2.5.cml. - -$(tmp_config_links)rules.out: $(KBUILD_OBJTREE).tmp_filelist $(tmp_config_links) - @grep '^KMOD.*text$$' $(tmp_config_links)symbols.cml > /dev/null || \ - (echo "symbols.cml is incorrect, did you install the CML2 files and run helpmerge.py?" >&2; /bin/false) - @$(cml_inputs) > $(KBUILD_OBJTREE).tmp_rules.out_new - @[ -s $@ ] || rm -f $(KBUILD_OBJTREE).tmp_rules.out - @[ $(tmp_config_links)rules-2.5.cml -ot $@ ] || rm -f $(KBUILD_OBJTREE).tmp_rules.out - @cmp -s $(KBUILD_OBJTREE).tmp_rules.out_new $(KBUILD_OBJTREE).tmp_rules.out || \ - (cd $(tmp_config_links); $(PYTHON2) -O scripts/cmlcompile.py rules-2.5.cml && \ - cp -f rules.out $(KBUILD_OBJTREE) && \ - mv -f $(KBUILD_OBJTREE).tmp_rules.out_new $(KBUILD_OBJTREE).tmp_rules.out) - -# Some users will edit .config instead of config.out and will be confused if the -# change is not detected. Until we can get rid of .config, check which of the -# two files is more recent. This is why $(cml.config) touches config.out after -# generating .config, to make config.out the more recent file. KAO - -.PHONY: create_config_out -create_config_out: $(tmp_config_links)rules.out - @cd $(tmp_config_links); \ - [ -s .config -o -s config.out ] || \ - (cp -f arch/$(ARCH)/defconfig .config && echo "Copying defconfig to .config") - @cd $(tmp_config_links); \ - [ -s .config -o ! -s config.out ] || \ - (cp -f -a config.out .config && echo "Copying config.out to .config") - @cd $(tmp_config_links); \ - if [ -e .config -a -e config.out -a .config -nt config.out ]; then \ - echo "Warning: .config is newer than config.out, should not happen" >&2; \ - echo " Changing .config is deprecated in CML2, edit config.out instead" >&2; \ - rm config.out; \ - fi - @cd $(tmp_config_links); \ - [ ! -s .config -o -s config.out ] || \ - (scripts/configtrans.py -t < .config > config.out && echo "Using .config") - -# Invoke `best available' front-end for the current display environment. -# Prefers X, then curses, falls back to line-oriented if neither is available. -config: create_config_out - $(KBUILD_QUIET)$(cmlconfigure) -i config.out $(cmlopts) - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Line-oriented front end. Useful mainly for ruleset debugging. -ttyconfig: create_config_out - $(KBUILD_QUIET)$(cmlconfigure) -t -i config.out $(cmlopts) - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Screen-oriented front end using curses. -menuconfig: create_config_out - $(KBUILD_QUIET)$(cmlconfigure) -c -i config.out $(cmlopts) - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Original X front end. -xconfig: create_config_out - $(KBUILD_QUIET)$(cmlconfigure) -x -i config.out $(cmlopts) - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Alternate X front end using a tree widget. -treeconfig: create_config_out - $(KBUILD_QUIET)$(cmlconfigure) -q -i config.out $(cmlopts) - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Update configuration. Symbols set in your existing config will be frozen. -oldconfig: create_config_out - $(KBUILD_QUIET)$(cmlconfigure) -t -B $(KERNELRELEASE) -I config.out $(CONFIGOPTS) rules.out - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Create a default configuration for the specified architecture. -defconfig: create_config_out - $(KBUILD_QUIET)yes '' | ($(cmlconfigure) -t -B $(KERNELRELEASE) -I config.out $(CONFIGOPTS) rules.out) - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# CML2 Adventure. -advent: create_config_out - cd $(tmp_config_links); $(PYTHON2) -O scripts/cmladvent.py -t -D$(ARCHSYMBOL) -B $(KERNELRELEASE) -I config.out $(CONFIGOPTS) rules.out - $(KBUILD_QUIET)$(cml.config) - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -# Generate a map of the configuration menus. -$(scripts_objtree)menu-map: $(tmp_config_links)rules.out - $(KBUILD_QUIET)$(cmlconfigure) -l $(CONFIGOPTS) rules.out > $@ 2>&1 - @$(tmp_config_copyback) - @$(split_config) - @$(note_cml_inputs) - -CLEAN += scripts/*.py[co] - -# CML2 documentation -- these require docbook-tools and jade. -# FIXME: Commented out for now, cml2-paper does not exist, cml2-reference is in -# Documentation/kbuild, not here. Add support for this later. KAO -# -#cml2-paper.html: cml2-paper.sgml -# docbook2html --nochunks cml2-paper.sgml >cml2-paper.html -# -#cml2-reference.html: cml2-reference.sgml -# docbook2html --nochunks cml2-reference.sgml >cml2-reference.html - - -endif -# End of CML2 code # The patch command does not set execute permission on scripts, which is a big # nuisance. A tar ball will have the correct permissions in the source tree, a @@ -1173,7 +923,7 @@ # otherwise you will get some generated files in the symlink forest. # ' s 1 ' selects primary source files, i.e. the master copy. Only use source -# files that are marked "shadow_source'. +# files that are marked "shadow_source". # FIXME: The for loop adds entries for the generated files that are incorrectly # shipped in the kernel tarball, to prevent them looking like spurious --- linux/symbols-2.5.cml.original Fri May 24 09:09:48 2002 +++ /dev/null Sat May 12 19:23:16 2001 @@ -1,176 +0,0 @@ -# Additional symbols for kbuild 2.5, merge with the main list later. - -symbols -VMLINUX_help 'vmlinux' text -This is the raw format that is produced by the kernel build. It is -required to use any of the various source debugging tools on the kernel -itself and is the only bootable format on some architectures. It is -generally too large to be used otherwise. - -Note that the `vmlinux' format is produced by ALL compilations, either -as the target step, or as an intermediate step in the production of one -of the other formats. -. -VMLINUZ_help 'vmlinuz' text -vmlinux after being stripped to remove debugging information then -compressed using gzip. This is still the same basic format as vmlinux, -just smaller. -. -ZIMAGE_help 'zImage' text -This is the result of running the vmlinux format kernel through `gzip --9` to produce a much compressed version of the same, then adding a old -style ix86 boot routine. - -This format can only boot if the resultant image is less than 508k in -size. As a result, it is of little use with recent kernels. Only use -zImage if your hardware will not boot with bzImage, and only after a -kernel hacker says to use zImage. This format may be removed. -. -BZIMAGE_help 'bzImage' text -This is the result of running the vmlinux format kernel through `gzip --9` but it has a newer ix86 boot routine that can handle kernels whose -compressed size exceeds 508k. In theory, the boot routine can handle -kernel image files up to 15M in size, but this limit has not yet been -tested. - -Note that bzImage format does NOT use the `bzip' or `bzip2' compression -programs, as some have suggested. -. -VMLINUX_SREC_help 'vmlinux.srec' text -This is the vmlinux file converted to Motorola S-Record format, often -required for transferring the kernel to boot loaders on embedded -systems. -. -VMLINUX_BIN_help 'vmlinux.bin' text -This is the raw kernel image in binary format -- an exact copy of which -is loaded into memory before booting. This is used for primitive -bootloaders on embedded systems, which cannot understand ELF or SREC -images, or when the kernel is to reside in flash and be executed -directly. -. - -INSTALL_PREFIX 'Use a prefix on install paths' text -If you want to copy the installed kernel and modules to another machine -or you are installing on another disk on this machine, you can set a -prefix on the install paths. To install in the standard locations on -the current machine, do not set an install prefix. Most users will -want N. -. -INSTALL_PREFIX_NAME 'Prefix for install paths' text -This string is prefixed to all the paths when installing the kernel and -modules. If you want to copy the installed kernel and modules to -another machine or another disk, use the install prefix to point to -another directory, say "/var/tmp". The target directories will be -created under this prefix, if necessary. - -Modules are always installed in -CONFIG_INSTALL_PREFIX_NAME/lib/modules/KERNELRELEASE. - -Any words in the path that start with an upper case letter and consist -only of upper case letters, '_' and digits are replaced by the value of -the corresponding variable. This includes KERNELRELEASE, VERSION, -PATCHLEVEL, SUBLEVEL, EXTRAVERSION, USERVERSION, KBUILD_SRCTREE_nnn. -. -INSTALL_KERNEL_NAME 'Where to install the kernel' text -Specifies which file name the kernel will be installed under. If your -boot loader requires the kernel to be in a specific directory or in a -specific area of the disk then follow the loader instructions. -Otherwise follow the standard for your distribution, or your own -preference. The path will be prefixed by CONFIG_INSTALL_PREFIX. - -Any words in the path that start with an upper case letter and consist -only of upper case letters, '_' and digits are replaced by the value of -the corresponding variable. This includes KERNELRELEASE, VERSION, -PATCHLEVEL, SUBLEVEL, EXTRAVERSION, USERVERSION, KBUILD_SRCTREE_nnn. -KERNELFULLNAME and KERNELBASENAME are set to the full name (relative -to the object directory) and the base name of the kernel respectively. - -Examples: /boot/efi/KERNELBASENAME-KERNELRELEASE - IA64 requires - /boot/efi - /boot/KERNELBASENAME-KERNELRELEASE - old "standard" - /lib/modules/KERNELRELEASE/KERNELBASENAME - preferred, - unless the boot loader or lack of space requires another - location. -. -INSTALL_SYSTEM_MAP 'Install System.map' text -The System.map is not required for booting, but it is used by a lot of -kernel utilities, including ps and ksymoops. Unless you have a good -reason not to install the System.map, say Y. -. -INSTALL_SYSTEM_MAP_NAME 'Where to install System.map' text -Specifies which file name the System.map will be installed under. -Because System.map is not required for booting, it should not be -installed in a special boot directory. Unless you have a good reason -to install System.map somewhere else, use the default value of -/lib/modules/KERNELRELEASE/System.map. The path will be prefixed by -CONFIG_INSTALL_PREFIX. - -Any words in the path that start with an upper case letter and consist -only of upper case letters, '_' and digits are replaced by the value of -the corresponding variable. This includes KERNELRELEASE, VERSION, -PATCHLEVEL, SUBLEVEL, EXTRAVERSION, USERVERSION, KBUILD_SRCTREE_nnn. -. -INSTALL_CONFIG 'Install .config' text -It is a good idea to save the .config used to build the kernel and -modules, it is useful for bug reporting and for building a new version -of the kernel. Unless you have a good reason not to install the -.config, say Y. -. -INSTALL_CONFIG_NAME 'Where to install .config' text -Specifies which file name the .config will be installed under. Because -.config is not required for booting, it should not be installed in a -special boot directory. Unless you have a good reason to install -.config somewhere else, use the default value of -/lib/modules/KERNELRELEASE/.config. The path will be prefixed by -CONFIG_INSTALL_PREFIX. - -Any words in the path that start with an upper case letter and consist -only of upper case letters, '_' and digits are replaced by the value of -the corresponding variable. This includes KERNELRELEASE, VERSION, -PATCHLEVEL, SUBLEVEL, EXTRAVERSION, USERVERSION, KBUILD_SRCTREE_nnn. -. -INSTALL_VMLINUX 'Install vmlinux for debugging' text -If you are debugging a kernel, you usually need vmlinux as well as the -bootable kernel. Unless you plan to debug the kernel, reply N. -. -INSTALL_VMLINUX_NAME 'Where to install vmlinux' text -If you are debugging a kernel, you usually need vmlinux as well as the -bootable kernel. For debugging, the recommended value is -/lib/modules/KERNELRELEASE/vmlinux. The path will be prefixed by -CONFIG_INSTALL_PREFIX. - -Any words in the path that start with an upper case letter and consist -only of upper case letters, '_' and digits are replaced by the value of -the corresponding variable. This includes KERNELRELEASE, VERSION, -PATCHLEVEL, SUBLEVEL, EXTRAVERSION, USERVERSION, KBUILD_SRCTREE_nnn. -. -INSTALL_SCRIPT 'Run a post-install script or command' text -If you perform some extra work after installing the kernel and modules, -specify Y here. This includes automatically updating your boot loader -with the new kernel. -. -INSTALL_SCRIPT_NAME 'Post-install script or command name' text -If you perform some extra work after installing the kernel and modules, -specify the name of your script or command here. It will be invoked -after copying the kernel and modules to the target locations. The -CONFIG_INSTALL_* variables will be in the environment of your script, -as well as all variables exported by the top level Makefile, including -KERNELRELEASE, VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION, -USERVERSION, KBUILD_OBJTREE, KBUILD_SRCTREE_nnn. - -If your boot loader needs to be run to pick up the new kernel location, -you can insert the loader command in this field. The command or script -must be executable. LILO users might find this to be useful, - KBUILD_SRCTREE_000/scripts/lilo_new_kernel -It adds CONFIG_INSTALL_PREFIX_NAME/CONFIG_INSTALL_KERNEL_NAME to -/etc/lilo.conf with a label of KERNELRELEASE (truncated to 15 -characters) then runs lilo. - -Any words in the path that start with an upper case letter and consist -only of upper case letters, '_' and digits are replaced by the value of -the corresponding variable. This includes KERNELRELEASE, VERSION, -PATCHLEVEL, SUBLEVEL, EXTRAVERSION, USERVERSION, KBUILD_SRCTREE_nnn. -. - -menus addon "Add on features (may be empty)" - installation "Installation"
msg01469/pgp00000.pgp
Description: PGP signature