Makefile 69.5 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2
VERSION = 6
L
Linus Torvalds 已提交
3
PATCHLEVEL = 2
L
Linus Torvalds 已提交
4
SUBLEVEL = 0
L
Linus Torvalds 已提交
5
EXTRAVERSION = -rc4
L
Linus Torvalds 已提交
6
NAME = Hurr durr I'ma ninja sloth
L
Linus Torvalds 已提交
7 8 9 10 11 12 13

# *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.

14 15 16 17
ifeq ($(filter undefine,$(.FEATURES)),)
$(error GNU Make >= 3.82 is required. Your Make version is $(MAKE_VERSION))
endif

18 19 20
$(if $(filter __%, $(MAKECMDGOALS)), \
	$(error targets prefixed with '__' are only for internal use))

21
# That's our default target when none is given on the command line
22 23
PHONY := __all
__all:
24

L
Linus Torvalds 已提交
25 26 27 28 29 30
# 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
31
# unavoidable when linking the built-in.a targets which finally
L
Linus Torvalds 已提交
32 33 34 35 36 37 38 39 40
# 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.

41
ifneq ($(sub_make_done),1)
42 43 44 45 46 47 48 49 50 51 52 53 54 55

# 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 dependencies
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC

# Avoid interference with shell env settings
unexport GREP_OPTIONS

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
# 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.
R
Randy Dunlap 已提交
78
# If KBUILD_VERBOSE equals 2 then give the reason why each target is rebuilt.
79
#
L
Linus Torvalds 已提交
80 81 82
# To put more focus on warnings, be less verbose as default
# Use 'make V=1' to see the full commands

83 84
ifeq ("$(origin V)", "command line")
  KBUILD_VERBOSE = $(V)
L
Linus Torvalds 已提交
85 86 87 88 89
endif
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 0
endif

90 91 92 93 94 95 96 97 98 99
ifeq ($(KBUILD_VERBOSE),1)
  quiet =
  Q =
else
  quiet=quiet_
  Q = @
endif

# If the user is running make -s (silent mode), suppress echoing of
# commands
100
# make-4.0 (and later) keep single letter options in the 1st word of MAKEFLAGS.
101

102 103 104 105 106 107 108 109 110
ifeq ($(filter 3.%,$(MAKE_VERSION)),)
silence:=$(findstring s,$(firstword -$(MAKEFLAGS)))
else
silence:=$(findstring s,$(filter-out --%,$(MAKEFLAGS)))
endif

ifeq ($(silence),s)
quiet=silent_
KBUILD_VERBOSE = 0
111 112 113 114
endif

export quiet Q KBUILD_VERBOSE

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
# 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/dev-tools/sparse.rst" for more details,
# including where to get the "sparse" utility.

ifeq ("$(origin C)", "command line")
  KBUILD_CHECKSRC = $(C)
endif
ifndef KBUILD_CHECKSRC
  KBUILD_CHECKSRC = 0
endif

export KBUILD_CHECKSRC

M
Miguel Ojeda 已提交
134 135 136 137 138 139 140 141 142
# Enable "clippy" (a linter) as part of the Rust compilation.
#
# Use 'make CLIPPY=1' to enable it.
ifeq ("$(origin CLIPPY)", "command line")
  KBUILD_CLIPPY := $(CLIPPY)
endif

export KBUILD_CLIPPY

143 144 145 146 147 148 149 150 151
# Use make M=dir or set the environment variable KBUILD_EXTMOD to specify the
# directory of external module to build. Setting M= takes precedence.
ifeq ("$(origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

$(if $(word 2, $(KBUILD_EXTMOD)), \
	$(error building multiple external modules is not supported))

152 153 154
$(foreach x, % :, $(if $(findstring $x, $(KBUILD_EXTMOD)), \
	$(error module directory path cannot contain '$x')))

155 156 157 158 159
# Remove trailing slashes
ifneq ($(filter %/, $(KBUILD_EXTMOD)),)
KBUILD_EXTMOD := $(shell dirname $(KBUILD_EXTMOD).)
endif

160 161
export KBUILD_EXTMOD

162 163 164 165 166 167 168 169 170 171
# Kbuild will save output files in the current working directory.
# This does not need to match to the root of the kernel source tree.
#
# For example, you can do this:
#
#  cd /dir/to/store/output/files; make -f /dir/to/kernel/source/Makefile
#
# If you want to save output files in a different location, there are
# two syntaxes to specify it.
#
L
Linus Torvalds 已提交
172 173
# 1) O=
# Use "make O=dir/to/store/output/files/"
S
Sam Ravnborg 已提交
174
#
L
Linus Torvalds 已提交
175
# 2) Set KBUILD_OUTPUT
176 177
# Set the environment variable KBUILD_OUTPUT to point to the output directory.
# export KBUILD_OUTPUT=dir/to/store/output/files/; make
L
Linus Torvalds 已提交
178 179 180 181
#
# The O= assignment takes precedence over the KBUILD_OUTPUT environment
# variable.

182
# Do we want to change the working directory?
183 184
ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
L
Linus Torvalds 已提交
185 186
endif

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
ifneq ($(KBUILD_OUTPUT),)
# Make's built-in functions such as $(abspath ...), $(realpath ...) cannot
# expand a shell special character '~'. We use a somewhat tedious way here.
abs_objtree := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) && pwd)
$(if $(abs_objtree),, \
     $(error failed to create output directory "$(KBUILD_OUTPUT)"))

# $(realpath ...) resolves symlinks
abs_objtree := $(realpath $(abs_objtree))
else
abs_objtree := $(CURDIR)
endif # ifneq ($(KBUILD_OUTPUT),)

ifeq ($(abs_objtree),$(CURDIR))
# Suppress "Entering directory ..." unless we are changing the work directory.
MAKEFLAGS += --no-print-directory
else
need-sub-make := 1
205 206
endif

207 208
this-makefile := $(lastword $(MAKEFILE_LIST))
abs_srctree := $(realpath $(dir $(this-makefile)))
L
Linus Torvalds 已提交
209

210 211 212
ifneq ($(words $(subst :, ,$(abs_srctree))), 1)
$(error source directory cannot contain spaces or colons)
endif
L
Linus Torvalds 已提交
213

214
ifneq ($(abs_srctree),$(abs_objtree))
215 216
# Look for make include files relative to root of kernel src
#
217 218
# --included-dir is added for backward compatibility, but you should not rely on
# it. Please add $(srctree)/ prefix to include Makefiles in the source tree.
219 220
MAKEFLAGS += --include-dir=$(abs_srctree)
endif
221

222 223 224 225 226
ifneq ($(filter 3.%,$(MAKE_VERSION)),)
# 'MAKEFLAGS += -rR' does not immediately become effective for GNU Make 3.x
# We need to invoke sub-make to avoid implicit rules in the top Makefile.
need-sub-make := 1
# Cancel implicit rules for this Makefile.
227
$(this-makefile): ;
228 229
endif

230
export abs_srctree abs_objtree
231 232
export sub_make_done := 1

233 234
ifeq ($(need-sub-make),1)

235
PHONY += $(MAKECMDGOALS) __sub-make
236

237
$(filter-out $(this-makefile), $(MAKECMDGOALS)) __all: __sub-make
238
	@:
239

C
Cao jin 已提交
240
# Invoke a second make in the output directory, passing relevant variables
241
__sub-make:
242
	$(Q)$(MAKE) -C $(abs_objtree) -f $(abs_srctree)/Makefile $(MAKECMDGOALS)
L
Linus Torvalds 已提交
243

244
endif # need-sub-make
245
endif # sub_make_done
246

L
Linus Torvalds 已提交
247
# We process the rest of the Makefile if this is the final invocation of make
248
ifeq ($(need-sub-make),)
L
Linus Torvalds 已提交
249

250 251 252 253 254
# 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

255
ifeq ($(abs_srctree),$(abs_objtree))
256 257
        # building in the source tree
        srctree := .
258
	building_out_of_srctree :=
259
else
260
        ifeq ($(abs_srctree)/,$(dir $(abs_objtree)))
261 262 263
                # building in a subdirectory of the source tree
                srctree := ..
        else
264
                srctree := $(abs_srctree)
265
        endif
266
	building_out_of_srctree := 1
267
endif
268

269 270 271
ifneq ($(KBUILD_ABS_SRCTREE),)
srctree := $(abs_srctree)
endif
272

273
objtree		:= .
274
VPATH		:= $(srctree)
L
Linus Torvalds 已提交
275

276
export building_out_of_srctree srctree objtree VPATH
L
Linus Torvalds 已提交
277

278 279 280 281 282 283 284 285 286 287
# 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

288 289
clean-targets := %clean mrproper cleandocs
no-dot-config-targets := $(clean-targets) \
290
			 cscope gtags TAGS tags help% %docs check% coccicheck \
291
			 $(version_h) headers headers_% archheaders archscripts \
292
			 %asm-generic kernelversion %src-pkg dt_binding_check \
M
Miguel Ojeda 已提交
293
			 outputmakefile rustavailable rustfmt rustfmtcheck
294 295 296 297
# Installation targets should not require compiler. Unfortunately, vdso_install
# is an exception where build artifacts may be updated. This must be fixed.
no-compiler-targets := $(no-dot-config-targets) install dtbs_install \
			headers_install modules_install kernelrelease image_name
298 299
no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \
			  image_name
300
single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.rsi %.s %.symtypes %/
301

302 303 304
config-build	:=
mixed-build	:=
need-config	:= 1
305
need-compiler	:= 1
306
may-sync-config	:= 1
307
single-build	:=
308 309 310

ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
	ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
311
		need-config :=
312 313 314
	endif
endif

315 316 317 318 319 320
ifneq ($(filter $(no-compiler-targets), $(MAKECMDGOALS)),)
	ifeq ($(filter-out $(no-compiler-targets), $(MAKECMDGOALS)),)
		need-compiler :=
	endif
endif

321 322
ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
	ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
323
		may-sync-config :=
324 325 326 327
	endif
endif

ifneq ($(KBUILD_EXTMOD),)
328
	may-sync-config :=
329 330
endif

331
ifeq ($(KBUILD_EXTMOD),)
332
        ifneq ($(filter %config,$(MAKECMDGOALS)),)
333
		config-build := 1
334
                ifneq ($(words $(MAKECMDGOALS)),1)
335
			mixed-build := 1
336 337 338
                endif
        endif
endif
339

340 341 342 343 344 345 346 347
# We cannot build single targets and the others at the same time
ifneq ($(filter $(single-targets), $(MAKECMDGOALS)),)
	single-build := 1
	ifneq ($(filter-out $(single-targets), $(MAKECMDGOALS)),)
		mixed-build := 1
	endif
endif

348 349 350
# For "make -j clean all", "make -j mrproper defconfig all", etc.
ifneq ($(filter $(clean-targets),$(MAKECMDGOALS)),)
        ifneq ($(filter-out $(clean-targets),$(MAKECMDGOALS)),)
