Linus TorvaldsLinux 4.039a880411 years agoHistory
1600 lines · 53.3 KB · Makefile
RawDownload
VERSION = 4PATCHLEVEL = 0SUBLEVEL = 0EXTRAVERSION =NAME = Hurr durr I'ma sheep # *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. # Do not use make's built-in rules and variables# (this increases performance and avoids hard-to-debug behaviour);MAKEFLAGS += -rR # Avoid funny character set dependenciesunexport LC_ALLLC_COLLATE=CLC_NUMERIC=Cexport LC_COLLATE LC_NUMERIC # Avoid interference with shell env settingsunexport 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 commands ifeq ("$(origin V)", "command line")  KBUILD_VERBOSE = $(V)endififndef KBUILD_VERBOSE  KBUILD_VERBOSE = 0endif ifeq ($(KBUILD_VERBOSE),1)  quiet =  Q =else  quiet=quiet_  Q = @endif # If the user is running make -s (silent mode), suppress echoing of# commands ifneq ($(filter 4.%,$(MAKE_VERSION)),)	# make-4ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)  quiet=silent_endifelse					# make-3.8xifneq ($(filter s% -s%,$(MAKEFLAGS)),)  quiet=silent_endifendif export 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 linePHONY := _all_all: # Cancel implicit rules on top Makefile$(CURDIR)/Makefile Makefile: ; ifneq ($(KBUILD_OUTPUT),)# Invoke a second make in the output directory, passing relevant variables# check that the output directory actually existssaved-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: FORCE	$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \	-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS)) # Leave processing to above invocation of makeskip-makefile := 1endif # ifneq ($(KBUILD_OUTPUT),)endif # ifeq ($(KBUILD_SRC),) # We process the rest of the Makefile if this is the final invocation of makeifeq ($(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)endififndef KBUILD_CHECKSRC  KBUILD_CHECKSRC = 0endif # 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 precedenceifdef SUBDIRS  KBUILD_EXTMOD ?= $(SUBDIRS)endif ifeq ("$(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 modulesPHONY += allifeq ($(KBUILD_EXTMOD),)_all: allelse_all: modulesendif ifeq ($(KBUILD_SRC),)        # building in the source tree        srctree := .else        ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))                # building in a subdirectory of the source tree                srctree := ..        else                srctree := $(KBUILD_SRC)        endifendifobjtree		:= .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/*/MakefileARCH		?= $(SUBARCH)CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%) # Architecture as present in compile.hUTS_MACHINE 	:= $(ARCH)SRCARCH 	:= $(ARCH) # Additional ARCH settings for x86ifeq ($(ARCH),i386)        SRCARCH := x86endififeq ($(ARCH),x86_64)        SRCARCH := x86endif # Additional ARCH settings for sparcifeq ($(ARCH),sparc32)       SRCARCH := sparcendififeq ($(ARCH),sparc64)       SRCARCH := sparcendif # Additional ARCH settings for shifeq ($(ARCH),sh64)       SRCARCH := shendif # Additional ARCH settings for tileifeq ($(ARCH),tilepro)       SRCARCH := tileendififeq ($(ARCH),tilegx)       SRCARCH := tileendif # Where to locate arch specific headershdr-arch  := $(SRCARCH) KCONFIG_CONFIG	?= .configexport KCONFIG_CONFIG # SHELL used by kbuildCONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \	  else if [ -x /bin/bash ]; then echo /bin/bash; \	  else echo sh; fi ; fi) HOSTCC       = gccHOSTCXX      = g++HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89HOSTCXXFLAGS = -O2 ifeq ($(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-checksendif # 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 well ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)  KBUILD_MODULES := 1endif ifeq ($(MAKECMDGOALS),)  KBUILD_MODULES := 1endif export KBUILD_MODULES KBUILD_BUILTINexport KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD ifneq ($(CC),)ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)COMPILER := clangelseCOMPILER := gccendifexport COMPILERendif # Look for make include files relative to root of kernel srcMAKEFLAGS += --include-dir=$(srctree) # We need some generic definitions (do not try to remake the file).$(srctree)/scripts/Kbuild.include: ;include $(srctree)/scripts/Kbuild.include # Make variables (CC, etc...)AS		= $(CROSS_COMPILE)asLD		= $(CROSS_COMPILE)ldCC		= $(CROSS_COMPILE)gccCPP		= $(CC) -EAR		= $(CROSS_COMPILE)arNM		= $(CROSS_COMPILE)nmSTRIP		= $(CROSS_COMPILE)stripOBJCOPY		= $(CROSS_COMPILE)objcopyOBJDUMP		= $(CROSS_COMPILE)objdumpAWK		= awkGENKSYMS	= scripts/genksyms/genksymsINSTALLKERNEL  := installkernelDEPMOD		= /sbin/depmodPERL		= perlPYTHON		= pythonCHECK		= sparse CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \		  -Wbitwise -Wno-return-void $(CF)CFLAGS_MODULE   =AFLAGS_MODULE   =LDFLAGS_MODULE  =CFLAGS_KERNEL	=AFLAGS_KERNEL	=CFLAGS_GCOV	= -fprofile-arcs -ftest-coverage  # Use USERINCLUDE when you must reference the UAPI directories only.USERINCLUDE    := \		-I$(srctree)/arch/$(hdr-arch)/include/uapi \		-Iarch/$(hdr-arch)/include/generated/uapi \		-I$(srctree)/include/uapi \		-Iinclude/generated/uapi \                -include $(srctree)/include/linux/kconfig.h # Use LINUXINCLUDE when you must reference the include/ directory.# Needed to be compatible with the O= optionLINUXINCLUDE    := \		-I$(srctree)/arch/$(hdr-arch)/include \		-Iarch/$(hdr-arch)/include/generated/uapi \		-Iarch/$(hdr-arch)/include/generated \		$(if $(KBUILD_SRC), -I$(srctree)/include) \		-Iinclude \		$(USERINCLUDE) KBUILD_CPPFLAGS := -D__KERNEL__ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \		   -fno-strict-aliasing -fno-common \		   -Werror-implicit-function-declaration \		   -Wno-format-security \		   -std=gnu89 KBUILD_AFLAGS_KERNEL :=KBUILD_CFLAGS_KERNEL :=KBUILD_AFLAGS   := -D__ASSEMBLY__KBUILD_AFLAGS_MODULE  := -DMODULEKBUILD_CFLAGS_MODULE  := -DMODULEKBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds # 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 KERNELVERSIONexport ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CCexport CPP AR NM STRIP OBJCOPY OBJDUMPexport MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINEexport HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGSexport KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASANexport KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULEexport KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULEexport KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNELexport 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 ... statements export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \			  -name CVS -o -name .pc -o -name .hg -o -name .git \) \			  -prune -oexport 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_basicscripts_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-genericPHONY += asm-genericasm-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.hold_version_h := include/linux/version.h no-dot-config-targets := clean mrproper distclean \			 cscope gtags TAGS tags help% %docs check% coccicheck \			 $(version_h) headers_% archheaders archscripts \			 kernelversion %src-pkg config-targets := 0mixed-targets  := 0dot-config     := 1 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)	ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)		dot-config := 0	endifendif

Lines 1–500 of 1600.