037——加入Kconfig机制

devtools/2024/10/18 18:27:15/

目录

Kconfig-toc" style="margin-left:40px;">一、什么是Kconfig

1.1 由来

1.2 功能

Kconfig%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95-toc" style="margin-left:40px;">二、 Kconfig的基本语法

Kconfig%20%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E8%A7%A3%E6%9E%90-toc" style="margin-left:80px;">2.1 Kconfig 构建项目解析

2.2 怎么调用子makefile做menuconfig

方法一:使用make命令直接调用子目录

方法二:使用变量来指定子目录

方法三:使用include指令包含子目录的Makefile

2.2 学习大佬的代码


 

Kconfig Language — The Linux Kernel documentation

Kconfig" style="background-color:transparent;">一、什么是Kconfig

1.1 由来

        Kconfig的由来可以追溯到Linux内核配置系统的演变和发展。随着Linux内核的日益复杂,对于内核的配置和管理也变得越来越重要。为了满足不同硬件和需求的配置要求,Linux内核需要一个灵活且强大的配置系统。

        在这样的背景下,Kconfig作为Linux内核配置系统的核心组成部分应运而生。它起源于对内核配置需求的深入理解和分析,旨在提供一种结构化、可维护且易于使用的配置方式。

        Kconfig的设计允许开发人员定义各种配置选项,并通过层次化的目录结构来组织这些选项。它使用了一种简洁而强大的语法,使得开发人员能够轻松地描述内核配置菜单和选项,并提供给用户一个交互式的配置界面。

        通过Kconfig,用户可以根据自己的需求选择和配置内核功能,从而定制出符合自己硬件和需求的内核版本。同时,Kconfig也提供了一种可维护的方式,使得内核的配置信息能够随着内核版本的更新而更新,保持与内核代码的同步。

1.2 功能

        Kconfig是Linux内核配置系统中使用的配置语言,也是各种配置界面的源文件。它允许开发人员定义各种配置选项,并提供交互式的配置界面,使用户可以通过菜单、配置项等方式来选择和配置内核功能。

        内核的配置工具会读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。这些Kconfig文件存在于Linux源码树的各个子目录中,并组成一个层次结构。开发者可以通过make menuconfig或make xconfig等命令打开Kconfig配置界面,并进行相应的配置操作。

Kconfig%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95">二、 Kconfig的基本语法

Kconfig%20%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E8%A7%A3%E6%9E%90">2.1 Kconfig 构建项目解析

学习肯定要站在巨人的肩膀上直接看linux的源码

VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 88
EXTRAVERSION =
NAME = Roaring Lionus# *DOCUMENTATION*
# To see a list of typical targets execute "make help"
# More info can be located in ./README
# Comments in this file are targeted only to the developer, do not
# expect to learn how to build the kernel reading this file.# o Do not use make's built-in rules and variables
#   (this increases performance and avoids hard-to-debug behaviour);
# o Look for make include files relative to root of kernel src
MAKEFLAGS += -rR --include-dir=$(CURDIR)# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC# Avoid interference with shell env settings
unexport GREP_OPTIONS# We are using a recursive build, so we need to do a little thinking
# to get the ordering right.
#
# Most importantly: sub-Makefiles should only ever modify files in
# their own directory. If in some directory we have a dependency on
# a file in another dir (which doesn't happen often, but it's often
# unavoidable when linking the built-in.o targets which finally
# turn into vmlinux), we will call a sub make in that other dir, and
# after that we are sure that everything which is in that other dir
# is now up to date.
#
# The only cases where we need to modify files which have global
# effects are thus separated out and done before the recursive
# descending is started. They are now explicitly listed as the
# prepare rule.# Beautify output
# ---------------------------------------------------------------------------
#
# Normally, we echo the whole command before executing it. By making
# that echo $($(quiet)$(cmd)), we now have the possibility to set
# $(quiet) to choose other forms of output instead, e.g.
#
#         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
#         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
#
# If $(quiet) is empty, the whole command will be printed.
# If it is set to "quiet_", only the short version will be printed.
# If it is set to "silent_", nothing will be printed at all, since
# the variable $(silent_cmd_cc_o_c) doesn't exist.
#
# A simple variant is to prefix commands with $(Q) - that's useful
# for commands that shall be hidden in non-verbose mode.
#
#	$(Q)ln $@ :<
#
# If KBUILD_VERBOSE equals 0 then the above command will be hidden.
# If KBUILD_VERBOSE equals 1 then the above command is displayed.
#
# To put more focus on warnings, be less verbose as default
# Use 'make V=1' to see the full commandsifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSEKBUILD_VERBOSE = 0
endififeq ($(KBUILD_VERBOSE),1)quiet =Q =
elsequiet=quiet_Q = @
endif# If the user is running make -s (silent mode), suppress echoing of
# commandsifneq ($(filter 4.%,$(MAKE_VERSION)),)	# make-4
ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)quiet=silent_tools_silent=s
endif
else					# make-3.8x
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)quiet=silent_tools_silent=-s
endif
endifexport quiet Q KBUILD_VERBOSE# kbuild supports saving output files in a separate directory.
# To locate output files in a separate directory two syntaxes are supported.
# In both cases the working directory must be the root of the kernel src.
# 1) O=
# Use "make O=dir/to/store/output/files/"
#
# 2) Set KBUILD_OUTPUT
# Set the environment variable KBUILD_OUTPUT to point to the directory
# where the output files shall be placed.
# export KBUILD_OUTPUT=dir/to/store/output/files/
# make
#
# The O= assignment takes precedence over the KBUILD_OUTPUT environment
# variable.# KBUILD_SRC is set on invocation of make in OBJ directory
# KBUILD_SRC is not intended to be used by the regular user (for now)
ifeq ($(KBUILD_SRC),)# OK, Make called in directory where kernel src resides
# Do we want to locate output files in a separate directory?
ifeq ("$(origin O)", "command line")KBUILD_OUTPUT := $(O)
endif# That's our default target when none is given on the command line
PHONY := _all
_all:# Cancel implicit rules on top Makefile
$(CURDIR)/Makefile Makefile: ;ifneq ($(words $(subst :, ,$(CURDIR))), 1)$(error main directory cannot contain spaces nor colons)
endififneq ($(KBUILD_OUTPUT),)
# Invoke a second make in the output directory, passing relevant variables
# check that the output directory actually exists
saved-output := $(KBUILD_OUTPUT)
KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) \&& /bin/pwd)
$(if $(KBUILD_OUTPUT),, \$(error failed to create output directory "$(saved-output)"))PHONY += $(MAKECMDGOALS) sub-make$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make@:sub-make:$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))# Leave processing to above invocation of make
skip-makefile := 1
endif # ifneq ($(KBUILD_OUTPUT),)
endif # ifeq ($(KBUILD_SRC),)# We process the rest of the Makefile if this is the final invocation of make
ifeq ($(skip-makefile),)# Do not print "Entering directory ...",
# but we want to display it when entering to the output directory
# so that IDEs/editors are able to understand relative filenames.
MAKEFLAGS += --no-print-directory# Call a source code checker (by default, "sparse") as part of the
# C compilation.
#
# Use 'make C=1' to enable checking of only re-compiled files.
# Use 'make C=2' to enable checking of *all* source files, regardless
# of whether they are re-compiled or not.
#
# See the file "Documentation/sparse.txt" for more details, including
# where to get the "sparse" utility.ifeq ("$(origin C)", "command line")KBUILD_CHECKSRC = $(C)
endif
ifndef KBUILD_CHECKSRCKBUILD_CHECKSRC = 0
endif# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRSKBUILD_EXTMOD ?= $(SUBDIRS)
endififeq ("$(origin M)", "command line")KBUILD_EXTMOD := $(M)
endif# If building an external module we do not care about the all: rule
# but instead _all depend on modules
PHONY += all
ifeq ($(KBUILD_EXTMOD),)
_all: all
else
_all: modules
endififeq ($(KBUILD_SRC),)# building in the source treesrctree := .
elseifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))# building in a subdirectory of the source treesrctree := ..elsesrctree := $(KBUILD_SRC)endif
endif
objtree		:= .
src		:= $(srctree)
obj		:= $(objtree)VPATH		:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))export srctree objtree VPATH# SUBARCH tells the usermode build what the underlying arch is.  That is set
# first, and if a usermode build is happening, the "ARCH=um" on the command
# line overrides the setting of ARCH below.  If a native build is happening,
# then ARCH is assigned, getting whatever value it gets normally, and
# SUBARCH is subsequently ignored.SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \-e s/sun4u/sparc64/ \-e s/arm.*/arm/ -e s/sa110/arm/ \-e s/s390x/s390/ -e s/parisc64/parisc/ \-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \-e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )# Cross compiling and selecting different set of gcc/bin-utils
# ---------------------------------------------------------------------------
#
# When performing cross compilation for other architectures ARCH shall be set
# to the target architecture. (See arch/* for the possibilities).
# ARCH can be set during invocation of make:
# make ARCH=ia64
# Another way is to have ARCH set in the environment.
# The default ARCH is the host where make is executed.# CROSS_COMPILE specify the prefix used for all executables used
# during compilation. Only gcc and related bin-utils executables
# are prefixed with $(CROSS_COMPILE).
# CROSS_COMPILE can be set on the command line
# make CROSS_COMPILE=ia64-linux-
# Alternatively CROSS_COMPILE can be set in the environment.
# A third alternative is to store a setting in .config so that plain
# "make" in the configured kernel build directory always uses that.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
ARCH		?= $(SUBARCH)
CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)# Architecture as present in compile.h
UTS_MACHINE 	:= $(ARCH)
SRCARCH 	:= $(ARCH)# Additional ARCH settings for x86
ifeq ($(ARCH),i386)SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)SRCARCH := x86
endif# Additional ARCH settings for sparc
ifeq ($(ARCH),sparc32)SRCARCH := sparc
endif
ifeq ($(ARCH),sparc64)SRCARCH := sparc
endif# Additional ARCH settings for sh
ifeq ($(ARCH),sh64)SRCARCH := sh
endif# Additional ARCH settings for tile
ifeq ($(ARCH),tilepro)SRCARCH := tile
endif
ifeq ($(ARCH),tilegx)SRCARCH := tile
endif# Where to locate arch specific headers
hdr-arch  := $(SRCARCH)KCONFIG_CONFIG	?= .config
export KCONFIG_CONFIG# SHELL used by kbuild
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \else if [ -x /bin/bash ]; then echo /bin/bash; \else echo sh; fi ; fi)HOSTCC       = gcc
HOSTCXX      = g++
HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
HOSTCXXFLAGS = -O2ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
HOSTCFLAGS  += -Wno-unused-value -Wno-unused-parameter \-Wno-missing-field-initializers -fno-delete-null-pointer-checks
endif# Decide whether to build built-in, modular, or both.
# Normally, just do built-in.KBUILD_MODULES :=
KBUILD_BUILTIN := 1# If we have only "make modules", don't compile built-in objects.
# When we're building modules with modversions, we need to consider
# the built-in objects during the descend as well, in order to
# make sure the checksums are up to date before we record them.ifeq ($(MAKECMDGOALS),modules)KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
endif# If we have "make <whatever> modules", compile modules
# in addition to whatever we do anyway.
# Just "make" or "make all" shall build modules as wellifneq ($(filter all _all modules,$(MAKECMDGOALS)),)KBUILD_MODULES := 1
endififeq ($(MAKECMDGOALS),)KBUILD_MODULES := 1
endifexport KBUILD_MODULES KBUILD_BUILTIN
export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD# We need some generic definitions (do not try to remake the file).
scripts/Kbuild.include: ;
include scripts/Kbuild.include# Make variables (CC, etc...)
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
AWK		= awk
GENKSYMS	= scripts/genksyms/genksyms
INSTALLKERNEL  := installkernel
DEPMOD		= /sbin/depmod
PERL		= perl
PYTHON		= python
CHECK		= sparseCHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \-Wbitwise -Wno-return-void $(CF)
NOSTDINC_FLAGS  =
CFLAGS_MODULE   =
AFLAGS_MODULE   =
LDFLAGS_MODULE  =
CFLAGS_KERNEL	=
AFLAGS_KERNEL	=
LDFLAGS_vmlinux =# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE    := \-I$(srctree)/arch/$(hdr-arch)/include/uapi \-I$(objtree)/arch/$(hdr-arch)/include/generated/uapi \-I$(srctree)/include/uapi \-I$(objtree)/include/generated/uapi \-include $(srctree)/include/linux/kconfig.h# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE    := \-I$(srctree)/arch/$(hdr-arch)/include \-I$(objtree)/arch/$(hdr-arch)/include/generated/uapi \-I$(objtree)/arch/$(hdr-arch)/include/generated \$(if $(KBUILD_SRC), -I$(srctree)/include) \-I$(objtree)/includeLINUXINCLUDE	+= $(filter-out $(LINUXINCLUDE),$(USERINCLUDE))KBUILD_AFLAGS   := -D__ASSEMBLY__
KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \-fno-strict-aliasing -fno-common \-Werror-implicit-function-declaration \-Wno-format-security \-std=gnu89
KBUILD_CPPFLAGS := -D__KERNEL__
KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=
KBUILD_AFLAGS_MODULE  := -DMODULE
KBUILD_CFLAGS_MODULE  := -DMODULE
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
GCC_PLUGINS_CFLAGS :=# Read KERNELRELEASE from include/config/kernel.release (if it exists)
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM STRIP OBJCOPY OBJDUMP
export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGSexport KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_KASAN CFLAGS_UBSAN
export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
export KBUILD_ARFLAGS# When compiling out-of-tree modules, put MODVERDIR in the module
# tree rather than in the kernel tree. The kernel tree might
# even be read-only.
export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions# Files to ignore in find ... statementsexport RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \-name CVS -o -name .pc -o -name .hg -o -name .git \) \-prune -o
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \--exclude CVS --exclude .pc --exclude .hg --exclude .git# ===========================================================================
# Rules shared between *config targets and build targets# Basic helpers built in scripts/
PHONY += scripts_basic
scripts_basic:$(Q)$(MAKE) $(build)=scripts/basic$(Q)rm -f .tmp_quiet_recordmcount# To avoid any implicit rule to kick in, define an empty command.
scripts/basic/%: scripts_basic ;PHONY += outputmakefile
# outputmakefile generates a Makefile in the output directory, if using a
# separate output directory. This allows convenient use of make in the
# output directory.
outputmakefile:
ifneq ($(KBUILD_SRC),)$(Q)ln -fsn $(srctree) source$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif# Support for using generic headers in asm-generic
PHONY += asm-generic
asm-generic:$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \src=asm obj=arch/$(SRCARCH)/include/generated/asm$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \src=uapi/asm obj=arch/$(SRCARCH)/include/generated/uapi/asm# To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile
# It is allowed to specify more targets when calling make, including
# mixing *config targets and build targets.
# For example 'make oldconfig all'.
# Detect when mixed targets is specified, and make a second invocation
# of make so .config is not included in this case either (for *config).version_h := include/generated/uapi/linux/version.h
old_version_h := include/linux/version.hno-dot-config-targets := clean mrproper distclean \cscope gtags TAGS tags help% %docs check% coccicheck \$(version_h) headers_% archheaders archscripts \kernelversion %src-pkgconfig-targets := 0
mixed-targets  := 0
dot-config     := 1ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)dot-config := 0endif
endififeq ($(KBUILD_EXTMOD),)ifneq ($(filter config %config,$(MAKECMDGOALS)),)config-targets := 1ifneq ($(words $(MAKECMDGOALS)),1)mixed-targets := 1endifendif
endif
# install and module_install need also be processed one by one
ifneq ($(filter install,$(MAKECMDGOALS)),)ifneq ($(filter modules_install,$(MAKECMDGOALS)),)mixed-targets := 1endif
endififeq ($(mixed-targets),1)
# ===========================================================================
# We're called with mixed targets (*config and build targets).
# Handle them one by one.PHONY += $(MAKECMDGOALS) __build_one_by_one$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one@:__build_one_by_one:$(Q)set -e; \for i in $(MAKECMDGOALS); do \$(MAKE) -f $(srctree)/Makefile $$i; \doneelse
ifeq ($(config-targets),1)
# ===========================================================================
# *config targets only - make sure prerequisites are updated, and descend
# in scripts/kconfig to make the *config target# Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
# KBUILD_DEFCONFIG may point out an alternative default configuration
# used for 'make defconfig'
include arch/$(SRCARCH)/Makefile
export KBUILD_DEFCONFIG KBUILD_KCONFIGconfig: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/kconfig $@%config: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/kconfig $@else
# ===========================================================================
# Build targets only - this includes vmlinux, arch specific targets, clean
# targets and others. In general all targets except *config targets.ifeq ($(KBUILD_EXTMOD),)
# Additional helpers built in scripts/
# Carefully list dependencies so we do not try to build scripts twice
# in parallel
PHONY += scripts
scripts: scripts_basic include/config/auto.conf include/config/tristate.conf \asm-generic gcc-plugins$(Q)$(MAKE) $(build)=$(@)# Objects we will link into vmlinux / subdirs we need to visit
init-y		:= init/
drivers-y	:= drivers/ sound/ firmware/
net-y		:= net/
libs-y		:= lib/
core-y		:= usr/
virt-y		:= virt/
endif # KBUILD_EXTMODifeq ($(dot-config),1)
# Read in config
-include include/config/auto.confifeq ($(KBUILD_EXTMOD),)
# Read in dependencies to all Kconfig* files, make sure to run
# oldconfig if changes are detected.
-include include/config/auto.conf.cmd# To avoid any implicit rule to kick in, define an empty command
$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;# If .config is newer than include/config/auto.conf, someone tinkered
# with it and forgot to run make oldconfig.
# if auto.conf.cmd is missing then we are probably in a cleaned tree so
# we execute the config step to be sure to catch updated Kconfig files
include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
else
# external modules needs include/generated/autoconf.h and include/config/auto.conf
# but do not care if they are up-to-date. Use auto.conf to trigger the test
PHONY += include/config/auto.confinclude/config/auto.conf:$(Q)test -e include/generated/autoconf.h -a -e $@ || (		\echo >&2;							\echo >&2 "  ERROR: Kernel configuration is invalid.";		\echo >&2 "         include/generated/autoconf.h or $@ are missing.";\echo >&2 "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\echo >&2 ;							\/bin/false)endif # KBUILD_EXTMODelse
# Dummy target needed, because used as prerequisite
include/config/auto.conf: ;
endif # $(dot-config)# For the kernel to actually contain only the needed exported symbols,
# we have to build modules as well to determine what those symbols are.
# (this can be evaluated only once include/config/auto.conf has been included)
ifdef CONFIG_TRIM_UNUSED_KSYMSKBUILD_MODULES := 1
endif# The all: target is the default when no target is given on the
# command line.
# This allow a user to issue only 'make' to build a kernel including modules
# Defaults to vmlinux, but the arch makefile usually adds further targets
all: vmlinuxKBUILD_CFLAGS	+= $(call cc-option,-fno-PIE)
KBUILD_AFLAGS	+= $(call cc-option,-fno-PIE)
CFLAGS_GCOV	:= -fprofile-arcs -ftest-coverage -fno-tree-loop-im $(call cc-disable-warning,maybe-uninitialized,)
CFLAGS_KCOV	:= $(call cc-option,-fsanitize-coverage=trace-pc,)
export CFLAGS_GCOV CFLAGS_KCOV# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
# values of the respective KBUILD_* variables
ARCH_CPPFLAGS :=
ARCH_AFLAGS :=
ARCH_CFLAGS :=
include arch/$(SRCARCH)/MakefileKBUILD_CFLAGS	+= $(call cc-option,-fno-delete-null-pointer-checks,)
KBUILD_CFLAGS	+= $(call cc-disable-warning,frame-address,)
KBUILD_CFLAGS	+= $(call cc-disable-warning, format-truncation)
KBUILD_CFLAGS	+= $(call cc-disable-warning, format-overflow)
KBUILD_CFLAGS	+= $(call cc-disable-warning, int-in-bool-context)ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
KBUILD_CFLAGS	+= $(call cc-option,-ffunction-sections,)
KBUILD_CFLAGS	+= $(call cc-option,-fdata-sections,)
endififdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS	+= -Os $(call cc-disable-warning,maybe-uninitialized,)
else
ifdef CONFIG_PROFILE_ALL_BRANCHES
KBUILD_CFLAGS	+= -O2 $(call cc-disable-warning,maybe-uninitialized,)
else
KBUILD_CFLAGS   += -O2
endif
endifKBUILD_CFLAGS += $(call cc-ifversion, -lt, 0409, \$(call cc-disable-warning,maybe-uninitialized,))# Tell gcc to never replace conditional load with a non-conditional one
KBUILD_CFLAGS	+= $(call cc-option,--param=allow-store-data-races=0)# check for 'asm goto'
ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTOKBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO
endifinclude scripts/Makefile.gcc-pluginsifdef CONFIG_READABLE_ASM
# Disable optimizations that make assembler listings hard to read.
# reorder blocks reorders the control in the function
# ipa clone creates specialized cloned functions
# partial inlining inlines only parts of functions
KBUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \$(call cc-option,-fno-ipa-cp-clone,) \$(call cc-option,-fno-partial-inlining)
endififneq ($(CONFIG_FRAME_WARN),0)
KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
endif# This selects the stack protector compiler flag. Testing it is delayed
# until after .config has been reprocessed, in the prepare-compiler-check
# target.
ifdef CONFIG_CC_STACKPROTECTOR_REGULARstackp-flag := -fstack-protectorstackp-name := REGULAR
else
ifdef CONFIG_CC_STACKPROTECTOR_STRONGstackp-flag := -fstack-protector-strongstackp-name := STRONG
else# Force off for distro compilers that enable stack protector by default.stackp-flag := $(call cc-option, -fno-stack-protector)
endif
endif
# Find arch-specific stack protector compiler sanity-checking script.
ifdef CONFIG_CC_STACKPROTECTORstackp-path := $(srctree)/scripts/gcc-$(SRCARCH)_$(BITS)-has-stack-protector.shstackp-check := $(wildcard $(stackp-path))
endif
KBUILD_CFLAGS += $(stackp-flag)ifeq ($(cc-name),clang)
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
# Quiet clang warning: comparison of unsigned expression < 0 is always false
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
# source of a reference will be _MergedGlobals and not on of the whitelisted names.
# See modpost pattern 2
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
else# These warnings generated too much noise in a regular build.
# Use make W=1 to enable them (see scripts/Makefile.build)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
endififdef CONFIG_FRAME_POINTER
KBUILD_CFLAGS	+= -fno-omit-frame-pointer -fno-optimize-sibling-calls
else
# Some targets (ARM with Thumb2, for example), can't be built with frame
# pointers.  For those, we don't have FUNCTION_TRACER automatically
# select FRAME_POINTER.  However, FUNCTION_TRACER adds -pg, and this is
# incompatible with -fomit-frame-pointer with current GCC, so we don't use
# -fomit-frame-pointer with FUNCTION_TRACER.
ifndef CONFIG_FUNCTION_TRACER
KBUILD_CFLAGS	+= -fomit-frame-pointer
endif
endifKBUILD_CFLAGS   += $(call cc-option, -fno-var-tracking-assignments)ifdef CONFIG_DEBUG_INFO
ifdef CONFIG_DEBUG_INFO_SPLIT
KBUILD_CFLAGS   += $(call cc-option, -gsplit-dwarf, -g)
else
KBUILD_CFLAGS	+= -g
endif
KBUILD_AFLAGS	+= -Wa,-gdwarf-2
endif
ifdef CONFIG_DEBUG_INFO_DWARF4
KBUILD_CFLAGS	+= $(call cc-option, -gdwarf-4,)
endififdef CONFIG_DEBUG_INFO_REDUCED
KBUILD_CFLAGS 	+= $(call cc-option, -femit-struct-debug-baseonly) \$(call cc-option,-fno-var-tracking)
endififdef CONFIG_FUNCTION_TRACER
ifndef CC_FLAGS_FTRACE
CC_FLAGS_FTRACE := -pg
endif
export CC_FLAGS_FTRACE
ifdef CONFIG_HAVE_FENTRY
CC_USING_FENTRY	:= $(call cc-option, -mfentry -DCC_USING_FENTRY)
endif
KBUILD_CFLAGS	+= $(CC_FLAGS_FTRACE) $(CC_USING_FENTRY)
KBUILD_AFLAGS	+= $(CC_USING_FENTRY)
ifdef CONFIG_DYNAMIC_FTRACEifdef CONFIG_HAVE_C_RECORDMCOUNTBUILD_C_RECORDMCOUNT := yexport BUILD_C_RECORDMCOUNTendif
endif
endif# We trigger additional mismatches with less inlining
ifdef CONFIG_DEBUG_SECTION_MISMATCH
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
endif# arch Makefile may override CC so keep this after arch Makefile is included
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
CHECKFLAGS     += $(NOSTDINC_FLAGS)# warn about C99 declaration after statement
KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)# disable pointer signed / unsigned warnings in gcc 4.0
KBUILD_CFLAGS += $(call cc-disable-warning, pointer-sign)# disable invalid "can't wrap" optimizations for signed / pointers
KBUILD_CFLAGS	+= $(call cc-option,-fno-strict-overflow)# Make sure -fstack-check isn't enabled (like gentoo apparently did)
KBUILD_CFLAGS  += $(call cc-option,-fno-stack-check,)# conserve stack if available
KBUILD_CFLAGS   += $(call cc-option,-fconserve-stack)# disallow errors like 'EXPORT_GPL(foo);' with missing header
KBUILD_CFLAGS   += $(call cc-option,-Werror=implicit-int)# require functions to have arguments in prototypes, not empty 'int foo()'
KBUILD_CFLAGS   += $(call cc-option,-Werror=strict-prototypes)# Prohibit date/time macros, which would make the build non-deterministic
KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)# enforce correct pointer usage
KBUILD_CFLAGS   += $(call cc-option,-Werror=incompatible-pointer-types)# use the deterministic mode of AR if available
KBUILD_ARFLAGS := $(call ar-option,D)include scripts/Makefile.kasan
include scripts/Makefile.extrawarn
include scripts/Makefile.ubsan# Add any arch overrides and user supplied CPPFLAGS, AFLAGS and CFLAGS as the
# last assignments
KBUILD_CPPFLAGS += $(ARCH_CPPFLAGS) $(KCPPFLAGS)
KBUILD_AFLAGS   += $(ARCH_AFLAGS)   $(KAFLAGS)
KBUILD_CFLAGS   += $(ARCH_CFLAGS)   $(KCFLAGS)# Use --build-id when available.
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\$(call cc-ldoption, -Wl$(comma)--build-id,))
KBUILD_LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
LDFLAGS_vmlinux	+= $(call ld-option, --gc-sections,)
endififeq ($(CONFIG_STRIP_ASM_SYMS),y)
LDFLAGS_vmlinux	+= $(call ld-option, -X,)
endif# Default kernel image to build when no specific target is given.
# KBUILD_IMAGE may be overruled on the command line or
# set in the environment
# Also any assignments in arch/$(ARCH)/Makefile take precedence over
# this default value
export KBUILD_IMAGE ?= vmlinux#
# INSTALL_PATH specifies where to place the updated kernel and system map
# images. Default is /boot, but you can set it to other values
export	INSTALL_PATH ?= /boot#
# INSTALL_DTBS_PATH specifies a prefix for relocations required by build roots.
# Like INSTALL_MOD_PATH, it isn't defined in the Makefile, but can be passed as
# an argument if needed. Otherwise it defaults to the kernel install path
#
export INSTALL_DTBS_PATH ?= $(INSTALL_PATH)/dtbs/$(KERNELRELEASE)#
# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
# relocations required by build roots.  This is not defined in the
# makefile but the argument can be passed to make if needed.
#MODLIB	= $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
export MODLIB#
# INSTALL_MOD_STRIP, if defined, will cause modules to be
# stripped after they are installed.  If INSTALL_MOD_STRIP is '1', then
# the default option --strip-debug will be used.  Otherwise,
# INSTALL_MOD_STRIP value will be used as the options to the strip command.ifdef INSTALL_MOD_STRIP
ifeq ($(INSTALL_MOD_STRIP),1)
mod_strip_cmd = $(STRIP) --strip-debug
else
mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
endif # INSTALL_MOD_STRIP=1
else
mod_strip_cmd = true
endif # INSTALL_MOD_STRIP
export mod_strip_cmd# CONFIG_MODULE_COMPRESS, if defined, will cause module to be compressed
# after they are installed in agreement with CONFIG_MODULE_COMPRESS_GZIP
# or CONFIG_MODULE_COMPRESS_XZ.mod_compress_cmd = true
ifdef CONFIG_MODULE_COMPRESSifdef CONFIG_MODULE_COMPRESS_GZIPmod_compress_cmd = gzip -n -fendif # CONFIG_MODULE_COMPRESS_GZIPifdef CONFIG_MODULE_COMPRESS_XZmod_compress_cmd = xz -fendif # CONFIG_MODULE_COMPRESS_XZ
endif # CONFIG_MODULE_COMPRESS
export mod_compress_cmd# Select initial ramdisk compression format, default is gzip(1).
# This shall be used by the dracut(8) tool while creating an initramfs image.
#
INITRD_COMPRESS-y                  := gzip
INITRD_COMPRESS-$(CONFIG_RD_BZIP2) := bzip2
INITRD_COMPRESS-$(CONFIG_RD_LZMA)  := lzma
INITRD_COMPRESS-$(CONFIG_RD_XZ)    := xz
INITRD_COMPRESS-$(CONFIG_RD_LZO)   := lzo
INITRD_COMPRESS-$(CONFIG_RD_LZ4)   := lz4
# do not export INITRD_COMPRESS, since we didn't actually
# choose a sane default compression above.
# export INITRD_COMPRESS := $(INITRD_COMPRESS-y)ifdef CONFIG_MODULE_SIG_ALL
$(eval $(call config_filename,MODULE_SIG_KEY))mod_sign_cmd = scripts/sign-file $(CONFIG_MODULE_SIG_HASH) $(MODULE_SIG_KEY_SRCPREFIX)$(CONFIG_MODULE_SIG_KEY) certs/signing_key.x509
else
mod_sign_cmd = true
endif
export mod_sign_cmdifeq ($(KBUILD_EXTMOD),)
core-y		+= kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \$(core-y) $(core-m) $(drivers-y) $(drivers-m) \$(net-y) $(net-m) $(libs-y) $(libs-m) $(virt-y)))vmlinux-alldirs	:= $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \$(init-) $(core-) $(drivers-) $(net-) $(libs-) $(virt-))))init-y		:= $(patsubst %/, %/built-in.o, $(init-y))
core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
drivers-y	:= $(patsubst %/, %/built-in.o, $(drivers-y))
net-y		:= $(patsubst %/, %/built-in.o, $(net-y))
libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
libs-y		:= $(libs-y1) $(libs-y2)
virt-y		:= $(patsubst %/, %/built-in.o, $(virt-y))# Externally visible symbols (used by link-vmlinux.sh)
export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) $(virt-y)
export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
export LDFLAGS_vmlinux
# used by scripts/pacmage/Makefile
export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools)vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)# Include targets which we want to execute sequentially if the rest of the
# kernel build went well. If CONFIG_TRIM_UNUSED_KSYMS is set, this might be
# evaluated more than once.
PHONY += vmlinux_prereq
vmlinux_prereq: $(vmlinux-deps) FORCE
ifdef CONFIG_HEADERS_CHECK$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_GDB_SCRIPTS$(Q)ln -fsn `cd $(srctree) && /bin/pwd`/scripts/gdb/vmlinux-gdb.py
endif
ifdef CONFIG_TRIM_UNUSED_KSYMS$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \"$(MAKE) -f $(srctree)/Makefile vmlinux"
endif# standalone target for easier testing
include/generated/autoksyms.h: FORCE$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh trueARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)# Final link of vmlinux with optional arch pass after final linkcmd_link-vmlinux =                                                 \$(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ;       \$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE+$(call if_changed,link-vmlinux)# Build samples along the rest of the kernel
ifdef CONFIG_SAMPLES
vmlinux-dirs += samples
endif# The actual objects are generated when descending,
# make sure no implicit rule kicks in
$(sort $(vmlinux-deps)): $(vmlinux-dirs) ;# Handle descending into subdirectories listed in $(vmlinux-dirs)
# Preset locale variables to speed up the build process. Limit locale
# tweaks to this spot to avoid wrong language settings when running
# make menuconfig etc.
# Error messages still appears in the original languagePHONY += $(vmlinux-dirs)
$(vmlinux-dirs): prepare scripts$(Q)$(MAKE) $(build)=$@define filechk_kernel.releaseecho "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
endef# Store (new) KERNELRELEASE string in include/config/kernel.release
include/config/kernel.release: include/config/auto.conf FORCE$(call filechk,kernel.release)# Things we need to do before we recursively start building the kernel
# or the modules are listed in "prepare".
# A multi level approach is used. prepareN is processed before prepareN-1.
# archprepare is used in arch Makefiles and when processed asm symlink,
# version.h and scripts_basic is processed / created.# Listed in dependency order
PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3# prepare3 is used to check if we are building in a separate output directory,
# and if so do:
# 1) Check that make has not been executed in the kernel src $(srctree)
prepare3: include/config/kernel.release
ifneq ($(KBUILD_SRC),)@$(kecho) '  Using $(srctree) as source for kernel'$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \echo >&2 "  $(srctree) is not clean, please run 'make mrproper'"; \echo >&2 "  in the '$(srctree)' directory.";\/bin/false; \fi;
endif# prepare2 creates a makefile if using a separate output directory.
# From this point forward, .config has been reprocessed, so any rules
# that need to depend on updated CONFIG_* values can be checked here.
prepare2: prepare3 prepare-compiler-check outputmakefile asm-genericprepare1: prepare2 $(version_h) include/generated/utsrelease.h \include/config/auto.conf$(cmd_crmodverdir)archprepare: archheaders archscripts prepare1 scripts_basicprepare0: archprepare gcc-plugins$(Q)$(MAKE) $(build)=.# All the preparing..
prepare: prepare0 prepare-objtoolifdef CONFIG_STACK_VALIDATIONhas_libelf := $(call try-run,\echo "int main() {}" | $(HOSTCC) -xc -o /dev/null -lelf -,1,0)ifeq ($(has_libelf),1)objtool_target := tools/objtool FORCEelse$(warning "Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev, libelf-devel or elfutils-libelf-devel")SKIP_STACK_VALIDATION := 1export SKIP_STACK_VALIDATIONendif
endifPHONY += prepare-objtool
prepare-objtool: $(objtool_target)# Check for CONFIG flags that require compiler support. Abort the build
# after .config has been processed, but before the kernel build starts.
#
# For security-sensitive CONFIG options, we don't want to fallback and/or
# silently change which compiler flags will be used, since that leads to
# producing kernels with different security feature characteristics
# depending on the compiler used. (For example, "But I selected
# CC_STACKPROTECTOR_STRONG! Why did it build with _REGULAR?!")
PHONY += prepare-compiler-check
prepare-compiler-check: FORCE
# Make sure compiler supports requested stack protector flag.
ifdef stackp-nameifeq ($(call cc-option, $(stackp-flag)),)@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \$(stackp-flag) not supported by compiler >&2 && exit 1endif
endif
# Make sure compiler does not have buggy stack-protector support.
ifdef stackp-checkifneq ($(shell $(CONFIG_SHELL) $(stackp-check) $(CC) $(KBUILD_CPPFLAGS) $(biarch)),y)@echo Cannot use CONFIG_CC_STACKPROTECTOR_$(stackp-name): \$(stackp-flag) available but compiler is broken >&2 && exit 1endif
endif@:# Generate some files
# ---------------------------------------------------------------------------# KERNELRELEASE can change from a few different places, meaning version.h
# needs to be updated, so this check is forced on all buildsuts_len := 64
define filechk_utsrelease.hif [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2;    \exit 1;                                                         \fi;                                                               \(echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
endefdefine filechk_version.h(echo \#define LINUX_VERSION_CODE $(shell                         \expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
endef$(version_h): $(srctree)/Makefile FORCE$(call filechk,version.h)$(Q)rm -f $(old_version_h)include/generated/utsrelease.h: include/config/kernel.release FORCE$(call filechk,utsrelease.h)PHONY += headerdep
headerdep:$(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \$(srctree)/scripts/headerdep.pl -I$(srctree)/include# ---------------------------------------------------------------------------
# Firmware install
INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware
export INSTALL_FW_PATHPHONY += firmware_install
firmware_install:@mkdir -p $(objtree)/firmware$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_install# ---------------------------------------------------------------------------
# Kernel headers#Default location for installed headers
export INSTALL_HDR_PATH = $(objtree)/usr# If we do an all arch process set dst to asm-$(hdr-arch)
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)PHONY += archheaders
archheaders:PHONY += archscripts
archscripts:PHONY += __headers
__headers: $(version_h) scripts_basic asm-generic archheaders archscripts$(Q)$(MAKE) $(build)=scripts build_unifdefPHONY += headers_install_all
headers_install_all:$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh installPHONY += headers_install
headers_install: __headers$(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/uapi/asm/Kbuild),, \$(error Headers not exportable for the $(SRCARCH) architecture))$(Q)$(MAKE) $(hdr-inst)=include/uapi$(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/uapi/asm $(hdr-dst)PHONY += headers_check_all
headers_check_all: headers_install_all$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh checkPHONY += headers_check
headers_check: headers_install$(Q)$(MAKE) $(hdr-inst)=include/uapi HDRCHECK=1$(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/uapi/asm $(hdr-dst) HDRCHECK=1# ---------------------------------------------------------------------------
# Kernel selftestPHONY += kselftest
kselftest:$(Q)$(MAKE) -C tools/testing/selftests run_testskselftest-clean:$(Q)$(MAKE) -C tools/testing/selftests cleanPHONY += kselftest-merge
kselftest-merge:$(if $(wildcard $(objtree)/.config),, $(error No .config exists, config your kernel first!))$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh \-m $(objtree)/.config \$(srctree)/tools/testing/selftests/*/config+$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig# ---------------------------------------------------------------------------
# Modulesifdef CONFIG_MODULES# By default, build modules as wellall: modules# Build modules
#
# A module can be listed more than once in obj-m resulting in
# duplicate lines in modules.order files.  Those are removed
# using awk while concatenating to the final file.PHONY += modules
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order@$(kecho) '  Building modules, stage 2.';$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuildmodules.builtin: $(vmlinux-dirs:%=%/modules.builtin)$(Q)$(AWK) '!x[$$0]++' $^ > $(objtree)/modules.builtin%/modules.builtin: include/config/auto.conf$(Q)$(MAKE) $(modbuiltin)=$*# Target to prepare building external modules
PHONY += modules_prepare
modules_prepare: prepare scripts# Target to install modules
PHONY += modules_install
modules_install: _modinst_ _modinst_postPHONY += _modinst_
_modinst_:@rm -rf $(MODLIB)/kernel@rm -f $(MODLIB)/source@mkdir -p $(MODLIB)/kernel@ln -s `cd $(srctree) && /bin/pwd` $(MODLIB)/source@if [ ! $(objtree) -ef  $(MODLIB)/build ]; then \rm -f $(MODLIB)/build ; \ln -s $(CURDIR) $(MODLIB)/build ; \fi@cp -f $(objtree)/modules.order $(MODLIB)/@cp -f $(objtree)/modules.builtin $(MODLIB)/$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst# This depmod is only for convenience to give the initial
# boot a modules.dep even before / is mounted read-write.  However the
# boot script depmod is the master version.
PHONY += _modinst_post
_modinst_post: _modinst_$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modinst$(call cmd,depmod)ifeq ($(CONFIG_MODULE_SIG), y)
PHONY += modules_sign
modules_sign:$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modsign
endifelse # CONFIG_MODULES# Modules not configured
# ---------------------------------------------------------------------------PHONY += modules modules_install
modules modules_install:@echo >&2@echo >&2 "The present kernel configuration has modules disabled."@echo >&2 "Type 'make config' and enable loadable module support."@echo >&2 "Then build a kernel with module support enabled."@echo >&2@exit 1endif # CONFIG_MODULES###
# Cleaning is done on three levels.
# make clean     Delete most generated files
#                Leave enough to build external modules
# make mrproper  Delete the current configuration, and all generated files
# make distclean Remove editor backup files, patch leftover files and the like# Directories & files removed with 'make clean'
CLEAN_DIRS  += $(MODVERDIR)# Directories & files removed with 'make mrproper'
MRPROPER_DIRS  += include/config usr/include include/generated          \arch/*/include/generated .tmp_objdiff
MRPROPER_FILES += .config .config.old .version .old_version \Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \signing_key.pem signing_key.priv signing_key.x509	\x509.genkey extra_certificates signing_key.x509.keyid	\signing_key.x509.signer vmlinux-gdb.py# clean - Delete most, but leave enough to build external modules
#
clean: rm-dirs  := $(CLEAN_DIRS)
clean: rm-files := $(CLEAN_FILES)
clean-dirs      := $(addprefix _clean_, . $(vmlinux-alldirs) Documentation samples)PHONY += $(clean-dirs) clean archclean vmlinuxclean
$(clean-dirs):$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)vmlinuxclean:$(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean$(Q)$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) clean)clean: archclean vmlinuxclean# mrproper - Delete all generated files, including .config
#
mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS))
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
mrproper-dirs      := $(addprefix _mrproper_,Documentation/DocBook scripts)PHONY += $(mrproper-dirs) mrproper archmrproper
$(mrproper-dirs):$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)mrproper: clean archmrproper $(mrproper-dirs)$(call cmd,rmdirs)$(call cmd,rmfiles)# distclean
#
PHONY += distcleandistclean: mrproper@find $(srctree) $(RCS_FIND_IGNORE) \\( -name '*.orig' -o -name '*.rej' -o -name '*~' \-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \-o -name '.*.rej' -o -name '*%'  -o -name 'core' \) \-type f -print | xargs rm -f# Packaging of the kernel to various formats
# ---------------------------------------------------------------------------
# rpm target kept for backward compatibility
package-dir	:= scripts/package%src-pkg: FORCE$(Q)$(MAKE) $(build)=$(package-dir) $@
%pkg: include/config/kernel.release FORCE$(Q)$(MAKE) $(build)=$(package-dir) $@
rpm: include/config/kernel.release FORCE$(Q)$(MAKE) $(build)=$(package-dir) $@# Brief documentation of the typical targets used
# ---------------------------------------------------------------------------boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig)
boards := $(sort $(notdir $(boards)))
board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig))
board-dirs := $(sort $(notdir $(board-dirs:/=)))PHONY += help
help:@echo  'Cleaning targets:'@echo  '  clean		  - Remove most generated files but keep the config and'@echo  '                    enough build support to build external modules'@echo  '  mrproper	  - Remove all generated files + config + various backup files'@echo  '  distclean	  - mrproper + remove editor backup and patch files'@echo  ''@echo  'Configuration targets:'@$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help@echo  ''@echo  'Other generic targets:'@echo  '  all		  - Build all targets marked with [*]'@echo  '* vmlinux	  - Build the bare kernel'@echo  '* modules	  - Build all modules'@echo  '  modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'@echo  '  firmware_install- Install all firmware to INSTALL_FW_PATH'@echo  '                    (default: $$(INSTALL_MOD_PATH)/lib/firmware)'@echo  '  dir/            - Build all files in dir and below'@echo  '  dir/file.[ois]  - Build specified target only'@echo  '  dir/file.lst    - Build specified mixed source/assembly target only'@echo  '                    (requires a recent binutils and recent build (System.map))'@echo  '  dir/file.ko     - Build module including final link'@echo  '  modules_prepare - Set up for building external modules'@echo  '  tags/TAGS	  - Generate tags file for editors'@echo  '  cscope	  - Generate cscope index'@echo  '  gtags           - Generate GNU GLOBAL index'@echo  '  kernelrelease	  - Output the release version string (use with make -s)'@echo  '  kernelversion	  - Output the version stored in Makefile (use with make -s)'@echo  '  image_name	  - Output the image name (use with make -s)'@echo  '  headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \echo  '                    (default: $(INSTALL_HDR_PATH))'; \echo  ''@echo  'Static analysers'@echo  '  checkstack      - Generate a list of stack hogs'@echo  '  namespacecheck  - Name space analysis on compiled kernel'@echo  '  versioncheck    - Sanity check on version.h usage'@echo  '  includecheck    - Check for duplicate included header files'@echo  '  export_report   - List the usages of all exported symbols'@echo  '  headers_check   - Sanity check on exported headers'@echo  '  headerdep       - Detect inclusion cycles in headers'@$(MAKE) -f $(srctree)/scripts/Makefile.help checker-help@echo  ''@echo  'Kernel selftest'@echo  '  kselftest       - Build and run kernel selftest (run as root)'@echo  '                    Build, install, and boot kernel before'@echo  '                    running kselftest on it'@echo  '  kselftest-clean - Remove all generated kselftest files'@echo  '  kselftest-merge - Merge all the config dependencies of kselftest to existed'@echo  '                    .config.'@echo  ''@echo  'Kernel packaging:'@$(MAKE) $(build)=$(package-dir) help@echo  ''@echo  'Documentation targets:'@$(MAKE) -f $(srctree)/Documentation/Makefile.sphinx dochelp@echo  ''@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp@echo  ''@echo  'Architecture specific targets ($(SRCARCH)):'@$(if $(archhelp),$(archhelp),\echo '  No architecture specific help defined for $(SRCARCH)')@echo  ''@$(if $(boards), \$(foreach b, $(boards), \printf "  %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \echo '')@$(if $(board-dirs), \$(foreach b, $(board-dirs), \printf "  %-16s - Show %s-specific targets\\n" help-$(b) $(b);) \printf "  %-16s - Show all of the above\\n" help-boards; \echo '')@echo  '  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'@echo  '  make V=2   [targets] 2 => give reason for rebuild of target'@echo  '  make O=dir [targets] Locate all output files in "dir", including .config'@echo  '  make C=1   [targets] Check all c source with $$CHECK (sparse by default)'@echo  '  make C=2   [targets] Force check of all c source with $$CHECK'@echo  '  make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'@echo  '  make W=n   [targets] Enable extra gcc checks, n=1,2,3 where'@echo  '		1: warnings which may be relevant and do not occur too often'@echo  '		2: warnings which occur quite often but may still be relevant'@echo  '		3: more obscure warnings, can most likely be ignored'@echo  '		Multiple levels can be combined with W=12 or W=123'@echo  ''@echo  'Execute "make" or "make all" to build all targets marked with [*] '@echo  'For further info see the ./README file'help-board-dirs := $(addprefix help-,$(board-dirs))help-boards: $(help-board-dirs)boards-per-dir = $(sort $(notdir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/$*/*_defconfig)))$(help-board-dirs): help-%:@echo  'Architecture specific targets ($(SRCARCH) $*):'@$(if $(boards-per-dir), \$(foreach b, $(boards-per-dir), \printf "  %-24s - Build for %s\\n" $*/$(b) $(subst _defconfig,,$(b));) \echo '')# Documentation targets
# ---------------------------------------------------------------------------
DOC_TARGETS := xmldocs sgmldocs psdocs latexdocs pdfdocs htmldocs mandocs installmandocs epubdocs cleandocs
PHONY += $(DOC_TARGETS)
$(DOC_TARGETS): scripts_basic FORCE$(Q)$(MAKE) $(build)=scripts build_docproc build_check-lc_ctype$(Q)$(MAKE) $(build)=Documentation -f $(srctree)/Documentation/Makefile.sphinx $@$(Q)$(MAKE) $(build)=Documentation/DocBook $@else # KBUILD_EXTMOD###
# External module support.
# When building external modules the kernel used as basis is considered
# read-only, and no consistency checks are made and the make
# system is not used on the basis kernel. If updates are required
# in the basis kernel ordinary make commands (without M=...) must
# be used.
#
# The following are the only valid targets when building external
# modules.
# make M=dir clean     Delete all automatically generated files
# make M=dir modules   Make all modules in specified dir
# make M=dir	       Same as 'make M=dir modules'
# make M=dir modules_install
#                      Install the modules built in the module directory
#                      Assumes install directory is already created# We are always building modules
KBUILD_MODULES := 1
PHONY += crmodverdir
crmodverdir:$(cmd_crmodverdir)PHONY += $(objtree)/Module.symvers
$(objtree)/Module.symvers:@test -e $(objtree)/Module.symvers || ( \echo; \echo "  WARNING: Symbol version dump $(objtree)/Module.symvers"; \echo "           is missing; modules will have no dependencies and modversions."; \echo )module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
PHONY += $(module-dirs) modules
$(module-dirs): crmodverdir $(objtree)/Module.symvers$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)modules: $(module-dirs)@$(kecho) '  Building modules, stage 2.';$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpostPHONY += modules_install
modules_install: _emodinst_ _emodinst_postinstall-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
PHONY += _emodinst_
_emodinst_:$(Q)mkdir -p $(MODLIB)/$(install-dir)$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinstPHONY += _emodinst_post
_emodinst_post: _emodinst_$(call cmd,depmod)clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD))PHONY += $(clean-dirs) clean
$(clean-dirs):$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)clean:	rm-dirs := $(MODVERDIR)
clean: rm-files := $(KBUILD_EXTMOD)/Module.symversPHONY += help
help:@echo  '  Building external modules.'@echo  '  Syntax: make -C path/to/kernel/src M=$$PWD target'@echo  ''@echo  '  modules         - default target, build the module(s)'@echo  '  modules_install - install the module'@echo  '  clean           - remove generated files in module directory only'@echo  ''# Dummies...
PHONY += prepare scripts
prepare: ;
scripts: ;
endif # KBUILD_EXTMODclean: $(clean-dirs)$(call cmd,rmdirs)$(call cmd,rmfiles)@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \-o -name '*.ko.*' \-o -name '*.dwo'  \-o -name '*.su'  \-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \-o -name '*.symtypes' -o -name 'modules.order' \-o -name modules.builtin -o -name '.tmp_*.o.*' \-o -name '*.c.[012]*.*' \-o -name '*.gcno' \) -type f -print | xargs rm -f# Generate tags for editors
# ---------------------------------------------------------------------------
quiet_cmd_tags = GEN     $@cmd_tags = $(CONFIG_SHELL) $(srctree)/scripts/tags.sh $@tags TAGS cscope gtags: FORCE$(call cmd,tags)# Scripts to check various things for consistency
# ---------------------------------------------------------------------------PHONY += includecheck versioncheck coccicheck namespacecheck export_reportincludecheck:find $(srctree)/* $(RCS_FIND_IGNORE) \-name '*.[hcS]' -type f -print | sort \| xargs $(PERL) -w $(srctree)/scripts/checkincludes.plversioncheck:find $(srctree)/* $(RCS_FIND_IGNORE) \-name '*.[hcS]' -type f -print | sort \| xargs $(PERL) -w $(srctree)/scripts/checkversion.plcoccicheck:$(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@namespacecheck:$(PERL) $(srctree)/scripts/namespace.plexport_report:$(PERL) $(srctree)/scripts/export_report.plendif #ifeq ($(config-targets),1)
endif #ifeq ($(mixed-targets),1)PHONY += checkstack kernelrelease kernelversion image_name# UML needs a little special treatment here.  It wants to use the host
# toolchain, so needs $(SUBARCH) passed to checkstack.pl.  Everyone
# else wants $(ARCH), including people doing cross-builds, which means
# that $(SUBARCH) doesn't work here.
ifeq ($(ARCH), um)
CHECKSTACK_ARCH := $(SUBARCH)
else
CHECKSTACK_ARCH := $(ARCH)
endif
checkstack:$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \$(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)kernelrelease:@echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"kernelversion:@echo $(KERNELVERSION)image_name:@echo $(KBUILD_IMAGE)# Clear a bunch of variables before executing the submake
tools/: FORCE$(Q)mkdir -p $(objtree)/tools$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/tools/%: FORCE$(Q)mkdir -p $(objtree)/tools$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(shell cd $(objtree) && /bin/pwd) subdir=tools -C $(src)/tools/ $*# Single targets
# ---------------------------------------------------------------------------
# Single targets are compatible with:
# - build with mixed source and output
# - build with separate output dir 'make O=...'
# - external modules
#
#  target-dir => where to store outputfile
#  build-dir  => directory in kernel source tree to useifeq ($(KBUILD_EXTMOD),)build-dir  = $(patsubst %/,%,$(dir $@))target-dir = $(dir $@)
elsezap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))build-dir  = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
endif%.s: %.c prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.i: %.c prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.o: %.c prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.lst: %.c prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.s: %.S prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.o: %.S prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.symtypes: %.c prepare scripts FORCE$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)# Modules
/: prepare scripts FORCE$(cmd_crmodverdir)$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \$(build)=$(build-dir)
# Make sure the latest headers are built for Documentation
Documentation/ samples/: headers_install
%/: prepare scripts FORCE$(cmd_crmodverdir)$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \$(build)=$(build-dir)
%.ko: prepare scripts FORCE$(cmd_crmodverdir)$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \$(build)=$(build-dir) $(@:.ko=.o)$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost# FIXME Should go into a make.lib or something
# ===========================================================================quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN   $(wildcard $(rm-dirs)))cmd_rmdirs = rm -rf $(rm-dirs)quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN   $(wildcard $(rm-files)))cmd_rmfiles = rm -f $(rm-files)# Run depmod only if we have System.map and depmod is executable
quiet_cmd_depmod = DEPMOD  $(KERNELRELEASE)cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \$(KERNELRELEASE) "$(patsubst y,_,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))"# Create temporary dir for module support files
# clean it up only when building all modules
cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)# read all saved command linestargets := $(wildcard $(sort $(targets)))
cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))ifneq ($(cmd_files),)$(cmd_files): ;	# Do not try to update included dependency filesinclude $(cmd_files)
endifendif	# skip-makefilePHONY += FORCE
FORCE:# Declare the contents of the .PHONY variable as phony.  We keep that
# information in a variable so we can use it in if_changed and friends.
.PHONY: $(PHONY)