351
		mixed-build := 1
352 353 354
        endif
endif

355 356 357
# install and modules_install need also be processed one by one
ifneq ($(filter install,$(MAKECMDGOALS)),)
        ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
358
		mixed-build := 1
359 360 361
        endif
endif

362
ifdef mixed-build
363 364 365 366 367 368
# ===========================================================================
# We're called with mixed targets (*config and build targets).
# Handle them one by one.

PHONY += $(MAKECMDGOALS) __build_one_by_one

369
$(MAKECMDGOALS): __build_one_by_one
370 371 372 373 374 375 376 377
	@:

__build_one_by_one:
	$(Q)set -e; \
	for i in $(MAKECMDGOALS); do \
		$(MAKE) -f $(srctree)/Makefile $$i; \
	done

378
else # !mixed-build
379

380
include $(srctree)/scripts/Kbuild.include
381 382

# Read KERNELRELEASE from include/config/kernel.release (if it exists)
M
Masahiro Yamada 已提交
383
KERNELRELEASE = $(call read-file, include/config/kernel.release)
384 385 386
KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION

387
include $(srctree)/scripts/subarch.include
L
Linus Torvalds 已提交
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406

# 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.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
407
ARCH		?= $(SUBARCH)
L
Linus Torvalds 已提交
408 409

# Architecture as present in compile.h
410 411
UTS_MACHINE 	:= $(ARCH)
SRCARCH 	:= $(ARCH)
L
Linus Torvalds 已提交
412

413 414 415 416 417 418 419
# Additional ARCH settings for x86
ifeq ($(ARCH),i386)
        SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
        SRCARCH := x86
endif
420

S
Sam Ravnborg 已提交
421
# Additional ARCH settings for sparc
N
Namhyung Kim 已提交
422 423 424
ifeq ($(ARCH),sparc32)
       SRCARCH := sparc
endif
425
ifeq ($(ARCH),sparc64)
S
Sam Ravnborg 已提交
426
       SRCARCH := sparc
427
endif
428

429 430 431 432 433
# Additional ARCH settings for parisc
ifeq ($(ARCH),parisc64)
       SRCARCH := parisc
endif

434 435 436 437 438
export cross_compiling :=
ifneq ($(SRCARCH),$(SUBARCH))
cross_compiling := 1
endif

R
Roman Zippel 已提交
439
KCONFIG_CONFIG	?= .config
440
export KCONFIG_CONFIG
R
Roman Zippel 已提交
441

L
Linus Torvalds 已提交
442
# SHELL used by kbuild
443
CONFIG_SHELL := sh
L
Linus Torvalds 已提交
444

445 446 447
HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null)
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
448

449
ifneq ($(LLVM),)
450 451 452 453 454 455 456 457
ifneq ($(filter %/,$(LLVM)),)
LLVM_PREFIX := $(LLVM)
else ifneq ($(filter -%,$(LLVM)),)
LLVM_SUFFIX := $(LLVM)
endif

HOSTCC	= $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
HOSTCXX	= $(LLVM_PREFIX)clang++$(LLVM_SUFFIX)
458 459 460 461
else
HOSTCC	= gcc
HOSTCXX	= g++
endif
M
Miguel Ojeda 已提交
462
HOSTRUSTC = rustc
463
HOSTPKG_CONFIG	= pkg-config
464

465
KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
466 467
			 -O2 -fomit-frame-pointer -std=gnu11 \
			 -Wdeclaration-after-statement
468 469
KBUILD_USERCFLAGS  := $(KBUILD_USERHOSTCFLAGS) $(USERCFLAGS)
KBUILD_USERLDFLAGS := $(USERLDFLAGS)
470

M
Miguel Ojeda 已提交
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
# These flags apply to all Rust code in the tree, including the kernel and
# host programs.
export rust_common_flags := --edition=2021 \
			    -Zbinary_dep_depinfo=y \
			    -Dunsafe_op_in_unsafe_fn -Drust_2018_idioms \
			    -Dunreachable_pub -Dnon_ascii_idents \
			    -Wmissing_docs \
			    -Drustdoc::missing_crate_level_docs \
			    -Dclippy::correctness -Dclippy::style \
			    -Dclippy::suspicious -Dclippy::complexity \
			    -Dclippy::perf \
			    -Dclippy::let_unit_value -Dclippy::mut_mut \
			    -Dclippy::needless_bitwise_bool \
			    -Dclippy::needless_continue \
			    -Wclippy::dbg_macro

487
KBUILD_HOSTCFLAGS   := $(KBUILD_USERHOSTCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
488
KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)
M
Miguel Ojeda 已提交
489 490
KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
			-Zallow-features= $(HOSTRUSTFLAGS)
491 492
KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
L
Linus Torvalds 已提交
493 494 495

# Make variables (CC, etc...)
CPP		= $(CC) -E
496
ifneq ($(LLVM),)
497 498 499 500 501 502 503 504
CC		= $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
LD		= $(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX)
AR		= $(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX)
NM		= $(LLVM_PREFIX)llvm-nm$(LLVM_SUFFIX)
OBJCOPY		= $(LLVM_PREFIX)llvm-objcopy$(LLVM_SUFFIX)
OBJDUMP		= $(LLVM_PREFIX)llvm-objdump$(LLVM_SUFFIX)
READELF		= $(LLVM_PREFIX)llvm-readelf$(LLVM_SUFFIX)
STRIP		= $(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX)
505 506 507
else
CC		= $(CROSS_COMPILE)gcc
LD		= $(CROSS_COMPILE)ld
L
Linus Torvalds 已提交
508 509 510 511
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
512
READELF		= $(CROSS_COMPILE)readelf
513 514
STRIP		= $(CROSS_COMPILE)strip
endif
M
Miguel Ojeda 已提交
515 516 517 518 519 520
RUSTC		= rustc
RUSTDOC		= rustdoc
RUSTFMT		= rustfmt
CLIPPY_DRIVER	= clippy-driver
BINDGEN		= bindgen
CARGO		= cargo
521
PAHOLE		= pahole
522
RESOLVE_BTFIDS	= $(objtree)/tools/bpf/resolve_btfids/resolve_btfids
523 524
LEX		= flex
YACC		= bison
L
Linus Torvalds 已提交
525
AWK		= awk
526
INSTALLKERNEL  := installkernel
527
DEPMOD		= depmod
L
Linus Torvalds 已提交
528
PERL		= perl
529
PYTHON3		= python3
L
Linus Torvalds 已提交
530
CHECK		= sparse
531
BASH		= bash
532 533 534
KGZIP		= gzip
KBZIP2		= bzip2
KLZOP		= lzop
535 536 537
LZMA		= lzma
LZ4		= lz4c
XZ		= xz
538
ZSTD		= zstd
539

540 541
PAHOLE_FLAGS	= $(shell PAHOLE=$(PAHOLE) $(srctree)/scripts/pahole-flags.sh)

542
CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
543
		  -Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)
544
NOSTDINC_FLAGS :=
545
CFLAGS_MODULE   =
M
Miguel Ojeda 已提交
546
RUSTFLAGS_MODULE =
547 548
AFLAGS_MODULE   =
LDFLAGS_MODULE  =
L
Linus Torvalds 已提交
549
CFLAGS_KERNEL	=
M
Miguel Ojeda 已提交
550
RUSTFLAGS_KERNEL =
L
Linus Torvalds 已提交
551
AFLAGS_KERNEL	=
552
export LDFLAGS_vmlinux =
L
Linus Torvalds 已提交
553

554 555
# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE    := \
556 557
		-I$(srctree)/arch/$(SRCARCH)/include/uapi \
		-I$(objtree)/arch/$(SRCARCH)/include/generated/uapi \
558
		-I$(srctree)/include/uapi \
559
		-I$(objtree)/include/generated/uapi \
560
                -include $(srctree)/include/linux/compiler-version.h \
561 562
                -include $(srctree)/include/linux/kconfig.h

L
Linus Torvalds 已提交
563 564
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
565
LINUXINCLUDE    := \
566 567
		-I$(srctree)/arch/$(SRCARCH)/include \
		-I$(objtree)/arch/$(SRCARCH)/include/generated \
568
		$(if $(building_out_of_srctree),-I$(srctree)/include) \
569 570
		-I$(objtree)/include \
		$(USERINCLUDE)
L
Linus Torvalds 已提交
571

572
KBUILD_AFLAGS   := -D__ASSEMBLY__ -fno-PIE
573
KBUILD_CFLAGS   := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
574
		   -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
575
		   -Werror=implicit-function-declaration -Werror=implicit-int \
576
		   -Werror=return-type -Wno-format-security -funsigned-char \
A
Arnd Bergmann 已提交
577
		   -std=gnu11
578
KBUILD_CPPFLAGS := -D__KERNEL__
M
Miguel Ojeda 已提交
579 580 581 582 583 584 585 586 587
KBUILD_RUSTFLAGS := $(rust_common_flags) \
		    --target=$(objtree)/rust/target.json \
		    -Cpanic=abort -Cembed-bitcode=n -Clto=n \
		    -Cforce-unwind-tables=n -Ccodegen-units=1 \
		    -Csymbol-mangling-version=v0 \
		    -Crelocation-model=static \
		    -Zfunction-sections=n \
		    -Dclippy::float_arithmetic

588 589
KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=
M
Miguel Ojeda 已提交
590
KBUILD_RUSTFLAGS_KERNEL :=
591 592
KBUILD_AFLAGS_MODULE  := -DMODULE
KBUILD_CFLAGS_MODULE  := -DMODULE
M
Miguel Ojeda 已提交
593
KBUILD_RUSTFLAGS_MODULE := --cfg MODULE
594
KBUILD_LDFLAGS_MODULE :=
595
KBUILD_LDFLAGS :=
596
CLANG_FLAGS :=
L
Linus Torvalds 已提交
597

M
Miguel Ojeda 已提交
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
ifeq ($(KBUILD_CLIPPY),1)
	RUSTC_OR_CLIPPY_QUIET := CLIPPY
	RUSTC_OR_CLIPPY = $(CLIPPY_DRIVER)
else
	RUSTC_OR_CLIPPY_QUIET := RUSTC
	RUSTC_OR_CLIPPY = $(RUSTC)
endif

ifdef RUST_LIB_SRC
	export RUST_LIB_SRC
endif

# Allows the usage of unstable features in stable compilers.
export RUSTC_BOOTSTRAP := 1

613
export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG
M
Miguel Ojeda 已提交
614 615
export RUSTC RUSTDOC RUSTFMT RUSTC_OR_CLIPPY_QUIET RUSTC_OR_CLIPPY BINDGEN CARGO
export HOSTRUSTC KBUILD_HOSTRUSTFLAGS
V
Vasily Gorbik 已提交
616
export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL
M
Masahiro Yamada 已提交
617
export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
618
export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD
619
export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
620
export KBUILD_USERCFLAGS KBUILD_USERLDFLAGS
L
Linus Torvalds 已提交
621

