2022-06-12 11:37:02 +00:00
|
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
# *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:
|
|
|
|
# o use make's built-in rules and variables
|
|
|
|
# (this increases performance and avoids hard-to-debug behaviour);
|
|
|
|
# o print "Entering directory ...";
|
2022-06-16 11:37:20 +00:00
|
|
|
ARCH ?= aarch64
|
2022-06-14 14:14:56 +00:00
|
|
|
MAKEFLAGS += -rR --no-print-directory
|
|
|
|
|
|
|
|
# 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)
|
|
|
|
endif
|
|
|
|
ifndef KBUILD_VERBOSE
|
|
|
|
KBUILD_VERBOSE = 0
|
|
|
|
endif
|
|
|
|
|
|
|
|
# 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/"
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
# 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
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
# The O= assignment takes precedence over the KBUILD_OUTPUT environment
|
|
|
|
# variable.
|
|
|
|
|
|
|
|
# Our default target
|
|
|
|
PHONY := _all
|
|
|
|
_all:
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
ifeq ("$(origin W)", "command line")
|
|
|
|
export KBUILD_ENABLE_EXTRA_GCC_CHECKS := $(W)
|
|
|
|
endif
|
|
|
|
|
|
|
|
# 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 exists
|
|
|
|
saved-output := $(KBUILD_OUTPUT)
|
|
|
|
KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
|
|
|
|
$(if $(KBUILD_OUTPUT),, \
|
|
|
|
$(error output directory "$(saved-output)" does not exist))
|
|
|
|
|
|
|
|
PHONY += $(MAKECMDGOALS) sub-make
|
|
|
|
|
|
|
|
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
|
|
|
|
$(Q)@:
|
2022-06-12 11:37:02 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
sub-make: FORCE
|
|
|
|
$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
|
|
|
|
KBUILD_SRC=$(CURDIR) \
|
|
|
|
-f $(CURDIR)/Makefile \
|
|
|
|
$(filter-out _all sub-make,$(MAKECMDGOALS))
|
|
|
|
|
|
|
|
# Leave processing to above invocation of make
|
|
|
|
skip-makefile := 1
|
|
|
|
endif # ifneq ($(KBUILD_OUTPUT),)
|
|
|
|
endif # ifeq ($(KBUILD_SRC),)
|
|
|
|
|
|
|
|
# We process the rest of the Makefile if this is the final invocation of make
|
|
|
|
ifeq ($(skip-makefile),)
|
|
|
|
|
|
|
|
# If building an external module we do not care about the all: rule
|
|
|
|
# but instead _all depend on modules
|
|
|
|
PHONY += all
|
|
|
|
_all: all
|
|
|
|
|
|
|
|
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
|
|
|
|
objtree := $(CURDIR)
|
|
|
|
src := $(srctree)
|
|
|
|
obj := $(objtree)
|
|
|
|
|
|
|
|
VPATH := $(srctree)
|
|
|
|
|
|
|
|
export srctree objtree VPATH
|
|
|
|
|
|
|
|
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
|
2022-06-14 18:50:15 +00:00
|
|
|
KERNEL_PATH ?= $(CONFIG_KERNEL_PATH:"%"=%)
|
|
|
|
DT_PATH ?= $(CONFIG_DT_PATH:"%"=%)
|
2024-10-12 16:39:11 +00:00
|
|
|
RAMDISK_PATH ?= $(CONFIG_RAMDISK_PATH:"%"=%)
|
2024-08-06 08:12:31 +00:00
|
|
|
TEXT_BASE ?= $(CONFIG_TEXT_BASE:"%"=%)
|
2022-06-14 14:14:56 +00:00
|
|
|
|
|
|
|
KCONFIG_CONFIG ?= .config
|
|
|
|
export KCONFIG_CONFIG
|
|
|
|
|
|
|
|
# SHELL used by kbuild
|
|
|
|
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
|
|
|
|
else if [ -x /bin/bash ]; then echo /bin/bash; \
|
|
|
|
else echo sh; fi ; fi)
|
|
|
|
|
|
|
|
HOSTCC = gcc
|
|
|
|
HOSTCXX = g++
|
|
|
|
HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -Wno-builtin-declaration-mismatch
|
|
|
|
HOSTCXXFLAGS = -O2
|
|
|
|
|
|
|
|
# Beautify output
|
|
|
|
# ---------------------------------------------------------------------------
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
# 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.
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
# quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
|
|
|
|
# cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
# 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.
|
|
|
|
|
|
|
|
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 ($(findstring s,$(MAKEFLAGS)),)
|
|
|
|
quiet=silent_
|
|
|
|
endif
|
|
|
|
|
|
|
|
export quiet Q KBUILD_VERBOSE
|
|
|
|
|
|
|
|
# Look for make include files relative to root of kernel src
|
|
|
|
MAKEFLAGS += --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)as
|
|
|
|
LD = $(CROSS_COMPILE)ld
|
|
|
|
CC = $(CROSS_COMPILE)gcc
|
|
|
|
CPP = $(CC) -E
|
|
|
|
AR = $(CROSS_COMPILE)ar
|
|
|
|
NM = $(CROSS_COMPILE)nm
|
|
|
|
STRIP = $(CROSS_COMPILE)strip
|
|
|
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
|
|
|
OBJDUMP = $(CROSS_COMPILE)objdump
|
|
|
|
AWK = awk
|
|
|
|
INSTALLKERNEL := installkernel
|
|
|
|
PERL = perl
|
|
|
|
|
|
|
|
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
|
|
|
-Wbitwise -Wno-return-void $(CF)
|
|
|
|
CFLAGS_KERNEL =
|
|
|
|
AFLAGS_KERNEL =
|
|
|
|
|
|
|
|
# Use LINUXINCLUDE when you must reference the include/ directory.
|
|
|
|
# Needed to be compatible with the O= option
|
|
|
|
LINUXINCLUDE := -Iinclude \
|
|
|
|
$(if $(KBUILD_SRC), -I$(srctree)/include) \
|
|
|
|
-include include/generated/autoconf.h
|
|
|
|
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
|
|
|
|
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
|
|
-fno-strict-aliasing -fno-common \
|
2024-10-08 18:17:10 +00:00
|
|
|
-fno-stack-protector \
|
2022-06-14 14:14:56 +00:00
|
|
|
-Werror-implicit-function-declaration \
|
|
|
|
-Wno-format-security \
|
|
|
|
-fno-delete-null-pointer-checks \
|
2024-08-06 10:25:07 +00:00
|
|
|
-Wno-builtin-declaration-mismatch -Wno-main -nostdinc \
|
2024-09-23 17:17:44 +00:00
|
|
|
-I$(srctree)/lib/unic
|
2022-06-14 14:14:56 +00:00
|
|
|
KBUILD_AFLAGS_KERNEL :=
|
|
|
|
KBUILD_CFLAGS_KERNEL :=
|
|
|
|
KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
|
|
|
|
|
|
# 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 ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
|
|
|
|
export CPP AR NM STRIP OBJCOPY OBJDUMP
|
|
|
|
export MAKE AWK GENKSYMS INSTALLKERNEL PERL UTS_MACHINE
|
|
|
|
export HOSTCXX HOSTCXXFLAGS
|
|
|
|
|
|
|
|
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
|
|
|
|
export KBUILD_CFLAGS CFLAGS_KERNEL
|
|
|
|
export KBUILD_AFLAGS AFLAGS_KERNEL
|
|
|
|
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
|
|
|
|
export KBUILD_ARFLAGS
|
|
|
|
|
|
|
|
# Files to ignore in find ... statements
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
# ===========================================================================
|
|
|
|
# Rules shared between *config targets and build targets
|
|
|
|
|
|
|
|
# Basic helpers built in scripts/
|
|
|
|
PHONY += scripts_basic
|
|
|
|
scripts_basic:
|
|
|
|
$(Q)$(MAKE) $(build)=scripts/basic
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
|
|
|
|
# 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).
|
|
|
|
|
|
|
|
no-dot-config-targets := clean mrproper distclean \
|
|
|
|
cscope gtags TAGS tags help %docs check% coccicheck \
|
|
|
|
include/linux/version.h headers_% \
|
|
|
|
kernelversion %src-pkg
|
|
|
|
|
|
|
|
config-targets := 0
|
|
|
|
mixed-targets := 0
|
|
|
|
dot-config := 1
|
|
|
|
|
|
|
|
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
|
|
|
|
ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
|
|
|
|
dot-config := 0
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifneq ($(filter config %config,$(MAKECMDGOALS)),)
|
|
|
|
config-targets := 1
|
|
|
|
ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
|
|
|
|
mixed-targets := 1
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(mixed-targets),1)
|
|
|
|
# ===========================================================================
|
|
|
|
# We're called with mixed targets (*config and build targets).
|
|
|
|
# Handle them one by one.
|
|
|
|
|
|
|
|
%:: FORCE
|
|
|
|
$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
|
|
|
|
|
|
|
|
else
|
|
|
|
ifeq ($(config-targets),1)
|
|
|
|
# ===========================================================================
|
|
|
|
# *config targets only - make sure prerequisites are updated, and descend
|
|
|
|
# in scripts/kconfig to make the *config target
|
|
|
|
|
|
|
|
# Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
|
|
|
|
# KBUILD_DEFCONFIG may point out an alternative default configuration
|
|
|
|
# used for 'make defconfig'
|
|
|
|
#include $(srctree)/arch/$(SRCARCH)/Makefile
|
|
|
|
export KBUILD_DEFCONFIG KBUILD_KCONFIG
|
|
|
|
|
|
|
|
config: scripts_basic outputmakefile FORCE
|
|
|
|
$(Q)mkdir -p include/linux include/config
|
|
|
|
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
|
|
|
|
|
|
|
%config: scripts_basic outputmakefile FORCE
|
|
|
|
$(Q)mkdir -p include/linux include/config
|
|
|
|
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
|
|
ifeq ($(dot-config),1)
|
|
|
|
# Read in config
|
|
|
|
-include include/config/auto.conf
|
|
|
|
|
|
|
|
|
|
|
|
# Read in dependencies to all Kconfig* files, make sure to run
|
|
|
|
# oldconfig if changes are detected.
|
|
|
|
-include include/config/auto.conf.cmd
|
|
|
|
|
|
|
|
# To avoid any implicit rule to kick in, define an empty command
|
|
|
|
$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
|
|
|
|
|
|
|
|
# If .config is newer than include/config/auto.conf, someone tinkered
|
|
|
|
# with it and forgot to run make oldconfig.
|
|
|
|
# if auto.conf.cmd is missing then we are probably in a cleaned tree so
|
|
|
|
# we execute the config step to be sure to catch updated Kconfig files
|
|
|
|
include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
|
|
|
|
$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
# Dummy target needed, because used as prerequisite
|
|
|
|
include/config/auto.conf: ;
|
|
|
|
endif # $(dot-config)
|
|
|
|
|
|
|
|
|
|
|
|
# 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
|
2022-06-16 11:37:20 +00:00
|
|
|
all: arch/$(ARCH)/linker.lds uniLoader
|
2022-06-14 14:14:56 +00:00
|
|
|
|
|
|
|
# List of main executables
|
2024-08-06 16:21:46 +00:00
|
|
|
main-y := arch/$(ARCH)/start.o \
|
|
|
|
main/main.o
|
2022-06-14 14:14:56 +00:00
|
|
|
|
2024-10-09 15:49:23 +00:00
|
|
|
ifeq ($(ARCH), aarch64)
|
|
|
|
arch-libs-y := arch/$(ARCH)/memcpy.o
|
|
|
|
endif
|
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
# Object directories
|
|
|
|
objs-y := main
|
2022-06-16 11:37:20 +00:00
|
|
|
objs-y += arch
|
2024-10-08 18:17:10 +00:00
|
|
|
|
|
|
|
# Libraries
|
2022-06-14 14:14:56 +00:00
|
|
|
libs-y := soc
|
|
|
|
libs-y += board
|
|
|
|
libs-y += lib
|
2024-10-08 18:17:10 +00:00
|
|
|
libs-y += drivers
|
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
uniLoader-dirs := $(objs-y) $(libs-y)
|
|
|
|
uniLoader-objs := $(patsubst %,%/built-in.o, $(objs-y))
|
|
|
|
uniLoader-libs := $(patsubst %,%/lib.a, $(libs-y))
|
2024-10-08 18:17:10 +00:00
|
|
|
|
|
|
|
uniLoader-mains := $(objs-y)/*.o
|
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
uniLoader-all := $(uniLoader-objs) $(uniLoader-libs)
|
|
|
|
|
|
|
|
# Do modpost on a prelinked vmlinux. The finally linked vmlinux has
|
|
|
|
# relevant sections renamed as per the linker script.
|
|
|
|
quiet_cmd_uniLoader = LD $@.o
|
2024-10-09 15:49:23 +00:00
|
|
|
cmd_uniLoader = $(LD) $(main-y) $(arch-libs-y) $(uniLoader-libs) -o $@.o --script=arch/$(ARCH)/linker.lds
|
2022-06-14 14:14:56 +00:00
|
|
|
|
2024-10-12 16:39:11 +00:00
|
|
|
arch/$(ARCH)/linker.lds: arch/$(ARCH)/linker.lds.S $(KERNEL_PATH) $(RAMDISK_PATH)
|
|
|
|
$(CPP) $< -DTEXT_BASE=$(TEXT_BASE) -DKERNEL_PATH=$(KERNEL_PATH) -DDTB_PATH=$(DT_PATH) -DRAMDISK_PATH=$(RAMDISK_PATH) -P -o $@
|
2022-06-14 14:14:56 +00:00
|
|
|
|
|
|
|
uniLoader: $(uniLoader-all)
|
|
|
|
$(call if_changed,uniLoader)
|
|
|
|
@echo ' OBJCOPY $@'
|
|
|
|
$(OBJCOPY) -O binary uniLoader.o uniLoader
|
|
|
|
|
|
|
|
# The actual objects are generated when descending,
|
|
|
|
# make sure no implicit rule kicks in
|
|
|
|
$(sort $(uniLoader-all)): $(uniLoader-dirs) ;
|
|
|
|
|
|
|
|
# Handle descending into subdirectories listed in $(vmlinux-dirs)
|
|
|
|
# Preset locale variables to speed up the build process. Limit locale
|
|
|
|
# tweaks to this spot to avoid wrong language settings when running
|
|
|
|
# make menuconfig etc.
|
|
|
|
# Error messages still appears in the original language
|
|
|
|
|
|
|
|
#PHONY += $(vmlinux-dirs)
|
|
|
|
#$(vmlinux-dirs): prepare scripts
|
|
|
|
PHONY += $(uniLoader-dirs)
|
|
|
|
$(uniLoader-dirs): scripts_basic
|
|
|
|
$(Q)$(MAKE) $(build)=$@
|
|
|
|
|
|
|
|
###
|
|
|
|
# Cleaning is done on three levels.
|
|
|
|
# make clean Delete most generated files
|
|
|
|
# Leave enough to build external modules
|
|
|
|
# make mrproper Delete the current configuration, and all generated files
|
|
|
|
# make distclean Remove editor backup files, patch leftover files and the like
|
|
|
|
|
|
|
|
# Directories & files removed with 'make clean'
|
|
|
|
CLEAN_DIRS +=
|
|
|
|
CLEAN_FILES += uniLoader
|
|
|
|
|
|
|
|
# Directories & files removed with 'make mrproper'
|
|
|
|
MRPROPER_DIRS += include/config include/generated
|
|
|
|
MRPROPER_FILES += .config .config.old tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
|
|
|
|
|
|
|
|
# clean - Delete most, but leave enough to build external modules
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
clean: rm-dirs := $(CLEAN_DIRS)
|
|
|
|
clean: rm-files := $(CLEAN_FILES)
|
|
|
|
clean-dirs := $(addprefix _clean_, $(uniLoader-dirs))
|
2022-06-12 11:37:02 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
PHONY += $(clean-dirs) clean archclean
|
|
|
|
$(clean-dirs):
|
|
|
|
$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
|
2022-06-12 11:37:02 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
clean: $(clean-dirs)
|
|
|
|
$(call cmd,rmdirs)
|
|
|
|
$(call cmd,rmfiles)
|
|
|
|
@find . $(RCS_FIND_IGNORE) \
|
|
|
|
\( -name '*.[oas]' -o -name '.*.cmd' \
|
2022-06-14 18:50:15 +00:00
|
|
|
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' -o -name '*.lds' \
|
2022-06-14 14:14:56 +00:00
|
|
|
-o -name modules.builtin -o -name '.tmp_*.o.*' \
|
|
|
|
-o -name '*.gcno' \) -type f -print | xargs rm -f
|
2022-06-12 11:37:02 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
# mrproper - Delete all generated files, including .config
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))
|
|
|
|
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
|
|
|
|
mrproper-dirs := $(addprefix _mrproper_, scripts)
|
|
|
|
|
|
|
|
PHONY += $(mrproper-dirs) mrproper
|
|
|
|
$(mrproper-dirs):
|
|
|
|
$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
|
|
|
|
|
|
|
|
mrproper: clean $(mrproper-dirs)
|
|
|
|
$(call cmd,rmdirs)
|
|
|
|
$(call cmd,rmfiles)
|
|
|
|
|
|
|
|
# distclean
|
2022-06-12 11:37:02 +00:00
|
|
|
#
|
2022-06-14 14:14:56 +00:00
|
|
|
PHONY += distclean
|
|
|
|
distclean: mrproper
|
|
|
|
@find $(srctree) $(RCS_FIND_IGNORE) \
|
|
|
|
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
|
|
|
|
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
|
|
|
|
-o -name '.*.rej' -o -size 0 \
|
|
|
|
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
|
|
|
|
-type f -print | xargs rm -f
|
2022-06-12 11:37:02 +00:00
|
|
|
|
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
# FIXME Should go into a make.lib or something
|
|
|
|
# ===========================================================================
|
|
|
|
|
|
|
|
quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN $(wildcard $(rm-dirs)))
|
|
|
|
cmd_rmdirs = rm -rf $(rm-dirs)
|
|
|
|
|
|
|
|
quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)))
|
|
|
|
cmd_rmfiles = rm -f $(rm-files)
|
|
|
|
|
|
|
|
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
|
|
|
|
# Usage:
|
|
|
|
# $(Q)$(MAKE) $(clean)=dir
|
|
|
|
clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
help:
|
|
|
|
@echo 'Cleaning targets:'
|
|
|
|
@echo ' clean - Remove most generated files but keep the config and'
|
|
|
|
@echo ' enough build support to build external modules'
|
|
|
|
@echo ' mrproper - Remove all generated files + config + various backup files'
|
|
|
|
@echo ' distclean - mrproper + remove editor backup and patch files'
|
|
|
|
@echo ''
|
|
|
|
@echo 'Configuration targets:'
|
|
|
|
@$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
|
|
|
|
@echo ''
|
|
|
|
@echo 'Other generic targets:'
|
|
|
|
@echo ' all - Build all targets marked with [*]'
|
|
|
|
@echo '* uniLoader - Build the application'
|
|
|
|
@echo ' dir/ - Build all files in dir and below'
|
|
|
|
@echo ' dir/file.[oisS] - Build specified target only'
|
|
|
|
@echo ' dir/file.lst - Build specified mixed source/assembly target only'
|
|
|
|
@echo ' (requires a recent binutils and recent build (System.map))'
|
|
|
|
@echo ' tags/TAGS - Generate tags file for editors'
|
|
|
|
@echo ' cscope - Generate cscope index'
|
|
|
|
@echo ' gtags - Generate GNU GLOBAL index'
|
|
|
|
@echo ' kernelrelease - Output the release version string'
|
|
|
|
@echo ' kernelversion - Output the version stored in Makefile'
|
|
|
|
echo ''
|
|
|
|
@echo 'Static analysers'
|
|
|
|
@echo ' checkstack - Generate a list of stack hogs'
|
|
|
|
@echo ' namespacecheck - Name space analysis on compiled kernel'
|
|
|
|
@echo ' versioncheck - Sanity check on version.h usage'
|
|
|
|
@echo ' includecheck - Check for duplicate included header files'
|
|
|
|
@echo ' export_report - List the usages of all exported symbols'
|
|
|
|
@echo ' headers_check - Sanity check on exported headers'
|
|
|
|
# @$(MAKE) -f $(srctree)/scripts/Makefile.help checker-help
|
|
|
|
@echo ''
|
|
|
|
# @echo 'Kernel packaging:'
|
|
|
|
# @$(MAKE) $(build)=$(package-dir) help
|
|
|
|
@echo ''
|
|
|
|
# @echo 'Documentation targets:'
|
|
|
|
# @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
|
|
|
|
@echo ''
|
|
|
|
@echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
|
|
|
|
@echo ' make V=2 [targets] 2 => give reason for rebuild of target'
|
|
|
|
@echo ' make O=dir [targets] Locate all output files in "dir", including .config'
|
|
|
|
@echo ' make W=n [targets] Enable extra gcc checks, n=1,2,3 where'
|
|
|
|
@echo ' 1: warnings which may be relevant and do not occur too often'
|
|
|
|
@echo ' 2: warnings which occur quite often but may still be relevant'
|
|
|
|
@echo ' 3: more obscure warnings, can most likely be ignored'
|
|
|
|
@echo ' Multiple levels can be combined with W=12 or W=123'
|
|
|
|
@echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
|
|
|
|
@echo ''
|
|
|
|
@echo 'Execute "make" or "make all" to build all targets marked with [*] '
|
|
|
|
@echo 'For further info see the ./README file'
|
2022-06-12 11:37:02 +00:00
|
|
|
|
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
endif #ifeq ($(config-targets),1)
|
|
|
|
endif #ifeq ($(mixed-targets),1)
|
2022-06-12 11:37:02 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
endif # skip-makefile
|
2022-06-13 18:27:32 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
PHONY += FORCE
|
|
|
|
FORCE:
|
2022-06-12 11:37:02 +00:00
|
|
|
|
2022-06-14 14:14:56 +00:00
|
|
|
# Declare the contents of the .PHONY variable as phony. We keep that
|
|
|
|
# information in a variable so we can use it in if_changed and friends.
|
|
|
|
.PHONY: $(PHONY)
|