有人可能会好奇,我们不是要学Kconfig么,为什么会放过来一个makefile

看下面

我们项目顶层目录下make 

Linux源码的顶层目录下

找menuconfig的字样只有这个

按照刚刚的运行提示我们找Kconfig目录下的makefile可是进不去这个目录

原来是小写的

# ===========================================================================
# Kernel configuration targets
# These targets are used from top-level makefilePHONY += xconfig gconfig menuconfig config silentoldconfig update-po-config \localmodconfig localyesconfigifdef KBUILD_KCONFIG
Kconfig := $(KBUILD_KCONFIG)
else
Kconfig := Kconfig
endififeq ($(quiet),silent_)
silent := -s
endif# We need this, in case the user has it in its environment
unexport CONFIG_xconfig: $(obj)/qconf$< $(silent) $(Kconfig)gconfig: $(obj)/gconf$< $(silent) $(Kconfig)menuconfig: $(obj)/mconf$< $(silent) $(Kconfig)config: $(obj)/conf$< $(silent) --oldaskconfig $(Kconfig)nconfig: $(obj)/nconf$< $(silent) $(Kconfig)silentoldconfig: $(obj)/conf$(Q)mkdir -p include/config include/generated$(Q)test -e include/generated/autoksyms.h || \touch   include/generated/autoksyms.h$< $(silent) --$@ $(Kconfig)localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf$(Q)mkdir -p include/config include/generated$(Q)perl $< --$@ $(srctree) $(Kconfig) > .tmp.config$(Q)if [ -f .config ]; then 					\cmp -s .tmp.config .config ||			\(mv -f .config .config.old.1;			\mv -f .tmp.config .config;			\$(obj)/conf $(silent) --silentoldconfig $(Kconfig); \mv -f .config.old.1 .config.old)		\else								\mv -f .tmp.config .config;			\$(obj)/conf $(silent) --silentoldconfig $(Kconfig); \fi$(Q)rm -f .tmp.config# Create new linux.pot file
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h$(Q)$(kecho) "  GEN     config.pot"$(Q)xgettext --default-domain=linux                         \--add-comments --keyword=_ --keyword=N_                 \--from-code=UTF-8                                       \--files-from=$(srctree)/scripts/kconfig/POTFILES.in     \--directory=$(srctree) --directory=$(objtree)           \--output $(obj)/config.pot$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot$(Q)(for i in `ls $(srctree)/arch/*/Kconfig      \$(srctree)/arch/*/um/Kconfig`;               \do                                           \$(kecho) "  GEN     $$i";                    \$(obj)/kxgettext $$i                     \>> $(obj)/config.pot;               \done )$(Q)$(kecho) "  GEN     linux.pot"$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \--output $(obj)/linux.pot$(Q)rm -f $(obj)/config.pot# These targets map 1:1 to the commandline options of 'conf'
simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \alldefconfig randconfig listnewconfig olddefconfig
PHONY += $(simple-targets)$(simple-targets): $(obj)/conf$< $(silent) --$@ $(Kconfig)PHONY += oldnoconfig savedefconfig defconfig# oldnoconfig is an alias of olddefconfig, because people already are dependent
# on its behavior (sets new symbols to their default value but not 'n') with the
# counter-intuitive name.
oldnoconfig: olddefconfigsavedefconfig: $(obj)/conf$< $(silent) --$@=defconfig $(Kconfig)defconfig: $(obj)/conf
ifeq ($(KBUILD_DEFCONFIG),)$< $(silent) --defconfig $(Kconfig)
else
ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)@$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
else@$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'"$(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
endif
endif%_defconfig: $(obj)/conf$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@)%.config: $(obj)/conf$(if $(call configfiles),, $(error No configuration exists for this target on this architecture))$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles)+$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfigPHONY += kvmconfig
kvmconfig: kvm_guest.config@:PHONY += xenconfig
xenconfig: xen.config@:PHONY += tinyconfig
tinyconfig:$(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config# Help text used by make help
help:@echo  '  config	  - Update current config utilising a line-oriented program'@echo  '  nconfig         - Update current config utilising a ncurses menu based'@echo  '                    program'@echo  '  menuconfig	  - Update current config utilising a menu based program'@echo  '  xconfig	  - Update current config utilising a Qt based front-end'@echo  '  gconfig	  - Update current config utilising a GTK+ based front-end'@echo  '  oldconfig	  - Update current config utilising a provided .config as base'@echo  '  localmodconfig  - Update current config disabling modules not loaded'@echo  '  localyesconfig  - Update current config converting local mods to core'@echo  '  silentoldconfig - Same as oldconfig, but quietly, additionally update deps'@echo  '  defconfig	  - New config with default from ARCH supplied defconfig'@echo  '  savedefconfig   - Save current config as ./defconfig (minimal config)'@echo  '  allnoconfig	  - New config where all options are answered with no'@echo  '  allyesconfig	  - New config where all options are accepted with yes'@echo  '  allmodconfig	  - New config selecting modules when possible'@echo  '  alldefconfig    - New config with all symbols set to default'@echo  '  randconfig	  - New config with random answer to all options'@echo  '  listnewconfig   - List new options'@echo  '  olddefconfig	  - Same as silentoldconfig but sets new symbols to their'@echo  '                    default value'@echo  '  kvmconfig	  - Enable additional options for kvm guest kernel support'@echo  '  xenconfig       - Enable additional options for xen dom0 and guest kernel support'@echo  '  tinyconfig	  - Configure the tiniest possible kernel'# lxdialog stuff
check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh# Use recursively expanded variables so we do not call gcc unless
# we really need to do so. (Do not call gcc as part of make mrproper)
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \-DLOCALE# ===========================================================================
# Shared Makefile for the various kconfig executables:
# conf:	  Used for defconfig, oldconfig and related targets
# nconf:  Used for the nconfig target.
#         Utilizes ncurses
# mconf:  Used for the menuconfig target
#         Utilizes the lxdialog package
# qconf:  Used for the xconfig target
#         Based on Qt which needs to be installed to compile it
# gconf:  Used for the gconfig target
#         Based on GTK+ which needs to be installed to compile it
# object files used by all kconfig flavourslxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.oconf-objs	:= conf.o  zconf.tab.o
mconf-objs     := mconf.o zconf.tab.o $(lxdialog)
nconf-objs     := nconf.o zconf.tab.o nconf.gui.o
kxgettext-objs	:= kxgettext.o zconf.tab.o
qconf-cxxobjs	:= qconf.o
qconf-objs	:= zconf.tab.o
gconf-objs	:= gconf.o zconf.tab.ohostprogs-y := conf nconf mconf kxgettext qconf gconfclean-files	:= qconf.moc .tmp_qtcheck .tmp_gtkcheck
clean-files	+= zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h
clean-files     += config.pot linux.pot# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
PHONY += $(obj)/dochecklxdialog
$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
$(obj)/dochecklxdialog:$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTLOADLIBES_mconf)always := dochecklxdialog# Add environment specific flags
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))# generated files seem to need this to find local include files
HOSTCFLAGS_zconf.lex.o	:= -I$(src)
HOSTCFLAGS_zconf.tab.o	:= -I$(src)LEX_PREFIX_zconf	:= zconf
YACC_PREFIX_zconf	:= zconfHOSTLOADLIBES_qconf	= $(KC_QT_LIBS)
HOSTCXXFLAGS_qconf.o	= $(KC_QT_CFLAGS)HOSTLOADLIBES_gconf	= `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
HOSTCFLAGS_gconf.o	= `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \-Wno-missing-prototypesHOSTLOADLIBES_mconf   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))HOSTLOADLIBES_nconf	= $(shell \pkg-config --libs menuw panelw ncursesw 2>/dev/null \|| pkg-config --libs menu panel ncurses 2>/dev/null \|| echo "-lmenu -lpanel -lncurses"  )
$(obj)/qconf.o: $(obj)/.tmp_qtcheckifeq ($(MAKECMDGOALS),xconfig)
$(obj)/.tmp_qtcheck: $(src)/Makefile
-include $(obj)/.tmp_qtcheck# Qt needs some extra effort...
$(obj)/.tmp_qtcheck:@set -e; $(kecho) "  CHECK   qt"; \if pkg-config --exists Qt5Core; then \cflags="-std=c++11 -fPIC `pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets`"; \libs=`pkg-config --libs Qt5Core Qt5Gui Qt5Widgets`; \moc=`pkg-config --variable=host_bins Qt5Core`/moc; \elif pkg-config --exists QtCore; then \cflags=`pkg-config --cflags QtCore QtGui`; \libs=`pkg-config --libs QtCore QtGui`; \moc=`pkg-config --variable=moc_location QtCore`; \else \echo >&2 "*"; \echo >&2 "* Could not find Qt via pkg-config."; \echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH"; \echo >&2 "*"; \exit 1; \fi; \echo "KC_QT_CFLAGS=$$cflags" > $@; \echo "KC_QT_LIBS=$$libs" >> $@; \echo "KC_QT_MOC=$$moc" >> $@
endif$(obj)/gconf.o: $(obj)/.tmp_gtkcheckifeq ($(MAKECMDGOALS),gconfig)
-include $(obj)/.tmp_gtkcheck# GTK+ needs some extra effort, too...
$(obj)/.tmp_gtkcheck:@if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then		\if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then			\touch $@;								\else									\echo >&2 "*"; 							\echo >&2 "* GTK+ is present but version >= 2.0.0 is required.";	\echo >&2 "*";							\false;								\fi									\else										\echo >&2 "*"; 								\echo >&2 "* Unable to find the GTK+ installation. Please make sure that"; 	\echo >&2 "* the GTK+ 2.0 development package is correctly installed..."; 	\echo >&2 "* You need gtk+-2.0, glib-2.0 and libglade-2.0."; 		\echo >&2 "*"; 								\false;									\fi
endif$(obj)/zconf.tab.o: $(obj)/zconf.lex.c $(obj)/zconf.hash.c$(obj)/qconf.o: $(obj)/qconf.mocquiet_cmd_moc = MOC     $@cmd_moc = $(KC_QT_MOC) -i $< -o $@$(obj)/%.moc: $(src)/%.h $(obj)/.tmp_qtcheck$(call cmd,moc)# Extract gconf menu items for i18n support
$(obj)/gconf.glade.h: $(obj)/gconf.glade$(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \$(obj)/gconf.glade

果然menuconfig在这里

我们这次就不研究mconf的源码了拿来直接用

2.2 怎么调用子makefile做menuconfig

然后怎么用子目录中的makefile呢

我们的主makefile在build里通过build.py来使用。而子makefile在tools下

这里有三种方法

方法一:使用make命令直接调用子目录

你可以直接在Makefile中定义一个规则来调用子目录中的Makefile:

all:  
    @echo "Building in parent directory..."  
    # 执行父目录的构建任务  
    # ...  
    @echo "Building in subdirectory..."  
    $(MAKE) -C subdir

像这样直接-C指定

方法二:使用变量来指定子目录

        如果你有多个子目录需要构建,你可以定义一个变量来包含这些子目录的列表,并遍历这个列表来调用每个子目录中的Makefile:

SUBDIRS = subdir1 subdir2 subdir3  
  
all: $(SUBDIRS)  
  
$(SUBDIRS):  
    $(MAKE) -C $@  
  
.PHONY: all $(SUBDIRS)

        这种和第一种差不对只是会更规范一些。但是很明显这不是linux的那种方法。因为我们可以直接使用子make的伪目标。这两种都做不到。

方法三:使用include指令包含子目录的Makefile

我们来测试一下

tools刚刚少了个s。通过实验证明直接用makefile无效,上层调子层才能把export的传过去。

2.2 学习大佬的代码

我们把init下的拿来看看

好吧我们用不了他是配套的要c代码那面setenv然后去配置env的。

# 这是一个简单的 Kconfig 文件示例

menu "My Demo Options"

config MY_DEMO_FEATURE

    bool "Enable my demo feature"

    default y

    help

      This is a simple demo feature. If you enable this,some extra functionality will be compiled into the kernel.

config MY_DEMO_OPTION

    tristate "My demo option"

    default m

    depends on MY_DEMO_FEATURE

    help

      This is an option related to the demo feature. You can choose

      to compile it into the kernel (y), compile it as a module (m),

      or disable it completely (n).

endmenu

上面那一串应该是mconf工具带的,下次研究一下源码把log改了。

        具体的等下次整理编译框架时我在结合不然单独搞Kconfig生成了.config也没用的重要的是要编译时可以起到限制编译的作用。


http://www.ppmy.cn/devtools/22690.html

相关文章

react 学习笔记二:ref、状态、继承

基础知识 1、ref 创建变量时&#xff0c;需要运用到username React.createRef()&#xff0c;并将其绑定到对应的节点。在使用时需要获取当前的节点&#xff1b; 注意&#xff1a;vue直接使用里面的值&#xff0c;不需要再用this。 2、状态 组件描述某种显示情况的数据&#…

React 语法

1、认识JSX JSX是一种JavaScript的语法扩展&#xff0c;可以用于描述UI界面&#xff0c;可以与JavaScript融合在一起使用 JSX的语法&#xff1a;const element <h2>Hello World</h2> 在 <script type"text/babel"> 时才可以这样写 2、为什么…

秋招后端开发面试题 - Java多线程(下)

目录 Java多线程前言面试题synchronized&#xff1f;作用&#xff1f;synchronized 怎么使用&#xff1f;构造方法可以用 synchronized 修饰吗&#xff1f;synchronized 底层原理了解吗&#xff1f;除了原子性&#xff0c;synchronized 可见性&#xff0c;有序性&#xff0c;可…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG&#xff0c;NIN&#xff0c;GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…

数据库:实验二

一、实验2.1 数据查询 1、要求 以School数据库为例&#xff0c;在该数据库中存在四张表格&#xff0c;分别为&#xff1a; 表STUDENT(sid, sname, email, grade);表TEACHERS(tid, tname, email, salary);表COURSES(cid, cname, hour);表CHOICES(no, sid, tid, cid, score) 在…

数据库的嵌套查询(子查询),分组查询和统计查询—学生选课

学生选课数据库中的表的结构参考学生选课数据库的定义和维护 1.嵌套查询 1.1查询选修了数据库原理与应用课程的学生学号和姓名 SELECT sno 学号, sname 姓名 FROM student WHERE sno IN(SELECT snoFROM SCINNER JOIN Course c ON c.cno SC.cno AND c.cname 数据库原理与应…

Debezium分享系列之:Debezium2.6稳定版本SQLSerer数据库Debezium connector核心知识点

Debezium分享系列之:Debezium2.6稳定版本SQLSerer数据库Debezium connector核心知识点 一、综述二、snapshot.mode参数三、临时快照四、增量快照五、触发增量快照六、使用Kafka信令通道触发增量快照七、停止增量快照八、使用Kafka信令通道停止增量快照九、阻止快照十、读取变更…

38-1 防火墙了解

一、防火墙的概念: 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668 [A]1993-12-15)。它是一种位于内部网络与外部网络之间的网络安全系统,是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。…