622
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
623
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
M
Miguel Ojeda 已提交
624
export KBUILD_RUSTFLAGS RUSTFLAGS_KERNEL RUSTFLAGS_MODULE
625
export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
M
Miguel Ojeda 已提交
626 627
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_RUSTFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL KBUILD_RUSTFLAGS_KERNEL
628
export PAHOLE_FLAGS
L
Linus Torvalds 已提交
629 630 631

# Files to ignore in find ... statements

632 633 634
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 -o
J
Jesper Juhl 已提交
635 636
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
			 --exclude CVS --exclude .pc --exclude .hg --exclude .git
L
Linus Torvalds 已提交
637 638 639 640

# ===========================================================================
# Rules shared between *config targets and build targets

641
# Basic helpers built in scripts/basic/
642
PHONY += scripts_basic
L
Linus Torvalds 已提交
643 644 645
scripts_basic:
	$(Q)$(MAKE) $(build)=scripts/basic

646
PHONY += outputmakefile
647
ifdef building_out_of_srctree
648
# Before starting out-of-tree build, make sure the source tree is clean.
649 650 651
# outputmakefile generates a Makefile in the output directory, if using a
# separate output directory. This allows convenient use of make in the
# output directory.
652 653
# At the same time when output Makefile generated, generate .gitignore to
# ignore whole output directory
654 655 656 657 658 659 660

quiet_cmd_makefile = GEN     Makefile
      cmd_makefile = { \
	echo "\# Automatically generated by $(srctree)/Makefile: don't edit"; \
	echo "include $(srctree)/Makefile"; \
	} > Makefile

L
Linus Torvalds 已提交
661
outputmakefile:
662
	@if [ -f $(srctree)/.config -o \
663 664 665 666 667 668 669 670
		 -d $(srctree)/include/config -o \
		 -d $(srctree)/arch/$(SRCARCH)/include/generated ]; then \
		echo >&2 "***"; \
		echo >&2 "*** The source tree is not clean, please run 'make$(if $(findstring command line, $(origin ARCH)), ARCH=$(ARCH)) mrproper'"; \
		echo >&2 "*** in $(abs_srctree)";\
		echo >&2 "***"; \
		false; \
	fi
671
	$(Q)ln -fsn $(srctree) source
672
	$(call cmd,makefile)
673 674
	$(Q)test -e .gitignore || \
	{ echo "# this is build directory, ignore it"; echo "*"; } > .gitignore
675
endif
L
Linus Torvalds 已提交
676

677 678 679 680
# The expansion should be delayed until arch/$(SRCARCH)/Makefile is included.
# Some architectures define CROSS_COMPILE in arch/$(SRCARCH)/Makefile.
# CC_VERSION_TEXT is referenced from Kconfig (so it needs export),
# and from include/config/auto.conf.cmd to detect the compiler upgrade.
681
CC_VERSION_TEXT = $(subst $(pound),,$(shell LC_ALL=C $(CC) --version 2>/dev/null | head -n 1))
682 683

ifneq ($(findstring clang,$(CC_VERSION_TEXT)),)
684
include $(srctree)/scripts/Makefile.clang
685 686
endif

687 688
# Include this also for config targets because some architectures need
# cc-cross-prefix to determine CROSS_COMPILE.
689
ifdef need-compiler
690
include $(srctree)/scripts/Makefile.compiler
691
endif
692

693
ifdef config-build
L
Linus Torvalds 已提交
694 695 696 697 698 699 700
# ===========================================================================
# *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'
701
include $(srctree)/arch/$(SRCARCH)/Makefile
702
export KBUILD_DEFCONFIG KBUILD_KCONFIG CC_VERSION_TEXT
L
Linus Torvalds 已提交
703

704
config: outputmakefile scripts_basic FORCE
S
Sam Ravnborg 已提交
705 706
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

707
%config: outputmakefile scripts_basic FORCE
L
Linus Torvalds 已提交
708 709
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

710
else #!config-build
L
Linus Torvalds 已提交
711 712 713 714
# ===========================================================================
# Build targets only - this includes vmlinux, arch specific targets, clean
# targets and others. In general all targets except *config targets.

715
# If building an external module we do not care about the all: rule
716
# but instead __all depend on modules
717 718
PHONY += all
ifeq ($(KBUILD_EXTMOD),)
719
__all: all
720
else
721
__all: modules
722 723
endif

724 725
targets :=

726 727 728 729 730 731 732 733
# 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.
ifeq ($(MAKECMDGOALS),modules)
734
  KBUILD_BUILTIN :=
735 736 737 738 739 740
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

741
ifneq ($(filter all modules nsdeps %compile_commands.json clang-%,$(MAKECMDGOALS)),)
742 743 744 745 746 747 748 749 750
  KBUILD_MODULES := 1
endif

ifeq ($(MAKECMDGOALS),)
  KBUILD_MODULES := 1
endif

export KBUILD_MODULES KBUILD_BUILTIN

751
ifdef need-config
752 753 754
include include/config/auto.conf
endif

L
Linus Torvalds 已提交
755 756
ifeq ($(KBUILD_EXTMOD),)
# Objects we will link into vmlinux / subdirs we need to visit
757 758
core-y		:=
drivers-y	:=
L
Linus Torvalds 已提交
759 760 761
libs-y		:= lib/
endif # KBUILD_EXTMOD

762 763 764 765 766 767
# 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: vmlinux

768 769 770 771
CFLAGS_GCOV	:= -fprofile-arcs -ftest-coverage
ifdef CONFIG_CC_IS_GCC
CFLAGS_GCOV	+= -fno-tree-loop-im
endif
772
export CFLAGS_GCOV
773

774 775 776 777 778
# The arch Makefiles can override CC_FLAGS_FTRACE. We may also append it later.
ifdef CONFIG_FUNCTION_TRACER
  CC_FLAGS_FTRACE := -pg
endif

779
include $(srctree)/arch/$(SRCARCH)/Makefile
L
Linus Torvalds 已提交
780

781 782
ifdef need-config
ifdef may-sync-config
783 784 785
# Read in dependencies to all Kconfig* files, make sure to run syncconfig if
# changes are detected. This should be included after arch/$(SRCARCH)/Makefile
# because some architectures define CROSS_COMPILE there.
786
include include/config/auto.conf.cmd
L
Linus Torvalds 已提交
787

788 789 790 791 792 793 794 795
$(KCONFIG_CONFIG):
	@echo >&2 '***'
	@echo >&2 '*** Configuration file "$@" not found!'
	@echo >&2 '***'
	@echo >&2 '*** Please run some configurator (e.g. "make oldconfig" or'
	@echo >&2 '*** "make menuconfig" or "make xconfig").'
	@echo >&2 '***'
	@/bin/false
L
Linus Torvalds 已提交
796

797 798 799
# The actual configuration files used during the build are stored in
# include/generated/ and include/config/. Update them if .config is newer than
# include/config/auto.conf (which mirrors .config).
800 801 802
#
# This exploits the 'multi-target pattern rule' trick.
# The syncconfig should be executed only once to make all the targets.
803
# (Note: use the grouped target '&:' when we bump to GNU Make 4.3)
804 805 806
#
# Do not use $(call cmd,...) here. That would suppress prompts from syncconfig,
# so you cannot notice that Kconfig is waiting for the user input.
M
Miguel Ojeda 已提交
807
%/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h %/generated/rustc_cfg: $(KCONFIG_CONFIG)
808 809
	$(Q)$(kecho) "  SYNC    $@"
	$(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
810
else # !may-sync-config
811 812 813
# External modules and some install targets need 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
814 815 816
PHONY += include/config/auto.conf

include/config/auto.conf:
817
	@test -e include/generated/autoconf.h -a -e $@ || (		\
M
Michal Marek 已提交
818 819 820 821 822
	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 ;							\
823 824
	/bin/false)

825
endif # may-sync-config
826
endif # need-config
L
Linus Torvalds 已提交
827

828
KBUILD_CFLAGS	+= -fno-delete-null-pointer-checks
829
KBUILD_CFLAGS	+= $(call cc-disable-warning,frame-address,)
830 831
KBUILD_CFLAGS	+= $(call cc-disable-warning, format-truncation)
KBUILD_CFLAGS	+= $(call cc-disable-warning, format-overflow)
832
KBUILD_CFLAGS	+= $(call cc-disable-warning, address-of-packed-member)
833

834 835
ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
KBUILD_CFLAGS += -O2
M
Miguel Ojeda 已提交
836
KBUILD_RUSTFLAGS += -Copt-level=2
837 838
else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS += -Os
M
Miguel Ojeda 已提交
839
KBUILD_RUSTFLAGS += -Copt-level=s
840
endif
L
Linus Torvalds 已提交
841

M
Miguel Ojeda 已提交
842 843 844 845 846
# Always set `debug-assertions` and `overflow-checks` because their default
# depends on `opt-level` and `debug-assertions`, respectively.
KBUILD_RUSTFLAGS += -Cdebug-assertions=$(if $(CONFIG_RUST_DEBUG_ASSERTIONS),y,n)
KBUILD_RUSTFLAGS += -Coverflow-checks=$(if $(CONFIG_RUST_OVERFLOW_CHECKS),y,n)

847
# Tell gcc to never replace conditional load with a non-conditional one
848 849 850
ifdef CONFIG_CC_IS_GCC
# gcc-10 renamed --param=allow-store-data-races=0 to
# -fno-allow-store-data-races.
851
KBUILD_CFLAGS	+= $(call cc-option,--param=allow-store-data-races=0)
852
KBUILD_CFLAGS	+= $(call cc-option,-fno-allow-store-data-races)
853
endif
854

A
Andi Kleen 已提交
855 856 857 858 859
ifdef 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
860
KBUILD_CFLAGS += -fno-reorder-blocks -fno-ipa-cp-clone -fno-partial-inlining
A
Andi Kleen 已提交
861 862
endif

863
ifneq ($(CONFIG_FRAME_WARN),0)
864
KBUILD_CFLAGS += -Wframe-larger-than=$(CONFIG_FRAME_WARN)
865 866
endif

867
stackp-flags-y                                    := -fno-stack-protector
868 869
stackp-flags-$(CONFIG_STACKPROTECTOR)             := -fstack-protector
stackp-flags-$(CONFIG_STACKPROTECTOR_STRONG)      := -fstack-protector-strong
870 871

KBUILD_CFLAGS += $(stackp-flags-y)
872

873 874
KBUILD_CPPFLAGS-$(CONFIG_WERROR) += -Werror
KBUILD_CPPFLAGS += $(KBUILD_CPPFLAGS-y)
875
KBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds
876

M
Miguel Ojeda 已提交
877 878 879
KBUILD_RUSTFLAGS-$(CONFIG_WERROR) += -Dwarnings
KBUILD_RUSTFLAGS += $(KBUILD_RUSTFLAGS-y)

880
ifdef CONFIG_CC_IS_CLANG
881
KBUILD_CPPFLAGS += -Qunused-arguments
A
Arnd Bergmann 已提交
882
# The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable.
883
KBUILD_CFLAGS += -Wno-gnu
884 885
else

886 887
# gcc inanely warns about local variables called 'main'
KBUILD_CFLAGS += -Wno-main
888 889
endif

890 891 892
# These warnings generated too much noise in a regular build.
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
893
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
894

895 896 897
# These result in bogus false positives
KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer)

