xref: /linux-6.15/scripts/Makefile.lib (revision d7c6ea02)
1b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
2f77bf014SSam Ravnborg# Backward compatibility
3f77bf014SSam Ravnborgasflags-y  += $(EXTRA_AFLAGS)
4f77bf014SSam Ravnborgccflags-y  += $(EXTRA_CFLAGS)
5f77bf014SSam Ravnborgcppflags-y += $(EXTRA_CPPFLAGS)
6f77bf014SSam Ravnborgldflags-y  += $(EXTRA_LDFLAGS)
7f77bf014SSam Ravnborg
88fdc3fbbSCao jin# flags that take effect in current and sub directories
94e13d47cSMasahiro YamadaKBUILD_AFLAGS += $(subdir-asflags-y)
104e13d47cSMasahiro YamadaKBUILD_CFLAGS += $(subdir-ccflags-y)
11720097d8SSam Ravnborg
121da177e4SLinus Torvalds# Figure out what we need to build from the various variables
131da177e4SLinus Torvalds# ===========================================================================
141da177e4SLinus Torvalds
151da177e4SLinus Torvalds# When an object is listed to be built compiled-in and modular,
161da177e4SLinus Torvalds# only build the compiled-in version
171da177e4SLinus Torvaldsobj-m := $(filter-out $(obj-y),$(obj-m))
181da177e4SLinus Torvalds
191da177e4SLinus Torvalds# Libraries are always collected in one lib file.
201da177e4SLinus Torvalds# Filter out objects already built-in
211da177e4SLinus Torvaldslib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
221da177e4SLinus Torvalds
230a8820e7SMasahiro Yamada# Subdirectories we need to descend into
240a8820e7SMasahiro Yamadasubdir-ym := $(sort $(subdir-y) $(subdir-m) \
250a8820e7SMasahiro Yamada			$(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m))))
260a8820e7SMasahiro Yamada
27b2c88554SMasahiro Yamada# Handle objects in subdirs:
28b2c88554SMasahiro Yamada# - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and
29b2c88554SMasahiro Yamada#   foo/modules.order
30b2c88554SMasahiro Yamada# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order
31b2c88554SMasahiro Yamada#
32b2c88554SMasahiro Yamada# Generate modules.order to determine modorder. Unfortunately, we don't have
33b2c88554SMasahiro Yamada# information about ordering between -y and -m subdirs. Just put -y's first.
34b2c88554SMasahiro Yamada
35b2c88554SMasahiro Yamadaifdef need-modorder
36b2c88554SMasahiro Yamadaobj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m))
37b2c88554SMasahiro Yamadaelse
38b2c88554SMasahiro Yamadaobj-m := $(filter-out %/, $(obj-m))
39b2c88554SMasahiro Yamadaendif
40b2c88554SMasahiro Yamada
4156d58936SMasahiro Yamadaifdef need-builtin
42f49821eeSNicholas Pigginobj-y		:= $(patsubst %/, %/built-in.a, $(obj-y))
4356d58936SMasahiro Yamadaelse
4456d58936SMasahiro Yamadaobj-y		:= $(filter-out %/, $(obj-y))
4556d58936SMasahiro Yamadaendif
461da177e4SLinus Torvalds
4744f87191SMasahiro Yamada# Expand $(foo-objs) $(foo-y) etc. by replacing their individuals
4844f87191SMasahiro Yamadasuffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s))))
4944f87191SMasahiro Yamada# List composite targets that are constructed by combining other targets
5044f87191SMasahiro Yamadamulti-search = $(sort $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $m)))
5144f87191SMasahiro Yamada# List primitive targets that are compiled from source files
5244f87191SMasahiro Yamadareal-search = $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $(call suffix-search, $m, $2, $3), $m))
5344f87191SMasahiro Yamada
5433e84f2eSMasahiro Yamada# If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object
5544f87191SMasahiro Yamadamulti-obj-y := $(call multi-search, $(obj-y), .o, -objs -y)
5644f87191SMasahiro Yamadamulti-obj-m := $(call multi-search, $(obj-m), .o, -objs -y -m)
57a6601e01SMasahiro Yamadamulti-obj-ym := $(multi-obj-y) $(multi-obj-m)
581da177e4SLinus Torvalds
59f98fe47cSMasahiro Yamada# Replace multi-part objects by their individual parts,
60f98fe47cSMasahiro Yamada# including built-in.a from subdirectories
6144f87191SMasahiro Yamadareal-obj-y := $(call real-search, $(obj-y), .o, -objs -y)
6244f87191SMasahiro Yamadareal-obj-m := $(call real-search, $(obj-m), .o, -objs -y -m)
631da177e4SLinus Torvalds
645f2fb52fSMasahiro Yamadaalways-y += $(always-m)
655f2fb52fSMasahiro Yamada
66faabed29SMasahiro Yamada# hostprogs-always-y += foo
67faabed29SMasahiro Yamada# ... is a shorthand for
68faabed29SMasahiro Yamada# hostprogs += foo
69faabed29SMasahiro Yamada# always-y  += foo
70faabed29SMasahiro Yamadahostprogs += $(hostprogs-always-y) $(hostprogs-always-m)
71faabed29SMasahiro Yamadaalways-y += $(hostprogs-always-y) $(hostprogs-always-m)
72faabed29SMasahiro Yamada
73faabed29SMasahiro Yamada# userprogs-always-y is likewise.
74faabed29SMasahiro Yamadauserprogs += $(userprogs-always-y) $(userprogs-always-m)
75faabed29SMasahiro Yamadaalways-y += $(userprogs-always-y) $(userprogs-always-m)
76faabed29SMasahiro Yamada
777e7962ddSMasahiro Yamada# DTB
787e7962ddSMasahiro Yamada# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
799ca29e41SViresh Kumardtb-$(CONFIG_OF_ALL_DTBS)       += $(dtb-)
809ca29e41SViresh Kumar
81bcf0c664SMasahiro Yamada# Composite DTB (i.e. DTB constructed by overlay)
82bcf0c664SMasahiro Yamadamulti-dtb-y := $(call multi-search, $(dtb-y), .dtb, -dtbs)
83bcf0c664SMasahiro Yamada# Primitive DTB compiled from *.dts
84bcf0c664SMasahiro Yamadareal-dtb-y := $(call real-search, $(dtb-y), .dtb, -dtbs)
85bcf0c664SMasahiro Yamada# Base DTB that overlay is applied onto (each first word of $(*-dtbs) expansion)
86bcf0c664SMasahiro Yamadabase-dtb-y := $(foreach m, $(multi-dtb-y), $(firstword $(call suffix-search, $m, .dtb, -dtbs)))
8715d16d6dSRob Herring
882047ace9SMasahiro Yamadaalways-y			+= $(dtb-y)
897e7962ddSMasahiro Yamada
901da177e4SLinus Torvalds# Add subdir path
911da177e4SLinus Torvalds
921da177e4SLinus Torvaldsextra-y		:= $(addprefix $(obj)/,$(extra-y))
935f2fb52fSMasahiro Yamadaalways-y	:= $(addprefix $(obj)/,$(always-y))
941da177e4SLinus Torvaldstargets		:= $(addprefix $(obj)/,$(targets))
951da177e4SLinus Torvaldsobj-m		:= $(addprefix $(obj)/,$(obj-m))
961da177e4SLinus Torvaldslib-y		:= $(addprefix $(obj)/,$(lib-y))
97f5f33681SMasahiro Yamadareal-obj-y	:= $(addprefix $(obj)/,$(real-obj-y))
98f5f33681SMasahiro Yamadareal-obj-m	:= $(addprefix $(obj)/,$(real-obj-m))
99a6601e01SMasahiro Yamadamulti-obj-m	:= $(addprefix $(obj)/, $(multi-obj-m))
100bcf0c664SMasahiro Yamadamulti-dtb-y	:= $(addprefix $(obj)/, $(multi-dtb-y))
101bcf0c664SMasahiro Yamadareal-dtb-y	:= $(addprefix $(obj)/, $(real-dtb-y))
1021da177e4SLinus Torvaldssubdir-ym	:= $(addprefix $(obj)/,$(subdir-ym))
1031da177e4SLinus Torvalds
104c0152e9aSMasahiro Yamada# Finds the multi-part object the current object will be linked into.
1051664a377SMasahiro Yamada# If the object belongs to two or more multi-part objects, list them all.
106a6601e01SMasahiro Yamadamodname-multi = $(sort $(foreach m,$(multi-obj-ym),\
107d4452837SMasahiro Yamada		$(if $(filter $*.o, $(call suffix-search, $m, .o, -objs -y -m)),$(m:.o=))))
108c0152e9aSMasahiro Yamada
1095c816641SMasahiro Yamada__modname = $(or $(modname-multi),$(basetarget))
1101664a377SMasahiro Yamada
1111664a377SMasahiro Yamadamodname = $(subst $(space),:,$(__modname))
1121664a377SMasahiro Yamadamodfile = $(addprefix $(obj)/,$(__modname))
113c0152e9aSMasahiro Yamada
11454b8ae66SMasahiro Yamada# target with $(obj)/ and its suffix stripped
11554b8ae66SMasahiro Yamadatarget-stem = $(basename $(patsubst $(obj)/%,%,$@))
11654b8ae66SMasahiro Yamada
1171da177e4SLinus Torvalds# These flags are needed for modversions and compiling, so we define them here
1188fdc3fbbSCao jin# $(modname_flags) defines KBUILD_MODNAME as the name of the module it will
1191da177e4SLinus Torvalds# end up in (or would, if it gets compiled in)
120a8cccdd9SSami Tolvanenname-fix-token = $(subst $(comma),_,$(subst -,_,$1))
121a8cccdd9SSami Tolvanenname-fix = $(call stringify,$(call name-fix-token,$1))
122b42841b7SMichal Marekbasename_flags = -DKBUILD_BASENAME=$(call name-fix,$(basetarget))
123a8cccdd9SSami Tolvanenmodname_flags  = -DKBUILD_MODNAME=$(call name-fix,$(modname)) \
124a8cccdd9SSami Tolvanen		 -D__KBUILD_MODNAME=kmod_$(call name-fix-token,$(modname))
1251664a377SMasahiro Yamadamodfile_flags  = -DKBUILD_MODFILE=$(call stringify,$(modfile))
1261da177e4SLinus Torvalds
12715d5761aSMasahiro Yamada_c_flags       = $(filter-out $(CFLAGS_REMOVE_$(target-stem).o), \
12815d5761aSMasahiro Yamada                     $(filter-out $(ccflags-remove-y), \
12915d5761aSMasahiro Yamada                         $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(ccflags-y)) \
13015d5761aSMasahiro Yamada                     $(CFLAGS_$(target-stem).o))
13115d5761aSMasahiro Yamada_a_flags       = $(filter-out $(AFLAGS_REMOVE_$(target-stem).o), \
13215d5761aSMasahiro Yamada                     $(filter-out $(asflags-remove-y), \
13315d5761aSMasahiro Yamada                         $(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) $(asflags-y)) \
13415d5761aSMasahiro Yamada                     $(AFLAGS_$(target-stem).o))
13554b8ae66SMasahiro Yamada_cpp_flags     = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(target-stem).lds)
1361da177e4SLinus Torvalds
1372521f2c2SPeter Oberparleiter#
1382521f2c2SPeter Oberparleiter# Enable gcov profiling flags for a file, directory or for all files depending
1392521f2c2SPeter Oberparleiter# on variables GCOV_PROFILE_obj.o, GCOV_PROFILE and CONFIG_GCOV_PROFILE_ALL
1402521f2c2SPeter Oberparleiter# (in this order)
1412521f2c2SPeter Oberparleiter#
1422521f2c2SPeter Oberparleiterifeq ($(CONFIG_GCOV_KERNEL),y)
1432521f2c2SPeter Oberparleiter_c_flags += $(if $(patsubst n%,, \
1442521f2c2SPeter Oberparleiter		$(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
1452521f2c2SPeter Oberparleiter		$(CFLAGS_GCOV))
1462521f2c2SPeter Oberparleiterendif
1472521f2c2SPeter Oberparleiter
1480b24beccSAndrey Ryabinin#
1490b24beccSAndrey Ryabinin# Enable address sanitizer flags for kernel except some files or directories
1500b24beccSAndrey Ryabinin# we don't want to check (depends on variables KASAN_SANITIZE_obj.o, KASAN_SANITIZE)
1510b24beccSAndrey Ryabinin#
1520b24beccSAndrey Ryabininifeq ($(CONFIG_KASAN),y)
1530fea6e9aSAndrey Konovalovifneq ($(CONFIG_KASAN_HW_TAGS),y)
1540b24beccSAndrey Ryabinin_c_flags += $(if $(patsubst n%,, \
1550b24beccSAndrey Ryabinin		$(KASAN_SANITIZE_$(basetarget).o)$(KASAN_SANITIZE)y), \
1560e410e15SAndrey Konovalov		$(CFLAGS_KASAN), $(CFLAGS_KASAN_NOSANITIZE))
1570b24beccSAndrey Ryabininendif
1580fea6e9aSAndrey Konovalovendif
1590b24beccSAndrey Ryabinin
160c6d30853SAndrey Ryabininifeq ($(CONFIG_UBSAN),y)
161c6d30853SAndrey Ryabinin_c_flags += $(if $(patsubst n%,, \
162c6d30853SAndrey Ryabinin		$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)), \
163c6d30853SAndrey Ryabinin		$(CFLAGS_UBSAN))
164c6d30853SAndrey Ryabininendif
165c6d30853SAndrey Ryabinin
1665c9a8750SDmitry Vyukovifeq ($(CONFIG_KCOV),y)
1675c9a8750SDmitry Vyukov_c_flags += $(if $(patsubst n%,, \
168a4691deaSVegard Nossum	$(KCOV_INSTRUMENT_$(basetarget).o)$(KCOV_INSTRUMENT)$(CONFIG_KCOV_INSTRUMENT_ALL)), \
1695c9a8750SDmitry Vyukov	$(CFLAGS_KCOV))
1705c9a8750SDmitry Vyukovendif
1715c9a8750SDmitry Vyukov
172dfd402a4SMarco Elver#
173dfd402a4SMarco Elver# Enable KCSAN flags except some files or directories we don't want to check
174dfd402a4SMarco Elver# (depends on variables KCSAN_SANITIZE_obj.o, KCSAN_SANITIZE)
175dfd402a4SMarco Elver#
176dfd402a4SMarco Elverifeq ($(CONFIG_KCSAN),y)
177dfd402a4SMarco Elver_c_flags += $(if $(patsubst n%,, \
178dfd402a4SMarco Elver	$(KCSAN_SANITIZE_$(basetarget).o)$(KCSAN_SANITIZE)y), \
179dfd402a4SMarco Elver	$(CFLAGS_KCSAN))
18048c9e28eSMarco Elver# Some uninstrumented files provide implied barriers required to avoid false
18148c9e28eSMarco Elver# positives: set KCSAN_INSTRUMENT_BARRIERS for barrier instrumentation only.
18248c9e28eSMarco Elver_c_flags += $(if $(patsubst n%,, \
18348c9e28eSMarco Elver	$(KCSAN_INSTRUMENT_BARRIERS_$(basetarget).o)$(KCSAN_INSTRUMENT_BARRIERS)n), \
18448c9e28eSMarco Elver	-D__KCSAN_INSTRUMENT_BARRIERS__)
185dfd402a4SMarco Elverendif
186dfd402a4SMarco Elver
187cdd750bfSMasahiro Yamada# $(srctree)/$(src) for including checkin headers from generated source files
188cdd750bfSMasahiro Yamada# $(objtree)/$(obj) for including generated headers from checkin source files
18958156ba4SMasahiro Yamadaifeq ($(KBUILD_EXTMOD),)
190051f278eSMasahiro Yamadaifdef building_out_of_srctree
191cdd750bfSMasahiro Yamada_c_flags   += -I $(srctree)/$(src) -I $(objtree)/$(obj)
192cdd750bfSMasahiro Yamada_a_flags   += -I $(srctree)/$(src) -I $(objtree)/$(obj)
193cdd750bfSMasahiro Yamada_cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
1941da177e4SLinus Torvaldsendif
19558156ba4SMasahiro Yamadaendif
1961da177e4SLinus Torvalds
197eb27ea5cSMasahiro Yamadapart-of-module = $(if $(filter $(basename $@).o, $(real-obj-m)),y)
198eb27ea5cSMasahiro Yamadaquiet_modtag = $(if $(part-of-module),[M],   )
199eb27ea5cSMasahiro Yamada
200eb27ea5cSMasahiro Yamadamodkern_cflags =                                          \
201eb27ea5cSMasahiro Yamada	$(if $(part-of-module),                           \
202eb27ea5cSMasahiro Yamada		$(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
2031664a377SMasahiro Yamada		$(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL) $(modfile_flags))
204eb27ea5cSMasahiro Yamada
205eb27ea5cSMasahiro Yamadamodkern_aflags = $(if $(part-of-module),				\
206eb27ea5cSMasahiro Yamada			$(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE),	\
207eb27ea5cSMasahiro Yamada			$(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL))
208eb27ea5cSMasahiro Yamada
20930a77297SMasahiro Yamadac_flags        = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)     \
210a95b37e2SMasahiro Yamada		 -include $(srctree)/include/linux/compiler_types.h       \
211cdd750bfSMasahiro Yamada		 $(_c_flags) $(modkern_cflags)                           \
212b42841b7SMichal Marek		 $(basename_flags) $(modname_flags)
2131da177e4SLinus Torvalds
21430a77297SMasahiro Yamadaa_flags        = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)     \
215cdd750bfSMasahiro Yamada		 $(_a_flags) $(modkern_aflags)
2161da177e4SLinus Torvalds
21730a77297SMasahiro Yamadacpp_flags      = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)     \
218cdd750bfSMasahiro Yamada		 $(_cpp_flags)
2191da177e4SLinus Torvalds
220d503ac53SMasahiro Yamadald_flags       = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F))
2211da177e4SLinus Torvalds
22250f9ddafSMasahiro YamadaDTC_INCLUDE    := $(srctree)/scripts/dtc/include-prefixes
22350f9ddafSMasahiro Yamada
22430a77297SMasahiro Yamadadtc_cpp_flags  = -Wp,-MMD,$(depfile).pre.tmp -nostdinc                    \
22550f9ddafSMasahiro Yamada		 $(addprefix -I,$(DTC_INCLUDE))                          \
226e570d7c1SStephen Warren		 -undef -D__DTS__
227e570d7c1SStephen Warren
228b42d2306SMasahiro Yamadaifdef CONFIG_OBJTOOL
229b42d2306SMasahiro Yamada
230b42d2306SMasahiro Yamadaobjtool := $(objtree)/tools/objtool/objtool
231b42d2306SMasahiro Yamada
232b42d2306SMasahiro Yamadaobjtool_args =								\
233b42d2306SMasahiro Yamada	$(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label)	\
234b42d2306SMasahiro Yamada	$(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr)		\
235b42d2306SMasahiro Yamada	$(if $(CONFIG_X86_KERNEL_IBT), --ibt)				\
236b42d2306SMasahiro Yamada	$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)		\
237b42d2306SMasahiro Yamada	$(if $(CONFIG_UNWINDER_ORC), --orc)				\
238b42d2306SMasahiro Yamada	$(if $(CONFIG_RETPOLINE), --retpoline)				\
239f43b9876SPeter Zijlstra	$(if $(CONFIG_RETHUNK), --rethunk)				\
240b42d2306SMasahiro Yamada	$(if $(CONFIG_SLS), --sls)					\
241b42d2306SMasahiro Yamada	$(if $(CONFIG_STACK_VALIDATION), --stackval)			\
242b42d2306SMasahiro Yamada	$(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call)		\
24344688ffdSLinus Torvalds	$(if $(CONFIG_HAVE_UACCESS_VALIDATION), --uaccess)		\
244b42d2306SMasahiro Yamada	$(if $(delay-objtool), --link)					\
245b42d2306SMasahiro Yamada	$(if $(part-of-module), --module)				\
246b42d2306SMasahiro Yamada	$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
247b42d2306SMasahiro Yamada
248b42d2306SMasahiro Yamadadelay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT))
249b42d2306SMasahiro Yamada
250b42d2306SMasahiro Yamadacmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
251b42d2306SMasahiro Yamadacmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
252b42d2306SMasahiro Yamada
253b42d2306SMasahiro Yamadaendif # CONFIG_OBJTOOL
254b42d2306SMasahiro Yamada
255c8589d1eSMasahiro Yamada# Useful for describing the dependency of composite objects
256c8589d1eSMasahiro Yamada# Usage:
257c8589d1eSMasahiro Yamada#   $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
258c8589d1eSMasahiro Yamadadefine multi_depend
259f97cf399SMasahiro Yamada$(foreach m, $1, \
260f97cf399SMasahiro Yamada	$(eval $m: \
261f97cf399SMasahiro Yamada	$(addprefix $(obj)/, $(call suffix-search, $(patsubst $(obj)/%,%,$m), $2, $3))))
262c8589d1eSMasahiro Yamadaendef
263c8589d1eSMasahiro Yamada
264a5575df5SMasahiro Yamada# Copy a file
2651da177e4SLinus Torvalds# ===========================================================================
2663787b7daSMasahiro Yamada# 'cp' preserves permissions. If you use it to copy a file in read-only srctree,
2673787b7daSMasahiro Yamada# the copy would be read-only as well, leading to an error when executing the
2683787b7daSMasahiro Yamada# rule next time. Use 'cat' instead in order to generate a writable file.
269a5575df5SMasahiro Yamadaquiet_cmd_copy = COPY    $@
270a5575df5SMasahiro Yamada      cmd_copy = cat $< > $@
2711da177e4SLinus Torvalds
272991d76c9SArnaud Lacombe$(obj)/%: $(src)/%_shipped
273a5575df5SMasahiro Yamada	$(call cmd,copy)
2741da177e4SLinus Torvalds
2751da177e4SLinus Torvalds# Commands useful for building a boot image
2761da177e4SLinus Torvalds# ===========================================================================
2771da177e4SLinus Torvalds#
2781da177e4SLinus Torvalds#	Use as following:
2791da177e4SLinus Torvalds#
2801da177e4SLinus Torvalds#	target: source(s) FORCE
2811da177e4SLinus Torvalds#		$(if_changed,ld/objcopy/gzip)
2821da177e4SLinus Torvalds#
2832047ace9SMasahiro Yamada#	and add target to 'targets' so that we know we have to
2841da177e4SLinus Torvalds#	read in the saved command line
2851da177e4SLinus Torvalds
2861da177e4SLinus Torvalds# Linking
2871da177e4SLinus Torvalds# ---------------------------------------------------------------------------
2881da177e4SLinus Torvalds
2891da177e4SLinus Torvaldsquiet_cmd_ld = LD      $@
290afa974b7SMasahiro Yamada      cmd_ld = $(LD) $(ld_flags) $(real-prereqs) -o $@
2911da177e4SLinus Torvalds
292898f5a00SMasahiro Yamada# Archive
293898f5a00SMasahiro Yamada# ---------------------------------------------------------------------------
294898f5a00SMasahiro Yamada
295898f5a00SMasahiro Yamadaquiet_cmd_ar = AR      $@
29613dc8c02SMasahiro Yamada      cmd_ar = rm -f $@; $(AR) cDPrsT $@ $(real-prereqs)
297898f5a00SMasahiro Yamada
2981da177e4SLinus Torvalds# Objcopy
2991da177e4SLinus Torvalds# ---------------------------------------------------------------------------
3001da177e4SLinus Torvalds
3011da177e4SLinus Torvaldsquiet_cmd_objcopy = OBJCOPY $@
3021da177e4SLinus Torvaldscmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
3031da177e4SLinus Torvalds
3041da177e4SLinus Torvalds# Gzip
3051da177e4SLinus Torvalds# ---------------------------------------------------------------------------
3061da177e4SLinus Torvalds
3071da177e4SLinus Torvaldsquiet_cmd_gzip = GZIP    $@
308e4a42c82SDenis Efremov      cmd_gzip = cat $(real-prereqs) | $(KGZIP) -n -f -9 > $@
3091da177e4SLinus Torvalds
310aab94339SDirk Brandewie# DTC
311aab94339SDirk Brandewie# ---------------------------------------------------------------------------
3126b22b3d1SRob HerringDTC ?= $(objtree)/scripts/dtc/dtc
3133eb619b2SRob HerringDTC_FLAGS += -Wno-interrupt_provider
314aab94339SDirk Brandewie
315bc553986SRob Herring# Disable noisy checks by default
316e27128dbSMasahiro Yamadaifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),)
3178654cb8dSRob HerringDTC_FLAGS += -Wno-unit_address_vs_reg \
3184fd98e37SRob Herring	-Wno-avoid_unnecessary_addr_size \
3194fd98e37SRob Herring	-Wno-alias_paths \
32074656b68SRob Herring	-Wno-graph_child_address \
32170523a3cSRob Herring	-Wno-simple_bus_reg \
3221ee7943cSRob Herring	-Wno-unique_unit_address
323bc553986SRob Herringendif
324bc553986SRob Herring
325e27128dbSMasahiro Yamadaifneq ($(findstring 2,$(KBUILD_EXTRA_WARN)),)
3268654cb8dSRob HerringDTC_FLAGS += -Wnode_name_chars_strict \
3273eb619b2SRob Herring	-Wproperty_name_chars_strict \
3283eb619b2SRob Herring	-Winterrupt_provider
329aab94339SDirk Brandewieendif
330aab94339SDirk Brandewie
331331f7416SFrank RowandDTC_FLAGS += $(DTC_FLAGS_$(basetarget))
332331f7416SFrank Rowand
333bcf0c664SMasahiro Yamada# Set -@ if the target is a base DTB that overlay is applied onto
334bcf0c664SMasahiro YamadaDTC_FLAGS += $(if $(filter $(patsubst $(obj)/%,%,$@), $(base-dtb-y)), -@)
335bcf0c664SMasahiro Yamada
336aab94339SDirk Brandewie# Generate an assembly file to wrap the output of the device tree compiler
337aab94339SDirk Brandewiequiet_cmd_dt_S_dtb= DTB     $@
338aab94339SDirk Brandewiecmd_dt_S_dtb=						\
339b79c6aa6SMasahiro Yamada{							\
340aab94339SDirk Brandewie	echo '\#include <asm-generic/vmlinux.lds.h>'; 	\
341aab94339SDirk Brandewie	echo '.section .dtb.init.rodata,"a"';		\
342aab94339SDirk Brandewie	echo '.balign STRUCT_ALIGNMENT';		\
34355fe6da9SJames Hogan	echo '.global __dtb_$(subst -,_,$(*F))_begin';	\
34455fe6da9SJames Hogan	echo '__dtb_$(subst -,_,$(*F))_begin:';		\
345aab94339SDirk Brandewie	echo '.incbin "$<" ';				\
34655fe6da9SJames Hogan	echo '__dtb_$(subst -,_,$(*F))_end:';		\
34755fe6da9SJames Hogan	echo '.global __dtb_$(subst -,_,$(*F))_end';	\
348aab94339SDirk Brandewie	echo '.balign STRUCT_ALIGNMENT'; 		\
349b79c6aa6SMasahiro Yamada} > $@
350aab94339SDirk Brandewie
351a7f92419SMasahiro Yamada$(obj)/%.dtb.S: $(obj)/%.dtb FORCE
352a7f92419SMasahiro Yamada	$(call if_changed,dt_S_dtb)
353aab94339SDirk Brandewie
354aab94339SDirk Brandewiequiet_cmd_dtc = DTC     $@
355dd7699e3SMasahiro Yamadacmd_dtc = $(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
35664bfc994SMasahiro Yamada	$(DTC) -o $@ -b 0 \
35750f9ddafSMasahiro Yamada		$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
358b0a4d8b3SIan Campbell		-d $(depfile).dtc.tmp $(dtc-tmp) ; \
359b0a4d8b3SIan Campbell	cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
3601da177e4SLinus Torvalds
36115d16d6dSRob Herringquiet_cmd_fdtoverlay = DTOVL   $@
36215d16d6dSRob Herring      cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(real-prereqs)
36315d16d6dSRob Herring
364bcf0c664SMasahiro Yamada$(multi-dtb-y): FORCE
36515d16d6dSRob Herring	$(call if_changed,fdtoverlay)
366bcf0c664SMasahiro Yamada$(call multi_depend, $(multi-dtb-y), .dtb, -dtbs)
36715d16d6dSRob Herring
368ef8795f3SRob Herringifneq ($(CHECK_DTBS)$(CHECK_DT_BINDING),)
3694f0e3a57SRob HerringDT_CHECKER ?= dt-validate
3702783a7f5SRob HerringDT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),-l $(DT_SCHEMA_FILES),-m)
3714f0e3a57SRob HerringDT_BINDING_DIR := Documentation/devicetree/bindings
3722783a7f5SRob HerringDT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
3734f0e3a57SRob Herring
374*d7c6ea02SDmitry Baryshkovquiet_cmd_dtb =	DTC_CHK $@
375*d7c6ea02SDmitry Baryshkov      cmd_dtb =	$(cmd_dtc) ; $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
376*d7c6ea02SDmitry Baryshkovelse
377*d7c6ea02SDmitry Baryshkovquiet_cmd_dtb = $(quiet_cmd_dtc)
378*d7c6ea02SDmitry Baryshkov      cmd_dtb = $(cmd_dtc)
379ef8795f3SRob Herringendif
3804f0e3a57SRob Herring
381ef8795f3SRob Herring$(obj)/%.dtb: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
382*d7c6ea02SDmitry Baryshkov	$(call if_changed_dep,dtb)
38390b335fbSStephen Warren
384ef8795f3SRob Herring$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
385ef8795f3SRob Herring	$(call if_changed_dep,dtc)
386ef8795f3SRob Herring
387b0a4d8b3SIan Campbelldtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
38822435f38SStephen Warren
389bc22c17eSAlain Knaff# Bzip2
390bc22c17eSAlain Knaff# ---------------------------------------------------------------------------
391bc22c17eSAlain Knaff
392d3dd3b5aSH. Peter Anvin# Bzip2 and LZMA do not include size in file... so we have to fake that;
393d3dd3b5aSH. Peter Anvin# append the size as a 32-bit littleendian number as gzip does.
3944a2ff67cSMichael Tokarevsize_append = printf $(shell						\
395d3dd3b5aSH. Peter Anvindec_size=0;								\
396afa974b7SMasahiro Yamadafor F in $(real-prereqs); do					\
397a670b0b4SMichael Forney	fsize=$$($(CONFIG_SHELL) $(srctree)/scripts/file-size.sh $$F);	\
398d3dd3b5aSH. Peter Anvin	dec_size=$$(expr $$dec_size + $$fsize);				\
399d3dd3b5aSH. Peter Anvindone;									\
4001373411aSJonathan Niederprintf "%08x\n" $$dec_size |						\
4011373411aSJonathan Nieder	sed 's/\(..\)/\1 /g' | {					\
4021373411aSJonathan Nieder		read ch0 ch1 ch2 ch3;					\
4031373411aSJonathan Nieder		for ch in $$ch3 $$ch2 $$ch1 $$ch0; do			\
4041373411aSJonathan Nieder			printf '%s%03o' '\\' $$((0x$$ch)); 		\
4051373411aSJonathan Nieder		done;							\
4061373411aSJonathan Nieder	}								\
407d3dd3b5aSH. Peter Anvin)
408bc22c17eSAlain Knaff
409c4d7f40bSMasahiro Yamadaquiet_cmd_file_size = GEN     $@
410c4d7f40bSMasahiro Yamada      cmd_file_size = $(size_append) > $@
411c4d7f40bSMasahiro Yamada
412bc22c17eSAlain Knaffquiet_cmd_bzip2 = BZIP2   $@
4137ce7e984SMasahiro Yamada      cmd_bzip2 = cat $(real-prereqs) | $(KBZIP2) -9 > $@
4147ce7e984SMasahiro Yamada
4157ce7e984SMasahiro Yamadaquiet_cmd_bzip2_with_size = BZIP2   $@
4167ce7e984SMasahiro Yamada      cmd_bzip2_with_size = { cat $(real-prereqs) | $(KBZIP2) -9; $(size_append); } > $@
417bc22c17eSAlain Knaff
418bc22c17eSAlain Knaff# Lzma
419bc22c17eSAlain Knaff# ---------------------------------------------------------------------------
420bc22c17eSAlain Knaff
421bc22c17eSAlain Knaffquiet_cmd_lzma = LZMA    $@
4227ce7e984SMasahiro Yamada      cmd_lzma = cat $(real-prereqs) | $(LZMA) -9 > $@
4237ce7e984SMasahiro Yamada
4247ce7e984SMasahiro Yamadaquiet_cmd_lzma_with_size = LZMA    $@
4257ce7e984SMasahiro Yamada      cmd_lzma_with_size = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@
4267dd65febSAlbin Tonnerre
4277dd65febSAlbin Tonnerrequiet_cmd_lzo = LZO     $@
4287ce7e984SMasahiro Yamada      cmd_lzo = cat $(real-prereqs) | $(KLZOP) -9 > $@
4297ce7e984SMasahiro Yamada
4307ce7e984SMasahiro Yamadaquiet_cmd_lzo_with_size = LZO     $@
4317ce7e984SMasahiro Yamada      cmd_lzo_with_size = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@
432d61931d8SBorislav Petkov
433e76e1fdfSKyungsik Leequiet_cmd_lz4 = LZ4     $@
4347ce7e984SMasahiro Yamada      cmd_lz4 = cat $(real-prereqs) | $(LZ4) -l -c1 stdin stdout > $@
4357ce7e984SMasahiro Yamada
4367ce7e984SMasahiro Yamadaquiet_cmd_lz4_with_size = LZ4     $@
4377ce7e984SMasahiro Yamada      cmd_lz4_with_size = { cat $(real-prereqs) | $(LZ4) -l -c1 stdin stdout; \
438b79c6aa6SMasahiro Yamada                  $(size_append); } > $@
439e76e1fdfSKyungsik Lee
440e3393645SStephen Warren# U-Boot mkimage
441e3393645SStephen Warren# ---------------------------------------------------------------------------
442e3393645SStephen Warren
443e3393645SStephen WarrenMKIMAGE := $(srctree)/scripts/mkuboot.sh
444e3393645SStephen Warren
445e3393645SStephen Warren# SRCARCH just happens to match slightly more than ARCH (on sparc), so reduces
446e3393645SStephen Warren# the number of overrides in arch makefiles
447e3393645SStephen WarrenUIMAGE_ARCH ?= $(SRCARCH)
4485c816641SMasahiro YamadaUIMAGE_COMPRESSION ?= $(or $(2),none)
449e3393645SStephen WarrenUIMAGE_OPTS-y ?=
450e3393645SStephen WarrenUIMAGE_TYPE ?= kernel
451e3393645SStephen WarrenUIMAGE_LOADADDR ?= arch_must_set_this
452e3393645SStephen WarrenUIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)
453e3393645SStephen WarrenUIMAGE_NAME ?= 'Linux-$(KERNELRELEASE)'
454e3393645SStephen Warren
455786ac51aSMasahiro Yamadaquiet_cmd_uimage = UIMAGE  $@
456858805b3SMasahiro Yamada      cmd_uimage = $(BASH) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \
457e3393645SStephen Warren			-C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \
458e3393645SStephen Warren			-T $(UIMAGE_TYPE) \
459e3393645SStephen Warren			-a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \
460786ac51aSMasahiro Yamada			-n $(UIMAGE_NAME) -d $< $@
461e3393645SStephen Warren
46224fa0402SLasse Collin# XZ
46324fa0402SLasse Collin# ---------------------------------------------------------------------------
46424fa0402SLasse Collin# Use xzkern to compress the kernel image and xzmisc to compress other things.
46524fa0402SLasse Collin#
46624fa0402SLasse Collin# xzkern uses a big LZMA2 dictionary since it doesn't increase memory usage
46724fa0402SLasse Collin# of the kernel decompressor. A BCJ filter is used if it is available for
46824fa0402SLasse Collin# the target architecture. xzkern also appends uncompressed size of the data
46924fa0402SLasse Collin# using size_append. The .xz format has the size information available at
47024fa0402SLasse Collin# the end of the file too, but it's in more complex format and it's good to
47124fa0402SLasse Collin# avoid changing the part of the boot code that reads the uncompressed size.
47224fa0402SLasse Collin# Note that the bytes added by size_append will make the xz tool think that
47324fa0402SLasse Collin# the file is corrupt. This is expected.
47424fa0402SLasse Collin#
47524fa0402SLasse Collin# xzmisc doesn't use size_append, so it can be used to create normal .xz
47624fa0402SLasse Collin# files. xzmisc uses smaller LZMA2 dictionary than xzkern, because a very
47724fa0402SLasse Collin# big dictionary would increase the memory usage too much in the multi-call
47824fa0402SLasse Collin# decompression mode. A BCJ filter isn't used either.
47924fa0402SLasse Collinquiet_cmd_xzkern = XZKERN  $@
4807ce7e984SMasahiro Yamada      cmd_xzkern = cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh > $@
4817ce7e984SMasahiro Yamada
4827ce7e984SMasahiro Yamadaquiet_cmd_xzkern_with_size = XZKERN  $@
4837ce7e984SMasahiro Yamada      cmd_xzkern_with_size = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \
484b79c6aa6SMasahiro Yamada                     $(size_append); } > $@
48524fa0402SLasse Collin
48624fa0402SLasse Collinquiet_cmd_xzmisc = XZMISC  $@
4878dfb61dcSDenis Efremov      cmd_xzmisc = cat $(real-prereqs) | $(XZ) --check=crc32 --lzma2=dict=1MiB > $@
488ebf003f0SMatthias Kaehlcke
48948f7ddf7SNick Terrell# ZSTD
49048f7ddf7SNick Terrell# ---------------------------------------------------------------------------
49148f7ddf7SNick Terrell# Appends the uncompressed size of the data using size_append. The .zst
49248f7ddf7SNick Terrell# format has the size information available at the beginning of the file too,
49348f7ddf7SNick Terrell# but it's in a more complex format and it's good to avoid changing the part
49448f7ddf7SNick Terrell# of the boot code that reads the uncompressed size.
49548f7ddf7SNick Terrell#
49648f7ddf7SNick Terrell# Note that the bytes added by size_append will make the zstd tool think that
49748f7ddf7SNick Terrell# the file is corrupt. This is expected.
49848f7ddf7SNick Terrell#
49948f7ddf7SNick Terrell# zstd uses a maximum window size of 8 MB. zstd22 uses a maximum window size of
50048f7ddf7SNick Terrell# 128 MB. zstd22 is used for kernel compression because it is decompressed in a
50148f7ddf7SNick Terrell# single pass, so zstd doesn't need to allocate a window buffer. When streaming
50248f7ddf7SNick Terrell# decompression is used, like initramfs decompression, zstd22 should likely not
50348f7ddf7SNick Terrell# be used because it would require zstd to allocate a 128 MB buffer.
50448f7ddf7SNick Terrell
50548f7ddf7SNick Terrellquiet_cmd_zstd = ZSTD    $@
50664d8aaa4SMasahiro Yamada      cmd_zstd = cat $(real-prereqs) | $(ZSTD) -19 > $@
50748f7ddf7SNick Terrell
50848f7ddf7SNick Terrellquiet_cmd_zstd22 = ZSTD22  $@
5097ce7e984SMasahiro Yamada      cmd_zstd22 = cat $(real-prereqs) | $(ZSTD) -22 --ultra > $@
5107ce7e984SMasahiro Yamada
5117ce7e984SMasahiro Yamadaquiet_cmd_zstd22_with_size = ZSTD22  $@
5127ce7e984SMasahiro Yamada      cmd_zstd22_with_size = { cat $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@
51348f7ddf7SNick Terrell
514ebf003f0SMatthias Kaehlcke# ASM offsets
515ebf003f0SMatthias Kaehlcke# ---------------------------------------------------------------------------
516ebf003f0SMatthias Kaehlcke
517ebf003f0SMatthias Kaehlcke# Default sed regexp - multiline due to syntax constraints
518cf0c3e68SJeroen Hofstee#
519cf0c3e68SJeroen Hofstee# Use [:space:] because LLVM's integrated assembler inserts <tab> around
520cf0c3e68SJeroen Hofstee# the .ascii directive whereas GCC keeps the <space> as-is.
521ebf003f0SMatthias Kaehlckedefine sed-offsets
522cf0c3e68SJeroen Hofstee	's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:; \
523cf0c3e68SJeroen Hofstee	/^->/{s:->#\(.*\):/* \1 */:; \
524ebf003f0SMatthias Kaehlcke	s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
525cf0c3e68SJeroen Hofstee	s:->::; p;}'
526ebf003f0SMatthias Kaehlckeendef
527ebf003f0SMatthias Kaehlcke
528ebf003f0SMatthias Kaehlcke# Use filechk to avoid rebuilds when a header changes, but the resulting file
529ebf003f0SMatthias Kaehlcke# does not
530ebf003f0SMatthias Kaehlckedefine filechk_offsets
531ebf003f0SMatthias Kaehlcke	 echo "#ifndef $2"; \
532ebf003f0SMatthias Kaehlcke	 echo "#define $2"; \
533ebf003f0SMatthias Kaehlcke	 echo "/*"; \
534ebf003f0SMatthias Kaehlcke	 echo " * DO NOT MODIFY."; \
535ebf003f0SMatthias Kaehlcke	 echo " *"; \
536ebf003f0SMatthias Kaehlcke	 echo " * This file was generated by Kbuild"; \
537ebf003f0SMatthias Kaehlcke	 echo " */"; \
538ebf003f0SMatthias Kaehlcke	 echo ""; \
53943fee2b2SMasahiro Yamada	 sed -ne $(sed-offsets) < $<; \
540ebf003f0SMatthias Kaehlcke	 echo ""; \
541ad774086SMasahiro Yamada	 echo "#endif"
542ebf003f0SMatthias Kaehlckeendef
543