162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciPHONY := __default
462306a36Sopenharmony_ci__default: vmlinux.o modules.builtin.modinfo modules.builtin
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciinclude include/config/auto.conf
762306a36Sopenharmony_ciinclude $(srctree)/scripts/Kbuild.include
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci# for objtool
1062306a36Sopenharmony_ciinclude $(srctree)/scripts/Makefile.lib
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci# Generate a linker script to ensure correct ordering of initcalls for Clang LTO
1362306a36Sopenharmony_ci# ---------------------------------------------------------------------------
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciquiet_cmd_gen_initcalls_lds = GEN     $@
1662306a36Sopenharmony_ci      cmd_gen_initcalls_lds = \
1762306a36Sopenharmony_ci	$(PYTHON3) $(srctree)/scripts/jobserver-exec \
1862306a36Sopenharmony_ci	$(PERL) $(real-prereqs) > $@
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci.tmp_initcalls.lds: $(srctree)/scripts/generate_initcall_order.pl \
2162306a36Sopenharmony_ci		vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
2262306a36Sopenharmony_ci	$(call if_changed,gen_initcalls_lds)
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_citargets := .tmp_initcalls.lds
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ciifdef CONFIG_LTO_CLANG
2762306a36Sopenharmony_ciinitcalls-lds := .tmp_initcalls.lds
2862306a36Sopenharmony_ciendif
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci# objtool for vmlinux.o
3162306a36Sopenharmony_ci# ---------------------------------------------------------------------------
3262306a36Sopenharmony_ci#
3362306a36Sopenharmony_ci# For LTO and IBT, objtool doesn't run on individual translation units.
3462306a36Sopenharmony_ci# Run everything on vmlinux instead.
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciobjtool-enabled := $(or $(delay-objtool),$(CONFIG_NOINSTR_VALIDATION))
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_civmlinux-objtool-args-$(delay-objtool)			+= $(objtool-args-y)
3962306a36Sopenharmony_civmlinux-objtool-args-$(CONFIG_GCOV_KERNEL)		+= --no-unreachable
4062306a36Sopenharmony_civmlinux-objtool-args-$(CONFIG_NOINSTR_VALIDATION)	+= --noinstr \
4162306a36Sopenharmony_ci							   $(if $(or $(CONFIG_CPU_UNRET_ENTRY),$(CONFIG_CPU_SRSO)), --unret)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciobjtool-args = $(vmlinux-objtool-args-y) --link
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci# Link of vmlinux.o used for section mismatch analysis
4662306a36Sopenharmony_ci# ---------------------------------------------------------------------------
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciquiet_cmd_ld_vmlinux.o = LD      $@
4962306a36Sopenharmony_ci      cmd_ld_vmlinux.o = \
5062306a36Sopenharmony_ci	$(LD) ${KBUILD_LDFLAGS} -r -o $@ \
5162306a36Sopenharmony_ci	$(addprefix -T , $(initcalls-lds)) \
5262306a36Sopenharmony_ci	--whole-archive vmlinux.a --no-whole-archive \
5362306a36Sopenharmony_ci	--start-group $(KBUILD_VMLINUX_LIBS) --end-group \
5462306a36Sopenharmony_ci	$(cmd_objtool)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cidefine rule_ld_vmlinux.o
5762306a36Sopenharmony_ci	$(call cmd_and_savecmd,ld_vmlinux.o)
5862306a36Sopenharmony_ci	$(call cmd,gen_objtooldep)
5962306a36Sopenharmony_ciendef
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_civmlinux.o: $(initcalls-lds) vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
6262306a36Sopenharmony_ci	$(call if_changed_rule,ld_vmlinux.o)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_citargets += vmlinux.o
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci# module.builtin.modinfo
6762306a36Sopenharmony_ci# ---------------------------------------------------------------------------
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciOBJCOPYFLAGS_modules.builtin.modinfo := -j .modinfo -O binary
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_citargets += modules.builtin.modinfo
7262306a36Sopenharmony_cimodules.builtin.modinfo: vmlinux.o FORCE
7362306a36Sopenharmony_ci	$(call if_changed,objcopy)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci# module.builtin
7662306a36Sopenharmony_ci# ---------------------------------------------------------------------------
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci# The second line aids cases where multiple modules share the same object.
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciquiet_cmd_modules_builtin = GEN     $@
8162306a36Sopenharmony_ci      cmd_modules_builtin = \
8262306a36Sopenharmony_ci	tr '\0' '\n' < $< | \
8362306a36Sopenharmony_ci	sed -n 's/^[[:alnum:]:_]*\.file=//p' | \
8462306a36Sopenharmony_ci	tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$$/.ko/' > $@
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_citargets += modules.builtin
8762306a36Sopenharmony_cimodules.builtin: modules.builtin.modinfo FORCE
8862306a36Sopenharmony_ci	$(call if_changed,modules_builtin)
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci# Add FORCE to the prequisites of a target to force it to be always rebuilt.
9162306a36Sopenharmony_ci# ---------------------------------------------------------------------------
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ciPHONY += FORCE
9462306a36Sopenharmony_ciFORCE:
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci# Read all saved command lines and dependencies for the $(targets) we
9762306a36Sopenharmony_ci# may be building above, using $(if_changed{,_dep}). As an
9862306a36Sopenharmony_ci# optimization, we don't need to read them if the target does not
9962306a36Sopenharmony_ci# exist, we will rebuild anyway in that case.
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciexisting-targets := $(wildcard $(sort $(targets)))
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci.PHONY: $(PHONY)
106