L
Linus Torvalds 已提交
898
ifdef CONFIG_FRAME_POINTER
899
KBUILD_CFLAGS	+= -fno-omit-frame-pointer -fno-optimize-sibling-calls
M
Miguel Ojeda 已提交
900
KBUILD_RUSTFLAGS += -Cforce-frame-pointers=y
L
Linus Torvalds 已提交
901
else
902 903 904 905 906
# 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.
M
Miguel Ojeda 已提交
907 908
# In the Rust target specification, "frame-pointer" is set explicitly
# to "may-omit".
909
ifndef CONFIG_FUNCTION_TRACER
910
KBUILD_CFLAGS	+= -fomit-frame-pointer
L
Linus Torvalds 已提交
911
endif
912
endif
L
Linus Torvalds 已提交
913

914 915
# Initialize all stack variables with a 0xAA pattern.
ifdef CONFIG_INIT_STACK_ALL_PATTERN
916 917 918
KBUILD_CFLAGS	+= -ftrivial-auto-var-init=pattern
endif

919 920 921
# Initialize all stack variables with a zero value.
ifdef CONFIG_INIT_STACK_ALL_ZERO
KBUILD_CFLAGS	+= -ftrivial-auto-var-init=zero
922 923
ifdef CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER
# https://github.com/llvm/llvm-project/issues/44842
924 925
KBUILD_CFLAGS	+= -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
endif
926
endif
927

928 929 930 931
# While VLAs have been removed, GCC produces unreachable stack probes
# for the randomize_kstack_offset feature. Disable it for all compilers.
KBUILD_CFLAGS	+= $(call cc-option, -fno-stack-clash-protection)

932 933 934 935 936
# Clear used registers at func exit (to reduce data lifetime and ROP gadgets).
ifdef CONFIG_ZERO_CALL_USED_REGS
KBUILD_CFLAGS	+= -fzero-call-used-regs=used-gpr
endif

937
ifdef CONFIG_FUNCTION_TRACER
938 939
ifdef CONFIG_FTRACE_MCOUNT_USE_CC
  CC_FLAGS_FTRACE	+= -mrecord-mcount
940 941 942 943 944 945
  ifdef CONFIG_HAVE_NOP_MCOUNT
    ifeq ($(call cc-option-yn, -mnop-mcount),y)
      CC_FLAGS_FTRACE	+= -mnop-mcount
      CC_FLAGS_USING	+= -DCC_USING_NOP_MCOUNT
    endif
  endif
946
endif
947
ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL
948 949 950
  ifdef CONFIG_HAVE_OBJTOOL_NOP_MCOUNT
    CC_FLAGS_USING	+= -DCC_USING_NOP_MCOUNT
  endif
951
endif
952 953 954 955 956 957
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
  ifdef CONFIG_HAVE_C_RECORDMCOUNT
    BUILD_C_RECORDMCOUNT := y
    export BUILD_C_RECORDMCOUNT
  endif
endif
958
ifdef CONFIG_HAVE_FENTRY
959
  # s390-linux-gnu-gcc did not support -mfentry until gcc-9.
960 961 962 963
  ifeq ($(call cc-option-yn, -mfentry),y)
    CC_FLAGS_FTRACE	+= -mfentry
    CC_FLAGS_USING	+= -DCC_USING_FENTRY
  endif
964
endif
965 966 967
export CC_FLAGS_FTRACE
KBUILD_CFLAGS	+= $(CC_FLAGS_FTRACE) $(CC_FLAGS_USING)
KBUILD_AFLAGS	+= $(CC_FLAGS_USING)
968 969
endif

970 971
# We trigger additional mismatches with less inlining
ifdef CONFIG_DEBUG_SECTION_MISMATCH
972
KBUILD_CFLAGS += -fno-inline-functions-called-once
973 974
endif

M
Miguel Ojeda 已提交
975
# `rustc`'s `-Zfunction-sections` applies to data too (as of 1.59.0).
976
ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
977
KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
M
Miguel Ojeda 已提交
978
KBUILD_RUSTFLAGS_KERNEL += -Zfunction-sections=y
979
LDFLAGS_vmlinux += --gc-sections
980 981
endif

982
ifdef CONFIG_SHADOW_CALL_STACK
983
ifndef CONFIG_DYNAMIC_SCS
984 985
CC_FLAGS_SCS	:= -fsanitize=shadow-call-stack
KBUILD_CFLAGS	+= $(CC_FLAGS_SCS)
986
endif
987 988 989
export CC_FLAGS_SCS
endif

990 991
ifdef CONFIG_LTO_CLANG
ifdef CONFIG_LTO_CLANG_THIN
992
CC_FLAGS_LTO	:= -flto=thin -fsplit-lto-unit
993
KBUILD_LDFLAGS	+= --thinlto-cache-dir=$(extmod_prefix).thinlto-cache
994
else
995
CC_FLAGS_LTO	:= -flto
996 997
endif
CC_FLAGS_LTO	+= -fvisibility=hidden
S
Sami Tolvanen 已提交
998 999 1000

# Limit inlining across translation units to reduce binary size
KBUILD_LDFLAGS += -mllvm -import-instr-limit=5
1001

1002 1003
# Check for frame size exceeding threshold during prolog/epilog insertion
# when using lld < 13.0.0.
1004
ifneq ($(CONFIG_FRAME_WARN),0)
1005
ifeq ($(call test-lt, $(CONFIG_LLD_VERSION), 130000),y)
1006 1007
KBUILD_LDFLAGS	+= -plugin-opt=-warn-stack-size=$(CONFIG_FRAME_WARN)
endif
1008
endif
1009
endif
1010 1011

ifdef CONFIG_LTO
1012 1013
KBUILD_CFLAGS	+= -fno-lto $(CC_FLAGS_LTO)
KBUILD_AFLAGS	+= -fno-lto
1014 1015 1016
export CC_FLAGS_LTO
endif

S
Sami Tolvanen 已提交
1017
ifdef CONFIG_CFI_CLANG
S
Sami Tolvanen 已提交
1018
CC_FLAGS_CFI	:= -fsanitize=kcfi
S
Sami Tolvanen 已提交
1019 1020 1021 1022
KBUILD_CFLAGS	+= $(CC_FLAGS_CFI)
export CC_FLAGS_CFI
endif

1023 1024
ifneq ($(CONFIG_FUNCTION_ALIGNMENT),0)
KBUILD_CFLAGS += -falign-functions=$(CONFIG_FUNCTION_ALIGNMENT)
1025 1026
endif

1027
# arch Makefile may override CC so keep this after arch Makefile is included
1028
NOSTDINC_FLAGS += -nostdinc
1029

L
Linus Torvalds 已提交
1030
# warn about C99 declaration after statement
1031
KBUILD_CFLAGS += -Wdeclaration-after-statement
L
Linus Torvalds 已提交
1032

K
Kees Cook 已提交
1033
# Variable Length Arrays (VLAs) should not be used anywhere in the kernel
1034
KBUILD_CFLAGS += -Wvla
K
Kees Cook 已提交
1035

S
Sam Ravnborg 已提交
1036
# disable pointer signed / unsigned warnings in gcc 4.0
1037
KBUILD_CFLAGS += -Wno-pointer-sign
L
Linus Torvalds 已提交
1038

1039 1040 1041 1042 1043
# In order to make sure new function cast mismatches are not introduced
# in the kernel (to avoid tripping CFI checking), the kernel should be
# globally built with -Wcast-function-type.
KBUILD_CFLAGS += $(call cc-option, -Wcast-function-type)

1044 1045 1046
# disable stringop warnings in gcc 8+
KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation)

1047
# We'll want to enable this eventually, but it's not going away for 5.7 at least
1048
KBUILD_CFLAGS += $(call cc-disable-warning, stringop-overflow)
1049

1050 1051 1052
# Another good warning that we'll want to enable eventually
KBUILD_CFLAGS += $(call cc-disable-warning, restrict)

1053
# Enabled with W=2, disabled by default as noisy
1054 1055 1056
ifdef CONFIG_CC_IS_GCC
KBUILD_CFLAGS += -Wno-maybe-uninitialized
endif
1057

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
# The allocators already balk at large sizes, so silence the compiler
# warnings for bounds checks involving those possible values. While
# -Wno-alloc-size-larger-than would normally be used here, earlier versions
# of gcc (<9.1) weirdly don't handle the option correctly when _other_
# warnings are produced (?!). Using -Walloc-size-larger-than=SIZE_MAX
# doesn't work (as it is documented to), silently resolving to "0" prior to
# version 9.1 (and producing an error more recently). Numeric values larger
# than PTRDIFF_MAX also don't work prior to version 9.1, which are silently
# ignored, continuing to default to PTRDIFF_MAX. So, left with no other
# choice, we must perform a versioned check to disable this warning.
# https://lore.kernel.org/lkml/20210824115859.187f272f@canb.auug.org.au
1069 1070
KBUILD_CFLAGS-$(call gcc-min-version, 90100) += -Wno-alloc-size-larger-than
KBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH)
1071

1072
# disable invalid "can't wrap" optimizations for signed / pointers
1073
KBUILD_CFLAGS	+= -fno-strict-overflow
1074

1075
# Make sure -fstack-check isn't enabled (like gentoo apparently did)
1076
KBUILD_CFLAGS  += -fno-stack-check
1077

1078
# conserve stack if available
1079 1080 1081
ifdef CONFIG_CC_IS_GCC
KBUILD_CFLAGS   += -fconserve-stack
endif
1082

1083
# Prohibit date/time macros, which would make the build non-deterministic
1084
KBUILD_CFLAGS   += -Werror=date-time
1085

1086 1087 1088
# enforce correct pointer usage
KBUILD_CFLAGS   += $(call cc-option,-Werror=incompatible-pointer-types)

1089 1090 1091
# Require designated initializers for all marked structures
KBUILD_CFLAGS   += $(call cc-option,-Werror=designated-init)

1092
# change __FILE__ to the relative path from the srctree
1093
KBUILD_CPPFLAGS += $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
1094

1095 1096
# include additional Makefiles when needed
include-y			:= scripts/Makefile.extrawarn
1097
include-$(CONFIG_DEBUG_INFO)	+= scripts/Makefile.debug
1098 1099
include-$(CONFIG_KASAN)		+= scripts/Makefile.kasan
include-$(CONFIG_KCSAN)		+= scripts/Makefile.kcsan
1100
include-$(CONFIG_KMSAN)		+= scripts/Makefile.kmsan
1101 1102
include-$(CONFIG_UBSAN)		+= scripts/Makefile.ubsan
include-$(CONFIG_KCOV)		+= scripts/Makefile.kcov
1103
include-$(CONFIG_RANDSTRUCT)	+= scripts/Makefile.randstruct
1104 1105 1106
include-$(CONFIG_GCC_PLUGINS)	+= scripts/Makefile.gcc-plugins

include $(addprefix $(srctree)/, $(include-y))
1107

1108 1109 1110
# scripts/Makefile.gcc-plugins is intentionally included last.
# Do not add $(call cc-option,...) below this line. When you build the kernel
# from the clean source tree, the GCC plugins do not exist at this point.
1111

M
Miguel Ojeda 已提交
1112
# Add user supplied CPPFLAGS, AFLAGS, CFLAGS and RUSTFLAGS as the last assignments
1113 1114 1115
KBUILD_CPPFLAGS += $(KCPPFLAGS)
KBUILD_AFLAGS   += $(KAFLAGS)
KBUILD_CFLAGS   += $(KCFLAGS)
M
Miguel Ojeda 已提交
1116
KBUILD_RUSTFLAGS += $(KRUSTFLAGS)
1117

1118 1119
KBUILD_LDFLAGS_MODULE += --build-id=sha1
LDFLAGS_vmlinux += --build-id=sha1
R
Roland McGrath 已提交
1120

1121 1122 1123 1124 1125
KBUILD_LDFLAGS	+= -z noexecstack
ifeq ($(CONFIG_LD_IS_BFD),y)
KBUILD_LDFLAGS	+= $(call ld-option,--no-warn-rwx-segments)
endif

1126
ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
1127
LDFLAGS_vmlinux	+= -X
1128 1129
endif

1130
ifeq ($(CONFIG_RELR),y)
1131
LDFLAGS_vmlinux	+= --pack-dyn-relocs=relr --use-android-relr-tags
1132 1133
endif

1134 1135 1136
# We never want expected sections to be placed heuristically by the
# linker. All sections should be explicitly named in the linker script.
ifdef CONFIG_LD_ORPHAN_WARN
1137
LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
1138 1139
endif

1140
# Align the bit size of userspace programs with the kernel
1141 1142
KBUILD_USERCFLAGS  += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
KBUILD_USERLDFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
1143

1144 1145 1146
# make the checker run with the right architecture
CHECKFLAGS += --arch=$(ARCH)

1147 1148 1149
# insure the checker run with the right endianness
CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian)

1150 1151 1152
# the checker needs the correct machine size
CHECKFLAGS += $(if $(CONFIG_64BIT),-m64,-m32)

L
Linus Torvalds 已提交
1153
# Default kernel image to build when no specific target is given.
S
Sam Ravnborg 已提交
1154
# KBUILD_IMAGE may be overruled on the command line or
L
Linus Torvalds 已提交
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
# 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

1165 1166 1167 1168 1169 1170 1171
#
# 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)

L
Linus Torvalds 已提交
1172 1173 1174
#
# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
# relocations required by build roots.  This is not defined in the
S
Sam Ravnborg 已提交
1175
# makefile but the argument can be passed to make if needed.
L
Linus Torvalds 已提交
1176 1177
#

1178
MODLIB	= $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
L
Linus Torvalds 已提交
1179 1180
export MODLIB

1181
PHONY += prepare0
1182

1183
export extmod_prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)
1184 1185
export MODORDER := $(extmod_prefix)modules.order
export MODULES_NSDEPS := $(extmod_prefix)modules.nsdeps
1186

L
Linus Torvalds 已提交
1187 1188
ifeq ($(KBUILD_EXTMOD),)

1189 1190
build-dir	:= .
clean-dirs	:= $(sort . Documentation \
1191
		     $(patsubst %/,%,$(filter %/, $(core-) \
1192
			$(drivers-) $(libs-))))
L
Linus Torvalds 已提交
1193

1194 1195 1196
export ARCH_CORE	:= $(core-y)
export ARCH_LIB		:= $(filter %/, $(libs-y))
export ARCH_DRIVERS	:= $(drivers-y) $(drivers-m)
1197
# Externally visible symbols (used by link-vmlinux.sh)
1198

1199
KBUILD_VMLINUX_OBJS := ./built-in.a
1200
ifdef CONFIG_MODULES
1201 1202
KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
KBUILD_VMLINUX_LIBS := $(filter-out %/, $(libs-y))
1203
else
1204
KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y))
1205
endif
L
Linus Torvalds 已提交
1206

1207
export KBUILD_VMLINUX_LIBS
1208
export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
L
Linus Torvalds 已提交
1209

1210 1211
# Recurse until adjust_autoksyms.sh is satisfied
PHONY += autoksyms_recursive
1212
ifdef CONFIG_TRIM_UNUSED_KSYMS
1213 1214 1215
# 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)
1216 1217
KBUILD_MODULES := 1

1218
autoksyms_recursive: $(build-dir) modules.order
1219
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
1220
	  "$(MAKE) -f $(srctree)/Makefile autoksyms_recursive"
1221 1222
endif

1223 1224
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)

1225 1226 1227 1228
quiet_cmd_autoksyms_h = GEN     $@
      cmd_autoksyms_h = mkdir -p $(dir $@); \
			$(CONFIG_SHELL) $(srctree)/scripts/gen_autoksyms.sh $@

1229
$(autoksyms_h):
1230
	$(call cmd,autoksyms_h)
1231

1232 1233 1234 1235 1236
# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
quiet_cmd_ar_vmlinux.a = AR      $@
      cmd_ar_vmlinux.a = \
	rm -f $@; \
	$(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
1237
	$(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
1238

1239
targets += vmlinux.a
M
Masahiro Yamada 已提交
1240
vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE
1241
	$(call if_changed,ar_vmlinux.a)
1242

1243 1244
PHONY += vmlinux_o
vmlinux_o: vmlinux.a $(KBUILD_VMLINUX_LIBS)
1245
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o
1246

1247 1248 1249
vmlinux.o modules.builtin.modinfo modules.builtin: vmlinux_o
	@:

1250 1251 1252
PHONY += vmlinux
vmlinux: vmlinux.o $(KBUILD_LDS) modpost
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux
1253

1254
# The actual objects are generated when descending,
L
Linus Torvalds 已提交
1255
# make sure no implicit rule kicks in
1256
$(sort $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)): . ;
L
Linus Torvalds 已提交
1257

1258
filechk_kernel.release = \
1259 1260
	echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"

G
Geert Uytterhoeven 已提交
1261
# Store (new) KERNELRELEASE string in include/config/kernel.release
1262
include/config/kernel.release: FORCE
1263
	$(call filechk,kernel.release)
1264

1265 1266 1267 1268
# Additional helpers built in scripts/
# Carefully list dependencies so we do not try to build scripts twice
# in parallel
PHONY += scripts
1269
scripts: scripts_basic scripts_dtc
1270
	$(Q)$(MAKE) $(build)=$(@)
1271

L
Linus Torvalds 已提交
1272
# Things we need to do before we recursively start building the kernel
1273 1274 1275 1276
# 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.
L
Linus Torvalds 已提交
1277

M
Masahiro Yamada 已提交
1278
PHONY += prepare archprepare
1279

1280
archprepare: outputmakefile archheaders archscripts scripts include/config/kernel.release \
1281
	asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h \
1282
	include/generated/compile.h include/generated/autoconf.h remove-stale-files
1283

1284
prepare0: archprepare
1285
	$(Q)$(MAKE) $(build)=scripts/mod
1286
	$(Q)$(MAKE) $(build)=. prepare
1287

L
Linus Torvalds 已提交
1288
# All the preparing..
1289
prepare: prepare0
M
Miguel Ojeda 已提交
1290 1291 1292 1293
ifdef CONFIG_RUST
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh -v
	$(Q)$(MAKE) $(build)=rust
endif
1294

1295 1296 1297 1298
PHONY += remove-stale-files
remove-stale-files:
	$(Q)$(srctree)/scripts/remove-stale-files

1299
# Support for using generic headers in asm-generic
1300 1301
asm-generic := -f $(srctree)/scripts/Makefile.asm-generic obj

1302 1303
PHONY += asm-generic uapi-asm-generic
asm-generic: uapi-asm-generic
1304 1305
	$(Q)$(MAKE) $(asm-generic)=arch/$(SRCARCH)/include/generated/asm \
	generic=include/asm-generic
1306
uapi-asm-generic:
1307 1308
	$(Q)$(MAKE) $(asm-generic)=arch/$(SRCARCH)/include/generated/uapi/asm \
	generic=include/uapi/asm-generic
1309

L
Linus Torvalds 已提交
1310 1311 1312 1313 1314 1315 1316
# 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 builds

uts_len := 64
S
Sam Ravnborg 已提交
1317 1318 1319 1320 1321
define filechk_utsrelease.h
	if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
	  echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2;    \
	  exit 1;                                                         \
	fi;                                                               \
1322
	echo \#define UTS_RELEASE \"$(KERNELRELEASE)\"
S
Sam Ravnborg 已提交
1323
endef
L
Linus Torvalds 已提交
1324 1325

define filechk_version.h
S
Sasha Levin 已提交
1326 1327
	if [ $(SUBLEVEL) -gt 255 ]; then                                 \
		echo \#define LINUX_VERSION_CODE $(shell                 \
1328
		expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + 255); \
S
Sasha Levin 已提交
1329 1330
	else                                                             \
		echo \#define LINUX_VERSION_CODE $(shell                 \
1331
		expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \
S
Sasha Levin 已提交
1332 1333
	fi;                                                              \
	echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) +  \
1334 1335 1336 1337
	((c) > 255 ? 255 : (c)))';                                       \
	echo \#define LINUX_VERSION_MAJOR $(VERSION);                    \
	echo \#define LINUX_VERSION_PATCHLEVEL $(PATCHLEVEL);            \
	echo \#define LINUX_VERSION_SUBLEVEL $(SUBLEVEL)
L
Linus Torvalds 已提交
1338 1339
endef

1340 1341
$(version_h): PATCHLEVEL := $(or $(PATCHLEVEL), 0)
$(version_h): SUBLEVEL := $(or $(SUBLEVEL), 0)
1342
$(version_h): FORCE
L
Linus Torvalds 已提交
1343 1344
	$(call filechk,version.h)

1345
include/generated/utsrelease.h: include/config/kernel.release FORCE
S
Sam Ravnborg 已提交
1346 1347
	$(call filechk,utsrelease.h)

1348 1349 1350 1351 1352 1353
filechk_compile.h = $(srctree)/scripts/mkcompile_h \
	"$(UTS_MACHINE)" "$(CONFIG_CC_VERSION_TEXT)" "$(LD)"

include/generated/compile.h: FORCE
	$(call filechk,compile.h)

1354 1355
PHONY += headerdep
headerdep:
1356 1357
	$(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
	$(srctree)/scripts/headerdep.pl -I$(srctree)/include
1358

1359 1360 1361
# ---------------------------------------------------------------------------
# Kernel headers

1362 1363
#Default location for installed headers
export INSTALL_HDR_PATH = $(objtree)/usr
1364

1365 1366 1367 1368 1369
quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include
      cmd_headers_install = \
	mkdir -p $(INSTALL_HDR_PATH); \
	rsync -mrl --include='*/' --include='*\.h' --exclude='*' \
	usr/include $(INSTALL_HDR_PATH)
1370

1371
PHONY += headers_install
1372 1373
headers_install: headers
	$(call cmd,headers_install)
1374

1375
PHONY += archheaders archscripts
1376

1377
hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj
1378

1379 1380
PHONY += headers
headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts
1381
	$(if $(filter um, $(SRCARCH)), $(error Headers not exportable for UML))
1382 1383
	$(Q)$(MAKE) $(hdr-inst)=include/uapi
	$(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi
1384

1385
ifdef CONFIG_HEADERS_INSTALL
1386
prepare: headers
1387
endif
1388

1389 1390 1391 1392
PHONY += scripts_unifdef
scripts_unifdef: scripts_basic
	$(Q)$(MAKE) $(build)=scripts scripts/unifdef

1393 1394 1395 1396
# ---------------------------------------------------------------------------
# Install

# Many distributions have the custom install script, /sbin/installkernel.
R
Randy Dunlap 已提交
1397 1398
# If DKMS is installed, 'make install' will eventually recurse back
# to this Makefile to build and install external modules.
1399 1400
# Cancel sub_make_done so that options such as M=, V=, etc. are parsed.

1401 1402
quiet_cmd_install = INSTALL $(INSTALL_PATH)
      cmd_install = unset sub_make_done; $(srctree)/scripts/install.sh
1403

1404 1405 1406
# ---------------------------------------------------------------------------
# Tools

J
Josh Poimboeuf 已提交
1407
ifdef CONFIG_OBJTOOL
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427
prepare: tools/objtool
endif

ifdef CONFIG_BPF
ifdef CONFIG_DEBUG_INFO_BTF
prepare: tools/bpf/resolve_btfids
endif
endif

PHONY += resolve_btfids_clean

resolve_btfids_O = $(abspath $(objtree))/tools/bpf/resolve_btfids

# tools/bpf/resolve_btfids directory might not exist
# in output directory, skip its clean in that case
resolve_btfids_clean:
ifneq ($(wildcard $(resolve_btfids_O)),)
	$(Q)$(MAKE) -sC $(srctree)/tools/bpf/resolve_btfids O=$(resolve_btfids_O) clean
endif

1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440
# Clear a bunch of variables before executing the submake
ifeq ($(quiet),silent_)
tools_silent=s
endif

tools/: FORCE
	$(Q)mkdir -p $(objtree)/tools
	$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(srctree)/tools/

tools/%: FORCE
	$(Q)mkdir -p $(objtree)/tools
	$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(srctree)/tools/ $*

1441 1442 1443 1444
# ---------------------------------------------------------------------------
# Kernel selftest

PHONY += kselftest
1445
kselftest: headers
1446
	$(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests
1447

1448
kselftest-%: headers FORCE
1449
	$(Q)$(MAKE) -C $(srctree)/tools/testing/selftests $*
W
Wang Long 已提交
1450

1451 1452 1453
PHONY += kselftest-merge
kselftest-merge:
	$(if $(wildcard $(objtree)/.config),, $(error No .config exists, config your kernel first!))
1454 1455
	$(Q)find $(srctree)/tools/testing/selftests -name config | \
		xargs $(srctree)/scripts/kconfig/merge_config.sh -m $(objtree)/.config
1456
	$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig
1457

1458 1459 1460 1461 1462 1463 1464 1465 1466
# ---------------------------------------------------------------------------
# Devicetree files

ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/boot/dts/),)
dtstree := arch/$(SRCARCH)/boot/dts
endif

ifneq ($(dtstree),)

1467
%.dtb: dtbs_prepare
1468
	$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
1469

1470
%.dtbo: dtbs_prepare
1471
	$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
1472

1473 1474
PHONY += dtbs dtbs_prepare dtbs_install dtbs_check
dtbs: dtbs_prepare
1475 1476
	$(Q)$(MAKE) $(build)=$(dtstree)

1477 1478 1479 1480 1481
# include/config/kernel.release is actually needed when installing DTBs because
# INSTALL_DTBS_PATH contains $(KERNELRELEASE). However, we do not want to make
# dtbs_install depend on it as dtbs_install may run as root.
dtbs_prepare: include/config/kernel.release scripts_dtc

1482
ifneq ($(filter dtbs_check, $(MAKECMDGOALS)),)
1483
export CHECK_DTBS=y
1484 1485 1486 1487
dtbs: dt_binding_check
endif

dtbs_check: dtbs
1488

1489
dtbs_install:
1490
	$(Q)$(MAKE) $(dtbinst)=$(dtstree) dst=$(INSTALL_DTBS_PATH)
1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501

ifdef CONFIG_OF_EARLY_FLATTREE
all: dtbs
endif

endif

PHONY += scripts_dtc
scripts_dtc: scripts_basic
	$(Q)$(MAKE) $(build)=scripts/dtc

1502 1503 1504 1505
ifneq ($(filter dt_binding_check, $(MAKECMDGOALS)),)
export CHECK_DT_BINDING=y
endif

1506
PHONY += dt_binding_check
1507 1508 1509
dt_binding_check: scripts_dtc
	$(Q)$(MAKE) $(build)=Documentation/devicetree/bindings

1510 1511 1512 1513
PHONY += dt_compatible_check
dt_compatible_check: dt_binding_check
	$(Q)$(MAKE) $(build)=Documentation/devicetree/bindings $@

L
Linus Torvalds 已提交
1514 1515 1516 1517 1518
# ---------------------------------------------------------------------------
# Modules

ifdef CONFIG_MODULES

S
Sam Ravnborg 已提交
1519
# By default, build modules as well
L
Linus Torvalds 已提交
1520

1521
all: modules
L
Linus Torvalds 已提交
1522

1523 1524 1525 1526 1527 1528 1529
# 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.
ifdef CONFIG_MODVERSIONS
  KBUILD_BUILTIN := 1
endif

1530
# Build modules
T
Tejun Heo 已提交
1531
#
L
Linus Torvalds 已提交
1532

1533 1534 1535 1536 1537
# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES
# is an exception.
ifdef CONFIG_DEBUG_INFO_BTF_MODULES
modules: vmlinux
endif
1538

1539
modules: modules_prepare
1540

L
Linus Torvalds 已提交
1541
# Target to prepare building external modules
1542
modules_prepare: prepare
1543
	$(Q)$(MAKE) $(build)=scripts scripts/module.lds
L
Linus Torvalds 已提交
1544

1545 1546 1547 1548 1549 1550
export modules_sign_only :=

ifeq ($(CONFIG_MODULE_SIG),y)
PHONY += modules_sign
modules_sign: modules_install
	@:
L
Linus Torvalds 已提交
1551

1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564
# modules_sign is a subset of modules_install.
# 'make modules_install modules_sign' is equivalent to 'make modules_install'.
ifeq ($(filter modules_install,$(MAKECMDGOALS)),)
modules_sign_only := y
endif
endif

modinst_pre :=
ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
modinst_pre := __modinst_pre
endif

modules_install: $(modinst_pre)
1565 1566
PHONY += __modinst_pre
__modinst_pre:
L
Linus Torvalds 已提交
1567 1568 1569
	@rm -rf $(MODLIB)/kernel
	@rm -f $(MODLIB)/source
	@mkdir -p $(MODLIB)/kernel
1570
	@ln -s $(abspath $(srctree)) $(MODLIB)/source
L
Linus Torvalds 已提交
1571 1572
	@if [ ! $(objtree) -ef  $(MODLIB)/build ]; then \
		rm -f $(MODLIB)/build ; \
1573
		ln -s $(CURDIR) $(MODLIB)/build ; \
L
Linus Torvalds 已提交
1574
	fi
1575
	@sed 's:^\(.*\)\.o$$:kernel/\1.ko:' modules.order > $(MODLIB)/modules.order
1576 1577
	@cp -f modules.builtin $(MODLIB)/
	@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
L
Linus Torvalds 已提交
1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588

endif # 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'
1589
CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \
1590
	       modules.builtin modules.builtin.modinfo modules.nsdeps \
1591 1592
	       compile_commands.json .thinlto-cache rust/test rust/doc \
	       .vmlinux.objs .vmlinux.export.c
L
Linus Torvalds 已提交
1593 1594

# Directories & files removed with 'make mrproper'
1595
MRPROPER_FILES += include/config include/generated          \
1596
		  arch/$(SRCARCH)/include/generated .objdiff \
1597 1598
		  debian snap tar-install \
		  .config .config.old .version \
1599
		  Module.symvers \
M
Masahiro Yamada 已提交
1600
		  certs/signing_key.pem \
1601 1602
		  certs/x509.genkey \
		  vmlinux-gdb.py \
M
Miguel Ojeda 已提交
1603 1604
		  *.spec \
		  rust/target.json rust/libmacros.so
L
Linus Torvalds 已提交
1605 1606 1607 1608 1609

# clean - Delete most, but leave enough to build external modules
#
clean: rm-files := $(CLEAN_FILES)

1610
PHONY += archclean vmlinuxclean
L
Linus Torvalds 已提交
1611

1612 1613
vmlinuxclean:
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean
1614
	$(Q)$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) clean)
1615

1616
clean: archclean vmlinuxclean resolve_btfids_clean
L
Linus Torvalds 已提交
1617 1618 1619 1620

# mrproper - Delete all generated files, including .config
#
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
1621
mrproper-dirs      := $(addprefix _mrproper_,scripts)
L
Linus Torvalds 已提交
1622

1623
PHONY += $(mrproper-dirs) mrproper
L
Linus Torvalds 已提交
1624 1625 1626
$(mrproper-dirs):
	$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)

1627
mrproper: clean $(mrproper-dirs)
L
Linus Torvalds 已提交
1628
	$(call cmd,rmfiles)
M
Miguel Ojeda 已提交
1629 1630 1631
	@find . $(RCS_FIND_IGNORE) \
		\( -name '*.rmeta' \) \
		-type f -print | xargs rm -f
L
Linus Torvalds 已提交
1632 1633 1634

# distclean
#
1635
PHONY += distclean
L
Linus Torvalds 已提交
1636 1637

distclean: mrproper
1638
	@find . $(RCS_FIND_IGNORE) \
S
Sam Ravnborg 已提交
1639
		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
1640
		-o -name '*.bak' -o -name '#*#' -o -name '*%' \
1641 1642
		-o -name 'core' -o -name tags -o -name TAGS -o -name 'cscope*' \
		-o -name GPATH -o -name GRTAGS -o -name GSYMS -o -name GTAGS \) \
L
Linus Torvalds 已提交
1643 1644 1645 1646 1647 1648
		-type f -print | xargs rm -f


# Packaging of the kernel to various formats
# ---------------------------------------------------------------------------

1649
%src-pkg: FORCE
1650
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.package $@
1651
%pkg: include/config/kernel.release FORCE
1652
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.package $@
L
Linus Torvalds 已提交
1653 1654 1655 1656

# Brief documentation of the typical targets used
# ---------------------------------------------------------------------------

1657
boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig)
1658
boards := $(sort $(notdir $(boards)))
1659 1660
board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig))
board-dirs := $(sort $(notdir $(board-dirs:/=)))
L
Linus Torvalds 已提交
1661

1662
PHONY += help
L
Linus Torvalds 已提交
1663 1664
help:
	@echo  'Cleaning targets:'
1665
	@echo  '  clean		  - Remove most generated files but keep the config and'
1666
	@echo  '                    enough build support to build external modules'
1667
	@echo  '  mrproper	  - Remove all generated files + config + various backup files'
1668
	@echo  '  distclean	  - mrproper + remove editor backup and patch files'
L
Linus Torvalds 已提交
1669 1670 1671 1672 1673 1674 1675 1676
	@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'
1677
	@echo  '  modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
L
Linus Torvalds 已提交
1678
	@echo  '  dir/            - Build all files in dir and below'
1679
	@echo  '  dir/file.[ois]  - Build specified target only'
1680 1681
	@echo  '  dir/file.ll     - Build the LLVM assembly file'
	@echo  '                    (requires compiler support for LLVM assembly generation)'
1682 1683
	@echo  '  dir/file.lst    - Build specified mixed source/assembly target only'
	@echo  '                    (requires a recent binutils and recent build (System.map))'
1684
	@echo  '  dir/file.ko     - Build module including final link'
1685
	@echo  '  modules_prepare - Set up for building external modules'
L
Linus Torvalds 已提交
1686 1687
	@echo  '  tags/TAGS	  - Generate tags file for editors'
	@echo  '  cscope	  - Generate cscope index'
1688
	@echo  '  gtags           - Generate GNU GLOBAL index'
1689 1690 1691
	@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)'
1692
	@echo  '  headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
1693
	 echo  '                    (default: $(INSTALL_HDR_PATH))'; \
1694
	 echo  ''
R
Randy Dunlap 已提交
1695
	@echo  'Static analysers:'
L
Linus Torvalds 已提交
1696
	@echo  '  checkstack      - Generate a list of stack hogs'
1697
	@echo  '  versioncheck    - Sanity check on version.h usage'
1698
	@echo  '  includecheck    - Check for duplicate included header files'
1699
	@echo  '  export_report   - List the usages of all exported symbols'
1700
	@echo  '  headerdep       - Detect inclusion cycles in headers'
1701
	@echo  '  coccicheck      - Check with Coccinelle'
1702 1703
	@echo  '  clang-analyzer  - Check with clang static analyzer'
	@echo  '  clang-tidy      - Check with clang-tidy'
1704
	@echo  ''
1705 1706 1707
	@echo  'Tools:'
	@echo  '  nsdeps          - Generate missing symbol namespace dependencies'
	@echo  ''
R
Randy Dunlap 已提交
1708
	@echo  'Kernel selftest:'
1709 1710 1711 1712 1713 1714 1715 1716 1717
	@echo  '  kselftest         - Build and run kernel selftest'
	@echo  '                      Build, install, and boot kernel before'
	@echo  '                      running kselftest on it'
	@echo  '                      Run as root for full coverage'
	@echo  '  kselftest-all     - Build kernel selftest'
	@echo  '  kselftest-install - Build and install kernel selftest'
	@echo  '  kselftest-clean   - Remove all generated kselftest files'
	@echo  '  kselftest-merge   - Merge all the config dependencies of'
	@echo  '		      kselftest to existing .config.'
1718
	@echo  ''
M
Miguel Ojeda 已提交
1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736
	@echo  'Rust targets:'
	@echo  '  rustavailable   - Checks whether the Rust toolchain is'
	@echo  '		    available and, if not, explains why.'
	@echo  '  rustfmt	  - Reformat all the Rust code in the kernel'
	@echo  '  rustfmtcheck	  - Checks if all the Rust code in the kernel'
	@echo  '		    is formatted, printing a diff otherwise.'
	@echo  '  rustdoc	  - Generate Rust documentation'
	@echo  '		    (requires kernel .config)'
	@echo  '  rusttest        - Runs the Rust tests'
	@echo  '                    (requires kernel .config; downloads external repos)'
	@echo  '  rust-analyzer	  - Generate rust-project.json rust-analyzer support file'
	@echo  '		    (requires kernel .config)'
	@echo  '  dir/file.[os]   - Build specified target only'
	@echo  '  dir/file.rsi    - Build macro expanded source, similar to C preprocessing.'
	@echo  '                    Run with RUSTFMT=n to skip reformatting if needed.'
	@echo  '                    The output is not intended to be compilable.'
	@echo  '  dir/file.ll     - Build the LLVM assembly file'
	@echo  ''
1737 1738
	@$(if $(dtstree), \
		echo 'Devicetree:'; \
1739 1740 1741 1742
		echo '* dtbs             - Build device tree blobs for enabled boards'; \
		echo '  dtbs_install     - Install dtbs to $(INSTALL_DTBS_PATH)'; \
		echo '  dt_binding_check - Validate device tree binding documents'; \
		echo '  dtbs_check       - Validate device tree source files';\
1743 1744
		echo '')

R
Randy Dunlap 已提交
1745 1746 1747 1748
	@echo 'Userspace tools targets:'
	@echo '  use "make tools/help"'
	@echo '  or  "cd tools; make help"'
	@echo  ''
L
Linus Torvalds 已提交
1749
	@echo  'Kernel packaging:'
1750
	@$(MAKE) -f $(srctree)/scripts/Makefile.package help
L
Linus Torvalds 已提交
1751 1752
	@echo  ''
	@echo  'Documentation targets:'
1753
	@$(MAKE) -f $(srctree)/Documentation/Makefile dochelp
L
Linus Torvalds 已提交
1754
	@echo  ''
1755
	@echo  'Architecture specific targets ($(SRCARCH)):'
1756
	@$(or $(archhelp),\
1757
		echo '  No architecture specific help defined for $(SRCARCH)')
L
Linus Torvalds 已提交
1758 1759 1760
	@echo  ''
	@$(if $(boards), \
		$(foreach b, $(boards), \
1761
		printf "  %-27s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
L
Linus Torvalds 已提交
1762
		echo '')
1763 1764 1765 1766 1767
	@$(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 '')
L
Linus Torvalds 已提交
1768 1769

	@echo  '  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
1770
	@echo  '  make V=2   [targets] 2 => give reason for rebuild of target'
L
Linus Torvalds 已提交
1771
	@echo  '  make O=dir [targets] Locate all output files in "dir", including .config'
1772 1773
	@echo  '  make C=1   [targets] Check re-compiled c source with $$CHECK'
	@echo  '                       (sparse by default)'
1774
	@echo  '  make C=2   [targets] Force check of all c source with $$CHECK'
1775
	@echo  '  make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
1776
	@echo  '  make W=n   [targets] Enable extra build checks, n=1,2,3 where'
1777 1778 1779
	@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'
1780
	@echo  '		e: warnings are being treated as errors'
1781
	@echo  '		Multiple levels can be combined with W=12 or W=123'
L
Linus Torvalds 已提交
1782 1783 1784 1785 1786
	@echo  ''
	@echo  'Execute "make" or "make all" to build all targets marked with [*] '
	@echo  'For further info see the ./README file'


1787 1788 1789 1790
help-board-dirs := $(addprefix help-,$(board-dirs))

help-boards: $(help-board-dirs)

1791
boards-per-dir = $(sort $(notdir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/$*/*_defconfig)))
1792 1793 1794 1795 1796 1797 1798 1799 1800

$(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 '')


L
Linus Torvalds 已提交
1801 1802
# Documentation targets
# ---------------------------------------------------------------------------
1803
DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \
1804
	       linkcheckdocs dochelp refcheckdocs texinfodocs infodocs
1805
PHONY += $(DOC_TARGETS)
1806
$(DOC_TARGETS):
1807
	$(Q)$(MAKE) $(build)=Documentation $@
L
Linus Torvalds 已提交
1808

M
Miguel Ojeda 已提交
1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854

# Rust targets
# ---------------------------------------------------------------------------

# "Is Rust available?" target
PHONY += rustavailable
rustavailable:
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh -v && echo "Rust is available!"

# Documentation target
#
# Using the singular to avoid running afoul of `no-dot-config-targets`.
PHONY += rustdoc
rustdoc: prepare
	$(Q)$(MAKE) $(build)=rust $@

# Testing target
PHONY += rusttest
rusttest: prepare
	$(Q)$(MAKE) $(build)=rust $@

# Formatting targets
PHONY += rustfmt rustfmtcheck

# We skip `rust/alloc` since we want to minimize the diff w.r.t. upstream.
#
# We match using absolute paths since `find` does not resolve them
# when matching, which is a problem when e.g. `srctree` is `..`.
# We `grep` afterwards in order to remove the directory entry itself.
rustfmt:
	$(Q)find $(abs_srctree) -type f -name '*.rs' \
		-o -path $(abs_srctree)/rust/alloc -prune \
		-o -path $(abs_objtree)/rust/test -prune \
		| grep -Fv $(abs_srctree)/rust/alloc \
		| grep -Fv $(abs_objtree)/rust/test \
		| grep -Fv generated \
		| xargs $(RUSTFMT) $(rustfmt_flags)

rustfmtcheck: rustfmt_flags = --check
rustfmtcheck: rustfmt

# IDE support targets
PHONY += rust-analyzer
rust-analyzer:
	$(Q)$(MAKE) $(build)=rust $@

1855 1856 1857 1858
# Misc
# ---------------------------------------------------------------------------

PHONY += scripts_gdb
1859
scripts_gdb: prepare0
1860
	$(Q)$(MAKE) $(build)=scripts/gdb
1861
	$(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py)
1862 1863 1864 1865 1866

ifdef CONFIG_GDB_SCRIPTS
all: scripts_gdb
endif

L
Linus Torvalds 已提交
1867 1868 1869 1870 1871 1872 1873
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
1874
# in the basis kernel ordinary make commands (without M=...) must be used.
L
Linus Torvalds 已提交
1875

1876 1877
# We are always building only modules.
KBUILD_BUILTIN :=
L
Linus Torvalds 已提交
1878 1879
KBUILD_MODULES := 1

1880
build-dir := $(KBUILD_EXTMOD)
1881

1882
compile_commands.json: $(extmod_prefix)compile_commands.json
1883 1884
PHONY += compile_commands.json

1885
clean-dirs := $(KBUILD_EXTMOD)
1886
clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers $(KBUILD_EXTMOD)/modules.nsdeps \
1887
	$(KBUILD_EXTMOD)/compile_commands.json $(KBUILD_EXTMOD)/.thinlto-cache
L
Linus Torvalds 已提交
1888

1889 1890 1891 1892
PHONY += prepare
# now expand this into a simple variable to reduce the cost of shell evaluations
prepare: CC_VERSION_TEXT := $(CC_VERSION_TEXT)
prepare:
1893
	@if [ "$(CC_VERSION_TEXT)" != "$(CONFIG_CC_VERSION_TEXT)" ]; then \
1894
		echo >&2 "warning: the compiler differs from the one used to build the kernel"; \
1895
		echo >&2 "  The kernel was built by: $(CONFIG_CC_VERSION_TEXT)"; \
1896 1897 1898
		echo >&2 "  You are using:           $(CC_VERSION_TEXT)"; \
	fi

1899
PHONY += help
L
Linus Torvalds 已提交
1900 1901 1902 1903 1904 1905 1906 1907
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  ''
1908

L
Linus Torvalds 已提交
1909 1910
endif # KBUILD_EXTMOD

1911 1912 1913
# ---------------------------------------------------------------------------
# Modules

1914
PHONY += modules modules_install modules_prepare
1915 1916 1917

ifdef CONFIG_MODULES

1918 1919 1920
$(MODORDER): $(build-dir)
	@:

1921 1922 1923 1924 1925 1926
# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
# This is solely useful to speed up test compiles.
modules: modpost
ifneq ($(KBUILD_MODPOST_NOFINAL),1)
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
endif
1927

1928 1929 1930 1931
PHONY += modules_check
modules_check: $(MODORDER)
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh $<

1932
quiet_cmd_depmod = DEPMOD  $(MODLIB)
1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952
      cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
                   $(KERNELRELEASE)

modules_install:
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
	$(call cmd,depmod)

else # CONFIG_MODULES

# Modules not configured
# ---------------------------------------------------------------------------

modules modules_install:
	@echo >&2 '***'
	@echo >&2 '*** The present kernel configuration has modules disabled.'
	@echo >&2 '*** To use the module feature, please run "make menuconfig" etc.'
	@echo >&2 '*** to enable CONFIG_MODULES.'
	@echo >&2 '***'
	@exit 1

1953 1954
KBUILD_MODULES :=

1955 1956
endif # CONFIG_MODULES

1957 1958 1959 1960 1961
PHONY += modpost
modpost: $(if $(single-build),, $(if $(KBUILD_BUILTIN), vmlinux.o)) \
	 $(if $(KBUILD_MODULES), modules_check)
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977
# Single targets
# ---------------------------------------------------------------------------
# To build individual files in subdirectories, you can do like this:
#
#   make foo/bar/baz.s
#
# The supported suffixes for single-target are listed in 'single-targets'
#
# To build only under specific subdirectories, you can do like this:
#
#   make foo/bar/baz/

ifdef single-build

# .ko is special because modpost is needed
single-ko := $(sort $(filter %.ko, $(MAKECMDGOALS)))
1978 1979
single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \
		$(foreach x, o mod, $(patsubst %.ko, %.$x, $(single-ko)))
1980

1981
$(single-ko): single_modules
1982
	@:
1983
$(single-no-ko): $(build-dir)
1984 1985
	@:

1986
# Remove MODORDER when done because it is not the real one.
1987 1988
PHONY += single_modules
single_modules: $(single-no-ko) modules_prepare
M
Masahiro Yamada 已提交
1989
	$(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$(m:%.ko=%.o);) } > $(MODORDER)
1990
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
1991 1992
ifneq ($(KBUILD_MODPOST_NOFINAL),1)
	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
1993
endif
1994
	$(Q)rm -f $(MODORDER)
1995

1996
single-goals := $(addprefix $(build-dir)/, $(single-no-ko))
1997

1998 1999
KBUILD_MODULES := 1

2000 2001
endif

2002 2003 2004 2005
# 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 language
2006 2007 2008
PHONY += $(build-dir)
$(build-dir): prepare
	$(Q)$(MAKE) $(build)=$@ need-builtin=1 need-modorder=1 $(single-goals)
2009

2010 2011 2012 2013 2014
clean-dirs := $(addprefix _clean_, $(clean-dirs))
PHONY += $(clean-dirs) clean
$(clean-dirs):
	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)

2015 2016
clean: $(clean-dirs)
	$(call cmd,rmfiles)
2017
	@find $(or $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
M
Miguel Ojeda 已提交
2018
		\( -name '*.[aios]' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \
2019
		-o -name '*.ko.*' \
2020 2021 2022
		-o -name '*.dtb' -o -name '*.dtbo' \
		-o -name '*.dtb.S' -o -name '*.dtbo.S' \
		-o -name '*.dt.yaml' \
2023
		-o -name '*.dwo' -o -name '*.lst' \
2024
		-o -name '*.su' -o -name '*.mod' -o -name '*.usyms' \
2025
		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
2026
		-o -name '*.lex.c' -o -name '*.tab.[ch]' \
2027
		-o -name '*.asn1.[ch]' \
2028
		-o -name '*.symtypes' -o -name 'modules.order' \
2029
		-o -name '.tmp_*' \
E
Emese Revfy 已提交
2030
		-o -name '*.c.[012]*.*' \
2031
		-o -name '*.ll' \
2032 2033
		-o -name '*.gcno' \
		-o -name '*.*.symversions' \) -type f -print | xargs rm -f
2034

L
Linus Torvalds 已提交
2035 2036
# Generate tags for editors
# ---------------------------------------------------------------------------
2037
quiet_cmd_tags = GEN     $@
2038
      cmd_tags = $(BASH) $(srctree)/scripts/tags.sh $@
L
Linus Torvalds 已提交
2039

2040
tags TAGS cscope gtags: FORCE
L
Linus Torvalds 已提交
2041 2042
	$(call cmd,tags)

2043 2044 2045 2046
# Script to generate missing namespace dependencies
# ---------------------------------------------------------------------------

PHONY += nsdeps
2047
nsdeps: export KBUILD_NSDEPS=1
2048
nsdeps: modules
2049
	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/nsdeps
2050

2051 2052 2053 2054 2055 2056
# Clang Tooling
# ---------------------------------------------------------------------------

quiet_cmd_gen_compile_commands = GEN     $@
      cmd_gen_compile_commands = $(PYTHON3) $< -a $(AR) -o $@ $(filter-out $<, $(real-prereqs))

2057
$(extmod_prefix)compile_commands.json: scripts/clang-tools/gen_compile_commands.py \
2058
	$(if $(KBUILD_EXTMOD),, vmlinux.a $(KBUILD_VMLINUX_LIBS)) \
2059 2060 2061
	$(if $(CONFIG_MODULES), $(MODORDER)) FORCE
	$(call if_changed,gen_compile_commands)

2062
targets += $(extmod_prefix)compile_commands.json
2063

2064 2065 2066 2067 2068 2069
PHONY += clang-tidy clang-analyzer

ifdef CONFIG_CC_IS_CLANG
quiet_cmd_clang_tools = CHECK   $<
      cmd_clang_tools = $(PYTHON3) $(srctree)/scripts/clang-tools/run-clang-tools.py $@ $<

2070
clang-tidy clang-analyzer: $(extmod_prefix)compile_commands.json
2071 2072 2073 2074 2075 2076 2077
	$(call cmd,clang_tools)
else
clang-tidy clang-analyzer:
	@echo "$@ requires CC=clang" >&2
	@false
endif

L
Linus Torvalds 已提交
2078 2079 2080
# Scripts to check various things for consistency
# ---------------------------------------------------------------------------

J
Jacob Keller 已提交
2081
PHONY += includecheck versioncheck coccicheck export_report
P
Peter Foley 已提交
2082

L
Linus Torvalds 已提交
2083
includecheck:
2084
	find $(srctree)/* $(RCS_FIND_IGNORE) \
L
Linus Torvalds 已提交
2085
		-name '*.[hcS]' -type f -print | sort \
2086
		| xargs $(PERL) -w $(srctree)/scripts/checkincludes.pl
L
Linus Torvalds 已提交
2087 2088

versioncheck:
2089
	find $(srctree)/* $(RCS_FIND_IGNORE) \
L
Linus Torvalds 已提交
2090
		-name '*.[hcS]' -type f -print | sort \
2091
		| xargs $(PERL) -w $(srctree)/scripts/checkversion.pl
L
Linus Torvalds 已提交
2092

2093
coccicheck:
2094
	$(Q)$(BASH) $(srctree)/scripts/$@
2095

2096 2097 2098
export_report:
	$(PERL) $(srctree)/scripts/export_report.pl

2099
PHONY += checkstack kernelrelease kernelversion image_name
J
Jeff Dike 已提交
2100

J
Jeff Dike 已提交
2101 2102 2103 2104 2105 2106 2107 2108 2109
# 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
L
Linus Torvalds 已提交
2110 2111
checkstack:
	$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
2112
	$(PERL) $(srctree)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
L
Linus Torvalds 已提交
2113

2114 2115
kernelrelease:
	@echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
2116

2117
kernelversion:
2118
	@echo $(KERNELVERSION)
L
Linus Torvalds 已提交
2119

2120 2121 2122
image_name:
	@echo $(KBUILD_IMAGE)

L
Linus Torvalds 已提交
2123
quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN   $(wildcard $(rm-files)))
2124
      cmd_rmfiles = rm -rf $(rm-files)
L
Linus Torvalds 已提交
2125

2126 2127
# read saved command lines for existing targets
existing-targets := $(wildcard $(sort $(targets)))
L
Linus Torvalds 已提交
2128

2129
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
L
Linus Torvalds 已提交
2130

2131
endif # config-build
2132 2133
endif # mixed-build
endif # need-sub-make
L
Linus Torvalds 已提交
2134

2135
PHONY += FORCE
L
Linus Torvalds 已提交
2136
FORCE:
2137

2138
# Declare the contents of the PHONY variable as phony.  We keep that
2139
# information in a variable so we can use it in if_changed and friends.
2140
.PHONY: $(PHONY)