mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 17:25:35 +03:00
nvidia-oot: Remove the builds of device tree from nvidia-oot
The build of device tree is moved to new folder/repo and hence it is not required to have build support file for device-tree. Remove the unused file. Bug 4654821 Change-Id: Id01d634d551d36bc9b36c8971b13ed27f7b6b6d6 Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3165347
This commit is contained in:
committed by
mobile promotions
parent
3a04791c47
commit
edbb5317f8
@@ -1,150 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright (c) 2022-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
|
|
||||||
objtree ?= $(srctree)
|
|
||||||
|
|
||||||
# Redefine the fixdep command
|
|
||||||
cmd_and_fixdep = \
|
|
||||||
$(cmd); \
|
|
||||||
$(objtree)/scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\
|
|
||||||
rm -f $(depfile)
|
|
||||||
|
|
||||||
include $(oottree)/scripts/Makefile.lib
|
|
||||||
|
|
||||||
DTC_CPP_FLAGS += $(EXTRA_CPP_FLAGS)
|
|
||||||
|
|
||||||
DTC_CPP_FLAGS += -DLINUX_VERSION=600 -DTEGRA_HOST1X_DT_VERSION=2 -DOS_LINUX
|
|
||||||
|
|
||||||
ifneq ($(findstring ack_src,$(NV_BUILD_KERNEL_OPTIONS)),)
|
|
||||||
ifneq ($(TOP),)
|
|
||||||
SOURCE_TOP := $(TOP)
|
|
||||||
else
|
|
||||||
$(error TOP is not defined)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
ifneq ($(TEGRA_TOP),)
|
|
||||||
SOURCE_TOP := $(TEGRA_TOP)
|
|
||||||
else ifneq ($(TOP),)
|
|
||||||
SOURCE_TOP := $(TOP)
|
|
||||||
else
|
|
||||||
$(error TEGRA_TOP or TOP is not defined)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
tegra-dtstree := $(SOURCE_TOP)/hardware/nvidia
|
|
||||||
|
|
||||||
# Get relative path for tegra-dtstree from this makefile
|
|
||||||
null :=
|
|
||||||
space :=$(null) $(null)
|
|
||||||
obj-path := $(obj)
|
|
||||||
obj-path-from-top := $(subst $(SOURCE_TOP),,$(obj-path))
|
|
||||||
rel-top-path := $(subst /, $(space)/,$(obj-path-from-top))
|
|
||||||
rel-top-path := $(patsubst /%,../,$(rel-top-path))
|
|
||||||
rel-top-path := $(subst $(space),,$(rel-top-path))
|
|
||||||
tegra-rel-dtstree := $(rel-top-path)/hardware/nvidia
|
|
||||||
|
|
||||||
DTC_INCLUDE :=
|
|
||||||
# SOC independent common include
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/tegra/nv-public
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/tegra/nv-public/include/kernel
|
|
||||||
|
|
||||||
# SOC T23X specific common include
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/t23x/nv-public/include/kernel
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/t23x/nv-public/include/nvidia-oot
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/t23x/nv-public/include/platforms
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/t23x/nv-public
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/t264/nv-public/include/kernel-t264
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/t264/nv-public
|
|
||||||
|
|
||||||
dtb-y :=
|
|
||||||
dtbo-y :=
|
|
||||||
|
|
||||||
DTB_LIST := $(dtb-y)
|
|
||||||
DTBO_LIST := $(dtbo-y)
|
|
||||||
dtb-y :=
|
|
||||||
fdts := $(tegra-dtstree)/t23x
|
|
||||||
fdts += $(tegra-dtstree)/t264
|
|
||||||
|
|
||||||
# Add internal SOCs to scan the DT makefiles
|
|
||||||
ifneq ($(internal_soc_list),)
|
|
||||||
fdts += $(addprefix $(tegra-dtstree)/,$(internal_soc_list))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Remove the DTs from protected soc list
|
|
||||||
ifneq ($(protected_soc_list),)
|
|
||||||
kdts := $(foreach dt_path, $(fdts), $(if $(filter $(protected_soc_list),$(patsubst -,$(space),$(subst /, $(space),$(dt_path)))),,$(dt_path)))
|
|
||||||
kdts := $(filter-out $(space)$(space),$(kdts))
|
|
||||||
else
|
|
||||||
kdts := $(fdts)
|
|
||||||
endif
|
|
||||||
|
|
||||||
dts_makefile=$(foreach d,$(wildcard $1*), $(call dts_makefile,$(d)/,$(2)) $(if $(findstring Makefile,$(d)),$(d)))
|
|
||||||
dts_mfiles = $(call dts_makefile, $(kdts), Makefile)
|
|
||||||
|
|
||||||
ifneq ($(dts_mfiles),)
|
|
||||||
dts-include :=
|
|
||||||
include $(dts_mfiles)
|
|
||||||
dtb-y := $(addprefix $(tegra-rel-dtstree)/,$(dtb-y))
|
|
||||||
dtbo-y := $(addprefix $(tegra-rel-dtstree)/,$(dtbo-y))
|
|
||||||
ifneq ($(dts-include),)
|
|
||||||
DTC_INCLUDE += $(addprefix $(tegra-dtstree)/,$(dts-include))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
DTB_LIST += $(dtb-y)
|
|
||||||
DTBO_LIST += $(dtbo-y)
|
|
||||||
DTB_NEW_RULE_LIST := $(dtb-y)
|
|
||||||
DTBO_NEW_RULE_LIST := $(dtbo-y)
|
|
||||||
|
|
||||||
# Now save DTB_LIST to dtb-y
|
|
||||||
dtb-y := $(DTB_LIST)
|
|
||||||
dtbo-y := $(DTBO_LIST)
|
|
||||||
|
|
||||||
# Add path of main Makefile to each dtb/dtbo list
|
|
||||||
DTB_OBJS := $(addprefix $(obj)/,$(DTB_LIST))
|
|
||||||
DTBO_OBJS := $(addprefix $(obj)/,$(DTBO_LIST))
|
|
||||||
|
|
||||||
###
|
|
||||||
# remove the ../
|
|
||||||
replace_ddot = $(subst ../,,$(1))
|
|
||||||
|
|
||||||
define _define_dtb_rule
|
|
||||||
$(obj)/$(call replace_ddot,$(1)): $(src)/$(patsubst %.dtb,%.dts,$(1)) FORCE
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(foreach _dtb, $(DTB_NEW_RULE_LIST), $(eval $(call _define_dtb_rule,$(_dtb))))
|
|
||||||
|
|
||||||
DTB_OBJS := $(call replace_ddot,$(DTB_OBJS))
|
|
||||||
DTB_NEW_RULE_LIST := $(addprefix $(obj)/,$(DTB_NEW_RULE_LIST))
|
|
||||||
DTB_NEW_RULE_LIST := $(call replace_ddot,$(DTB_NEW_RULE_LIST))
|
|
||||||
|
|
||||||
$(DTB_NEW_RULE_LIST):
|
|
||||||
$(call if_changed_dep,dtc)
|
|
||||||
|
|
||||||
define _define_dtbo_rule
|
|
||||||
$(obj)/$(call replace_ddot,$(1)): $(src)/$(patsubst %.dtbo,%.dts,$(1)) FORCE
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(foreach _dtbo, $(DTBO_NEW_RULE_LIST), $(eval $(call _define_dtbo_rule,$(_dtbo))))
|
|
||||||
|
|
||||||
DTBO_OBJS := $(call replace_ddot,$(DTBO_OBJS))
|
|
||||||
DTBO_NEW_RULE_LIST := $(addprefix $(obj)/,$(DTBO_NEW_RULE_LIST))
|
|
||||||
DTBO_NEW_RULE_LIST := $(call replace_ddot,$(DTBO_NEW_RULE_LIST))
|
|
||||||
|
|
||||||
$(DTBO_NEW_RULE_LIST):
|
|
||||||
$(call if_changed_dep,dtc)
|
|
||||||
|
|
||||||
DTBS_DTBOS := $(DTB_OBJS)$(DTBO_OBJS)
|
|
||||||
|
|
||||||
dtbs: $(DTB_OBJS) $(DTBO_OBJS) FORCE
|
|
||||||
if [ ! -d $(obj)/dtbs/ ] ; then \
|
|
||||||
mkdir -p $(obj)/dtbs/ ; \
|
|
||||||
fi
|
|
||||||
if [ ! -z "$(DTBS_DTBOS)" ] ; then \
|
|
||||||
cp -u $(DTB_OBJS) $(DTBO_OBJS) $(obj)/dtbs/ ; \
|
|
||||||
fi
|
|
||||||
if [ -d $(obj)/hardware/ ] ; then \
|
|
||||||
rm -rf $(obj)/hardware/ ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean-files := *.dtb *.dtbo *.tmp
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
|
|
||||||
objtree = $(srctree)
|
|
||||||
|
|
||||||
# Redefine the fixdep command
|
|
||||||
cmd_and_fixdep = \
|
|
||||||
$(cmd); \
|
|
||||||
$(objtree)/scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\
|
|
||||||
rm -f $(depfile)
|
|
||||||
|
|
||||||
include $(oottree)/scripts/Makefile.lib
|
|
||||||
|
|
||||||
# Stop warning of the graph port and graph endpoint
|
|
||||||
DTC_FLAGS += -Wno-graph_port
|
|
||||||
DTC_FLAGS += -Wno-graph_endpoint
|
|
||||||
|
|
||||||
DTC_CPP_FLAGS += $(EXTRA_CPP_FLAGS)
|
|
||||||
|
|
||||||
DTC_CPP_FLAGS += -DLINUX_VERSION=600 -DTEGRA_HOST1X_DT_VERSION=2 -DOS_LINUX
|
|
||||||
|
|
||||||
ifneq ($(findstring ack_src,$(NV_BUILD_KERNEL_OPTIONS)),)
|
|
||||||
ifneq ($(TOP),)
|
|
||||||
SOURCE_TOP := $(TOP)
|
|
||||||
else
|
|
||||||
$(error TOP is not defined)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
ifneq ($(TEGRA_TOP),)
|
|
||||||
SOURCE_TOP := $(TEGRA_TOP)
|
|
||||||
else ifneq ($(TOP),)
|
|
||||||
SOURCE_TOP := $(TOP)
|
|
||||||
else
|
|
||||||
$(error TEGRA_TOP or TOP is not defined)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
tegra-dtstree := $(SOURCE_TOP)/hardware/nvidia
|
|
||||||
# Get relative path for tegra-dtstree from this makefile
|
|
||||||
null :=
|
|
||||||
space :=$(null) $(null)
|
|
||||||
obj-path := $(obj)
|
|
||||||
obj-path-from-top := $(subst $(SOURCE_TOP),,$(obj-path))
|
|
||||||
rel-top-path := $(subst /, $(space)/,$(obj-path-from-top))
|
|
||||||
rel-top-path := $(patsubst /%,../,$(rel-top-path))
|
|
||||||
rel-top-path := $(subst $(space),,$(rel-top-path))
|
|
||||||
tegra-rel-dtstree := $(rel-top-path)/hardware/nvidia
|
|
||||||
|
|
||||||
DTC_INCLUDE :=
|
|
||||||
# SOC independent common include
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/soc/tegra/kernel-include
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/platform/tegra/common/kernel-dts
|
|
||||||
|
|
||||||
# SOC T23X specific common include
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/soc/t23x/kernel-include
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/soc/t23x/kernel-dts
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/platform/t23x/common/kernel-dts
|
|
||||||
DTC_INCLUDE += $(tegra-dtstree)/platform/t23x/automotive/kernel-dts/common/linux/
|
|
||||||
|
|
||||||
dtb-oot-y :=
|
|
||||||
dtbo-oot-y :=
|
|
||||||
|
|
||||||
DTB_LIST := $(dtb-oot-y)
|
|
||||||
DTBO_LIST := $(dtbo-oot-y)
|
|
||||||
dtb-oot-y :=
|
|
||||||
fdts := $(shell find $(tegra-dtstree)/platform -name kernel-dts)
|
|
||||||
|
|
||||||
# Remove the DTs from protected soc list
|
|
||||||
ifneq ($(protected_soc_list),)
|
|
||||||
kdts := $(foreach dt_path, $(fdts), $(if $(filter $(protected_soc_list),$(patsubst -,$(space),$(subst /, $(space),$(dt_path)))),,$(dt_path)))
|
|
||||||
kdts := $(filter-out $(space)$(space),$(kdts))
|
|
||||||
else
|
|
||||||
kdts := $(fdts)
|
|
||||||
endif
|
|
||||||
|
|
||||||
dts_makefile=$(foreach d,$(wildcard $1*), $(call dts_makefile,$(d)/,$(2)) $(if $(findstring Makefile,$(d)),$(d)))
|
|
||||||
dts_mfiles = $(call dts_makefile, $(kdts), Makefile)
|
|
||||||
|
|
||||||
ifneq ($(dts_mfiles),)
|
|
||||||
dts-include :=
|
|
||||||
include $(dts_mfiles)
|
|
||||||
dtb-oot-y := $(addprefix $(tegra-rel-dtstree)/,$(dtb-oot-y))
|
|
||||||
dtbo-oot-y := $(addprefix $(tegra-rel-dtstree)/,$(dtbo-oot-y))
|
|
||||||
ifneq ($(dts-include),)
|
|
||||||
DTC_INCLUDE += $(addprefix $(tegra-dtstree)/,$(dts-include))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
DTB_LIST += $(dtb-oot-y)
|
|
||||||
DTBO_LIST += $(dtbo-oot-y)
|
|
||||||
DTB_NEW_RULE_LIST := $(dtb-oot-y)
|
|
||||||
DTBO_NEW_RULE_LIST := $(dtbo-oot-y)
|
|
||||||
|
|
||||||
# Now save DTB_LIST to dtb-oot-y
|
|
||||||
dtb-oot-y := $(DTB_LIST)
|
|
||||||
dtbo-oot-y := $(DTBO_LIST)
|
|
||||||
|
|
||||||
# Add path of main Makefile to each dtb/dtbo list
|
|
||||||
DTB_OBJS := $(addprefix $(obj)/,$(DTB_LIST))
|
|
||||||
DTBO_OBJS := $(addprefix $(obj)/,$(DTBO_LIST))
|
|
||||||
|
|
||||||
###
|
|
||||||
# remove the ../
|
|
||||||
replace_ddot = $(subst ../,,$(1))
|
|
||||||
|
|
||||||
define _define_dtb_rule
|
|
||||||
$(obj)/$(call replace_ddot,$(1)): $(src)/$(patsubst %.dtb,%.dts,$(1)) FORCE
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(foreach _dtb, $(DTB_NEW_RULE_LIST), $(eval $(call _define_dtb_rule,$(_dtb))))
|
|
||||||
|
|
||||||
DTB_OBJS := $(call replace_ddot,$(DTB_OBJS))
|
|
||||||
DTB_NEW_RULE_LIST := $(addprefix $(obj)/,$(DTB_NEW_RULE_LIST))
|
|
||||||
DTB_NEW_RULE_LIST := $(call replace_ddot,$(DTB_NEW_RULE_LIST))
|
|
||||||
|
|
||||||
$(DTB_NEW_RULE_LIST):
|
|
||||||
$(call if_changed_dep,dtc)
|
|
||||||
|
|
||||||
define _define_dtbo_rule
|
|
||||||
$(obj)/$(call replace_ddot,$(1)): $(src)/$(patsubst %.dtbo,%.dts,$(1)) FORCE
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(foreach _dtbo, $(DTBO_NEW_RULE_LIST), $(eval $(call _define_dtbo_rule,$(_dtbo))))
|
|
||||||
|
|
||||||
DTBO_OBJS := $(call replace_ddot,$(DTBO_OBJS))
|
|
||||||
DTBO_NEW_RULE_LIST := $(addprefix $(obj)/,$(DTBO_NEW_RULE_LIST))
|
|
||||||
DTBO_NEW_RULE_LIST := $(call replace_ddot,$(DTBO_NEW_RULE_LIST))
|
|
||||||
|
|
||||||
$(DTBO_NEW_RULE_LIST):
|
|
||||||
$(call if_changed_dep,dtc)
|
|
||||||
|
|
||||||
DTBS_DTBOS := $(DTB_OBJS)$(DTBO_OBJS)
|
|
||||||
|
|
||||||
dtbs: $(DTB_OBJS) $(DTBO_OBJS) FORCE
|
|
||||||
if [ ! -d $(obj)/dtbs/ ] ; then \
|
|
||||||
mkdir -p $(obj)/dtbs/ ; \
|
|
||||||
fi
|
|
||||||
if [ ! -z "$(DTBS_DTBOS)" ] ; then \
|
|
||||||
cp -u $(DTB_OBJS) $(DTBO_OBJS) $(obj)/dtbs/ ; \
|
|
||||||
fi
|
|
||||||
if [ -d $(obj)/hardware/ ] ; then \
|
|
||||||
rm -rf $(obj)/hardware/ ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean-files := *.dtb *.dtbo *.tmp
|
|
||||||
@@ -1,570 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# ==========================================================================
|
|
||||||
# Building
|
|
||||||
# ==========================================================================
|
|
||||||
|
|
||||||
src := $(obj)
|
|
||||||
|
|
||||||
PHONY := __build
|
|
||||||
__build:
|
|
||||||
|
|
||||||
# Init all relevant variables used in kbuild files so
|
|
||||||
# 1) they have correct type
|
|
||||||
# 2) they do not inherit any value from the environment
|
|
||||||
obj-y :=
|
|
||||||
obj-m :=
|
|
||||||
lib-y :=
|
|
||||||
lib-m :=
|
|
||||||
always-y :=
|
|
||||||
always-m :=
|
|
||||||
targets :=
|
|
||||||
subdir-y :=
|
|
||||||
subdir-m :=
|
|
||||||
EXTRA_AFLAGS :=
|
|
||||||
EXTRA_CFLAGS :=
|
|
||||||
EXTRA_CPPFLAGS :=
|
|
||||||
EXTRA_LDFLAGS :=
|
|
||||||
asflags-y :=
|
|
||||||
ccflags-y :=
|
|
||||||
cppflags-y :=
|
|
||||||
ldflags-y :=
|
|
||||||
|
|
||||||
subdir-asflags-y :=
|
|
||||||
subdir-ccflags-y :=
|
|
||||||
|
|
||||||
# Read auto.conf if it exists, otherwise ignore
|
|
||||||
-include include/config/auto.conf
|
|
||||||
|
|
||||||
include $(srctree)/scripts/Kbuild.include
|
|
||||||
include $(srctree)/scripts/Makefile.compiler
|
|
||||||
|
|
||||||
# The filename Kbuild has precedence over Makefile
|
|
||||||
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
|
|
||||||
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
|
|
||||||
include $(kbuild-file)
|
|
||||||
|
|
||||||
include $(oottree)/scripts/Makefile.lib
|
|
||||||
|
|
||||||
# Do not include hostprogs rules unless needed.
|
|
||||||
# $(sort ...) is used here to remove duplicated words and excessive spaces.
|
|
||||||
hostprogs := $(sort $(hostprogs))
|
|
||||||
ifneq ($(hostprogs),)
|
|
||||||
include $(srctree)/scripts/Makefile.host
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Do not include userprogs rules unless needed.
|
|
||||||
# $(sort ...) is used here to remove duplicated words and excessive spaces.
|
|
||||||
userprogs := $(sort $(userprogs))
|
|
||||||
ifneq ($(userprogs),)
|
|
||||||
include $(srctree)/scripts/Makefile.userprogs
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef obj
|
|
||||||
$(warning kbuild: Makefile.build is included improperly)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(need-modorder),)
|
|
||||||
ifneq ($(obj-m),)
|
|
||||||
$(warning $(patsubst %.o,'%.ko',$(obj-m)) will not be built even though obj-m is specified.)
|
|
||||||
$(warning You cannot use subdir-y/m to visit a module Makefile. Use obj-y/m instead.)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# ===========================================================================
|
|
||||||
|
|
||||||
# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
|
|
||||||
subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
|
|
||||||
subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
|
|
||||||
|
|
||||||
targets-for-builtin := $(extra-y)
|
|
||||||
|
|
||||||
ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
|
|
||||||
targets-for-builtin += $(obj)/lib.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef need-builtin
|
|
||||||
targets-for-builtin += $(obj)/built-in.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
|
|
||||||
|
|
||||||
ifdef CONFIG_LTO_CLANG
|
|
||||||
targets-for-modules += $(patsubst %.o, %.lto.o, $(filter %.o, $(obj-m)))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef need-modorder
|
|
||||||
targets-for-modules += $(obj)/modules.order
|
|
||||||
endif
|
|
||||||
|
|
||||||
targets += $(targets-for-builtin) $(targets-for-modules)
|
|
||||||
|
|
||||||
# Linus' kernel sanity checking tool
|
|
||||||
ifeq ($(KBUILD_CHECKSRC),1)
|
|
||||||
quiet_cmd_checksrc = CHECK $<
|
|
||||||
cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
|
|
||||||
else ifeq ($(KBUILD_CHECKSRC),2)
|
|
||||||
quiet_cmd_force_checksrc = CHECK $<
|
|
||||||
cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(KBUILD_EXTRA_WARN),)
|
|
||||||
cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $<
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Compile C sources (.c)
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
quiet_cmd_cc_s_c = CC $(quiet_modtag) $@
|
|
||||||
cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS) $(CC_FLAGS_LTO), $(c_flags)) -fverbose-asm -S -o $@ $<
|
|
||||||
|
|
||||||
$(obj)/%.s: $(src)/%.c FORCE
|
|
||||||
$(call if_changed_dep,cc_s_c)
|
|
||||||
|
|
||||||
quiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@
|
|
||||||
cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $<
|
|
||||||
|
|
||||||
$(obj)/%.i: $(src)/%.c FORCE
|
|
||||||
$(call if_changed_dep,cpp_i_c)
|
|
||||||
|
|
||||||
# These mirror gensymtypes_S and co below, keep them in synch.
|
|
||||||
cmd_gensymtypes_c = \
|
|
||||||
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \
|
|
||||||
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
|
|
||||||
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
|
|
||||||
$(if $(KBUILD_PRESERVE),-p) \
|
|
||||||
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
|
|
||||||
|
|
||||||
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
|
|
||||||
cmd_cc_symtypes_c = \
|
|
||||||
$(call cmd_gensymtypes_c,true,$@) >/dev/null; \
|
|
||||||
test -s $@ || rm -f $@
|
|
||||||
|
|
||||||
$(obj)/%.symtypes : $(src)/%.c FORCE
|
|
||||||
$(call cmd,cc_symtypes_c)
|
|
||||||
|
|
||||||
# LLVM assembly
|
|
||||||
# Generate .ll files from .c
|
|
||||||
quiet_cmd_cc_ll_c = CC $(quiet_modtag) $@
|
|
||||||
cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $<
|
|
||||||
|
|
||||||
$(obj)/%.ll: $(src)/%.c FORCE
|
|
||||||
$(call if_changed_dep,cc_ll_c)
|
|
||||||
|
|
||||||
# C (.c) files
|
|
||||||
# The C file is compiled and updated dependency information is generated.
|
|
||||||
# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
|
|
||||||
|
|
||||||
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
|
|
||||||
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
|
|
||||||
|
|
||||||
ifdef CONFIG_MODVERSIONS
|
|
||||||
# When module versioning is enabled the following steps are executed:
|
|
||||||
# o compile a <file>.o from <file>.c
|
|
||||||
# o if <file>.o doesn't contain a __ksymtab version, i.e. does
|
|
||||||
# not export symbols, it's done.
|
|
||||||
# o otherwise, we calculate symbol versions using the good old
|
|
||||||
# genksyms on the preprocessed source and postprocess them in a way
|
|
||||||
# that they are usable as a linker script
|
|
||||||
# o generate .tmp_<file>.o from <file>.o using the linker to
|
|
||||||
# replace the unresolved symbols __crc_exported_symbol with
|
|
||||||
# the actual value of the checksum generated by genksyms
|
|
||||||
# o remove .tmp_<file>.o to <file>.o
|
|
||||||
|
|
||||||
ifdef CONFIG_LTO_CLANG
|
|
||||||
# Generate .o.symversions files for each .o with exported symbols, and link these
|
|
||||||
# to the kernel and/or modules at the end.
|
|
||||||
cmd_modversions_c = \
|
|
||||||
if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \
|
|
||||||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
|
||||||
> $@.symversions; \
|
|
||||||
else \
|
|
||||||
rm -f $@.symversions; \
|
|
||||||
fi;
|
|
||||||
else
|
|
||||||
cmd_modversions_c = \
|
|
||||||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
|
|
||||||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
|
||||||
> $(@D)/.tmp_$(@F:.o=.ver); \
|
|
||||||
\
|
|
||||||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
|
|
||||||
-T $(@D)/.tmp_$(@F:.o=.ver); \
|
|
||||||
mv -f $(@D)/.tmp_$(@F) $@; \
|
|
||||||
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
|
|
||||||
fi
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
|
||||||
# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl
|
|
||||||
ifdef BUILD_C_RECORDMCOUNT
|
|
||||||
ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
|
|
||||||
RECORDMCOUNT_FLAGS = -w
|
|
||||||
endif
|
|
||||||
# Due to recursion, we must skip empty.o.
|
|
||||||
# The empty.o file is created in the make process in order to determine
|
|
||||||
# the target endianness and word size. It is made before all other C
|
|
||||||
# files, including recordmcount.
|
|
||||||
sub_cmd_record_mcount = \
|
|
||||||
if [ $(@) != "scripts/mod/empty.o" ]; then \
|
|
||||||
$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)"; \
|
|
||||||
fi;
|
|
||||||
recordmcount_source := $(srctree)/scripts/recordmcount.c \
|
|
||||||
$(srctree)/scripts/recordmcount.h
|
|
||||||
else
|
|
||||||
sub_cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
|
|
||||||
"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
|
|
||||||
"$(if $(CONFIG_64BIT),64,32)" \
|
|
||||||
"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \
|
|
||||||
"$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \
|
|
||||||
"$(if $(part-of-module),1,0)" "$(@)";
|
|
||||||
recordmcount_source := $(srctree)/scripts/recordmcount.pl
|
|
||||||
endif # BUILD_C_RECORDMCOUNT
|
|
||||||
cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)), \
|
|
||||||
$(sub_cmd_record_mcount))
|
|
||||||
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
|
||||||
|
|
||||||
ifdef CONFIG_STACK_VALIDATION
|
|
||||||
ifndef CONFIG_LTO_CLANG
|
|
||||||
|
|
||||||
__objtool_obj := $(objtree)/tools/objtool/objtool
|
|
||||||
|
|
||||||
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
|
|
||||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
|
|
||||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
|
|
||||||
cmd_objtool = $(if $(patsubst y%,, \
|
|
||||||
$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
|
|
||||||
$(__objtool_obj) $(objtool_args) $@)
|
|
||||||
objtool_obj = $(if $(patsubst y%,, \
|
|
||||||
$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n), \
|
|
||||||
$(__objtool_obj))
|
|
||||||
|
|
||||||
endif # CONFIG_LTO_CLANG
|
|
||||||
endif # CONFIG_STACK_VALIDATION
|
|
||||||
|
|
||||||
# Rebuild all objects when objtool changes, or is enabled/disabled.
|
|
||||||
objtool_dep = $(objtool_obj) \
|
|
||||||
$(wildcard include/config/ORC_UNWINDER \
|
|
||||||
include/config/STACK_VALIDATION)
|
|
||||||
|
|
||||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
|
||||||
cmd_gen_ksymdeps = \
|
|
||||||
$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
|
|
||||||
|
|
||||||
# List module undefined symbols
|
|
||||||
undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }';
|
|
||||||
endif
|
|
||||||
|
|
||||||
define rule_cc_o_c
|
|
||||||
$(call cmd_and_fixdep,cc_o_c)
|
|
||||||
$(call cmd,gen_ksymdeps)
|
|
||||||
$(call cmd,checksrc)
|
|
||||||
$(call cmd,checkdoc)
|
|
||||||
$(call cmd,objtool)
|
|
||||||
$(call cmd,modversions_c)
|
|
||||||
$(call cmd,record_mcount)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define rule_as_o_S
|
|
||||||
$(call cmd_and_fixdep,as_o_S)
|
|
||||||
$(call cmd,gen_ksymdeps)
|
|
||||||
$(call cmd,objtool)
|
|
||||||
$(call cmd,modversions_S)
|
|
||||||
endef
|
|
||||||
|
|
||||||
# Built-in and composite module parts
|
|
||||||
.SECONDEXPANSION:
|
|
||||||
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $$(objtool_dep) FORCE
|
|
||||||
$(call if_changed_rule,cc_o_c)
|
|
||||||
$(call cmd,force_checksrc)
|
|
||||||
|
|
||||||
ifdef CONFIG_LTO_CLANG
|
|
||||||
# Module .o files may contain LLVM bitcode, compile them into native code
|
|
||||||
# before ELF processing
|
|
||||||
quiet_cmd_cc_lto_link_modules = LTO [M] $@
|
|
||||||
cmd_cc_lto_link_modules = \
|
|
||||||
$(LD) $(ld_flags) -r -o $@ \
|
|
||||||
$(shell [ -s $(@:.lto.o=.o.symversions) ] && \
|
|
||||||
echo -T $(@:.lto.o=.o.symversions)) \
|
|
||||||
--whole-archive $(filter-out FORCE,$^)
|
|
||||||
|
|
||||||
ifdef CONFIG_STACK_VALIDATION
|
|
||||||
# objtool was skipped for LLVM bitcode, run it now that we have compiled
|
|
||||||
# modules into native code
|
|
||||||
cmd_cc_lto_link_modules += ; \
|
|
||||||
$(objtree)/tools/objtool/objtool $(objtool_args) --module $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(obj)/%.lto.o: $(obj)/%.o FORCE
|
|
||||||
$(call if_changed,cc_lto_link_modules)
|
|
||||||
endif
|
|
||||||
|
|
||||||
cmd_mod = { \
|
|
||||||
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
|
|
||||||
$(undefined_syms) echo; \
|
|
||||||
} > $@
|
|
||||||
|
|
||||||
$(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE
|
|
||||||
$(call if_changed,mod)
|
|
||||||
|
|
||||||
quiet_cmd_cc_lst_c = MKLST $@
|
|
||||||
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
|
|
||||||
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
|
|
||||||
System.map $(OBJDUMP) > $@
|
|
||||||
|
|
||||||
$(obj)/%.lst: $(src)/%.c FORCE
|
|
||||||
$(call if_changed_dep,cc_lst_c)
|
|
||||||
|
|
||||||
# Compile assembler sources (.S)
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# .S file exports must have their C prototypes defined in asm/asm-prototypes.h
|
|
||||||
# or a file that it includes, in order to get versioned symbols. We build a
|
|
||||||
# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from
|
|
||||||
# the .S file (with trailing ';'), and run genksyms on that, to extract vers.
|
|
||||||
#
|
|
||||||
# This is convoluted. The .S file must first be preprocessed to run guards and
|
|
||||||
# expand names, then the resulting exports must be constructed into plain
|
|
||||||
# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
|
|
||||||
# to make the genksyms input.
|
|
||||||
#
|
|
||||||
# These mirror gensymtypes_c and co above, keep them in synch.
|
|
||||||
cmd_gensymtypes_S = \
|
|
||||||
{ echo "\#include <linux/kernel.h>" ; \
|
|
||||||
echo "\#include <asm/asm-prototypes.h>" ; \
|
|
||||||
$(CPP) $(a_flags) $< | \
|
|
||||||
grep "\<___EXPORT_SYMBOL\>" | \
|
|
||||||
sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
|
|
||||||
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \
|
|
||||||
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
|
|
||||||
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
|
|
||||||
$(if $(KBUILD_PRESERVE),-p) \
|
|
||||||
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
|
|
||||||
|
|
||||||
quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
|
|
||||||
cmd_cc_symtypes_S = \
|
|
||||||
$(call cmd_gensymtypes_S,true,$@) >/dev/null; \
|
|
||||||
test -s $@ || rm -f $@
|
|
||||||
|
|
||||||
$(obj)/%.symtypes : $(src)/%.S FORCE
|
|
||||||
$(call cmd,cc_symtypes_S)
|
|
||||||
|
|
||||||
|
|
||||||
quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
|
|
||||||
cmd_cpp_s_S = $(CPP) $(a_flags) -o $@ $<
|
|
||||||
|
|
||||||
$(obj)/%.s: $(src)/%.S FORCE
|
|
||||||
$(call if_changed_dep,cpp_s_S)
|
|
||||||
|
|
||||||
quiet_cmd_as_o_S = AS $(quiet_modtag) $@
|
|
||||||
cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
|
|
||||||
|
|
||||||
ifdef CONFIG_ASM_MODVERSIONS
|
|
||||||
|
|
||||||
# versioning matches the C process described above, with difference that
|
|
||||||
# we parse asm-prototypes.h C header to get function definitions.
|
|
||||||
|
|
||||||
cmd_modversions_S = \
|
|
||||||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
|
|
||||||
$(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
|
||||||
> $(@D)/.tmp_$(@F:.o=.ver); \
|
|
||||||
\
|
|
||||||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
|
|
||||||
-T $(@D)/.tmp_$(@F:.o=.ver); \
|
|
||||||
mv -f $(@D)/.tmp_$(@F) $@; \
|
|
||||||
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
|
|
||||||
fi
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(obj)/%.o: $(src)/%.S $$(objtool_dep) FORCE
|
|
||||||
$(call if_changed_rule,as_o_S)
|
|
||||||
|
|
||||||
targets += $(filter-out $(subdir-builtin), $(real-obj-y))
|
|
||||||
targets += $(filter-out $(subdir-modorder), $(real-obj-m))
|
|
||||||
targets += $(real-dtb-y) $(lib-y) $(always-y) $(MAKECMDGOALS)
|
|
||||||
|
|
||||||
# Linker scripts preprocessor (.lds.S -> .lds)
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
quiet_cmd_cpp_lds_S = LDS $@
|
|
||||||
cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
|
|
||||||
-D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
|
|
||||||
|
|
||||||
$(obj)/%.lds: $(src)/%.lds.S FORCE
|
|
||||||
$(call if_changed_dep,cpp_lds_S)
|
|
||||||
|
|
||||||
# ASN.1 grammar
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
quiet_cmd_asn1_compiler = ASN.1 $(basename $@).[ch]
|
|
||||||
cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
|
|
||||||
$(basename $@).c $(basename $@).h
|
|
||||||
|
|
||||||
$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
|
|
||||||
$(call cmd,asn1_compiler)
|
|
||||||
|
|
||||||
# Build the compiled-in targets
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# To build objects in subdirs, we need to descend into the directories
|
|
||||||
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
|
|
||||||
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
|
|
||||||
|
|
||||||
# combine symversions for later processing
|
|
||||||
ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y)
|
|
||||||
cmd_update_lto_symversions = \
|
|
||||||
rm -f $@.symversions \
|
|
||||||
$(foreach n, $(filter-out FORCE,$^), \
|
|
||||||
$(if $(shell test -s $(n).symversions && echo y), \
|
|
||||||
; cat $(n).symversions >> $@.symversions))
|
|
||||||
else
|
|
||||||
cmd_update_lto_symversions = echo >/dev/null
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# Rule to compile a set of .o files into one .a file (without symbol table)
|
|
||||||
#
|
|
||||||
|
|
||||||
quiet_cmd_ar_builtin = AR $@
|
|
||||||
cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs)
|
|
||||||
|
|
||||||
quiet_cmd_ar_and_symver = AR $@
|
|
||||||
cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin)
|
|
||||||
|
|
||||||
$(obj)/built-in.a: $(real-obj-y) FORCE
|
|
||||||
$(call if_changed,ar_and_symver)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Rule to create modules.order file
|
|
||||||
#
|
|
||||||
# Create commands to either record .ko file or cat modules.order from
|
|
||||||
# a subdirectory
|
|
||||||
# Add $(obj-m) as the prerequisite to avoid updating the timestamp of
|
|
||||||
# modules.order unless contained modules are updated.
|
|
||||||
|
|
||||||
cmd_modules_order = { $(foreach m, $(real-prereqs), \
|
|
||||||
$(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \
|
|
||||||
| $(AWK) '!x[$$0]++' - > $@
|
|
||||||
|
|
||||||
$(obj)/modules.order: $(obj-m) FORCE
|
|
||||||
$(call if_changed,modules_order)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Rule to compile a set of .o files into one .a file (with symbol table)
|
|
||||||
#
|
|
||||||
quiet_cmd_ar_lib = AR $@
|
|
||||||
cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar)
|
|
||||||
|
|
||||||
$(obj)/lib.a: $(lib-y) FORCE
|
|
||||||
$(call if_changed,ar_lib)
|
|
||||||
|
|
||||||
# NOTE:
|
|
||||||
# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
|
|
||||||
# module is turned into a multi object module, $^ will contain header file
|
|
||||||
# dependencies recorded in the .*.cmd file.
|
|
||||||
ifdef CONFIG_LTO_CLANG
|
|
||||||
quiet_cmd_link_multi-m = AR [M] $@
|
|
||||||
cmd_link_multi-m = \
|
|
||||||
$(cmd_update_lto_symversions); \
|
|
||||||
rm -f $@; \
|
|
||||||
$(AR) cDPrsT $@ $(filter %.o,$^)
|
|
||||||
else
|
|
||||||
quiet_cmd_link_multi-m = LD [M] $@
|
|
||||||
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(multi-obj-m): FORCE
|
|
||||||
$(call if_changed,link_multi-m)
|
|
||||||
$(call multi_depend, $(multi-obj-m), .o, -objs -y -m)
|
|
||||||
|
|
||||||
targets += $(multi-obj-m)
|
|
||||||
targets := $(filter-out $(PHONY), $(targets))
|
|
||||||
|
|
||||||
# Add intermediate targets:
|
|
||||||
# When building objects with specific suffix patterns, add intermediate
|
|
||||||
# targets that the final targets are derived from.
|
|
||||||
intermediate_targets = $(foreach sfx, $(2), \
|
|
||||||
$(patsubst %$(strip $(1)),%$(sfx), \
|
|
||||||
$(filter %$(strip $(1)), $(targets))))
|
|
||||||
# %.asn1.o <- %.asn1.[ch] <- %.asn1
|
|
||||||
# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts
|
|
||||||
# %.lex.o <- %.lex.c <- %.l
|
|
||||||
# %.tab.o <- %.tab.[ch] <- %.y
|
|
||||||
targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \
|
|
||||||
$(call intermediate_targets, .dtb.o, .dtb.S .dtb) \
|
|
||||||
$(call intermediate_targets, .lex.o, .lex.c) \
|
|
||||||
$(call intermediate_targets, .tab.o, .tab.c .tab.h)
|
|
||||||
|
|
||||||
# Build
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
ifdef single-build
|
|
||||||
|
|
||||||
KBUILD_SINGLE_TARGETS := $(filter $(obj)/%, $(KBUILD_SINGLE_TARGETS))
|
|
||||||
|
|
||||||
curdir-single := $(sort $(foreach x, $(KBUILD_SINGLE_TARGETS), \
|
|
||||||
$(if $(filter $(x) $(basename $(x)).o, $(targets)), $(x))))
|
|
||||||
|
|
||||||
# Handle single targets without any rule: show "Nothing to be done for ..." or
|
|
||||||
# "No rule to make target ..." depending on whether the target exists.
|
|
||||||
unknown-single := $(filter-out $(addsuffix /%, $(subdir-ym)), \
|
|
||||||
$(filter-out $(curdir-single), $(KBUILD_SINGLE_TARGETS)))
|
|
||||||
|
|
||||||
single-subdirs := $(foreach d, $(subdir-ym), \
|
|
||||||
$(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d)))
|
|
||||||
|
|
||||||
__build: $(curdir-single) $(single-subdirs)
|
|
||||||
ifneq ($(unknown-single),)
|
|
||||||
$(Q)$(MAKE) -f /dev/null $(unknown-single)
|
|
||||||
endif
|
|
||||||
@:
|
|
||||||
|
|
||||||
ifeq ($(curdir-single),)
|
|
||||||
# Nothing to do in this directory. Do not include any .*.cmd file for speed-up
|
|
||||||
targets :=
|
|
||||||
else
|
|
||||||
targets += $(curdir-single)
|
|
||||||
endif
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
__build: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \
|
|
||||||
$(if $(KBUILD_MODULES), $(targets-for-modules)) \
|
|
||||||
$(subdir-ym) $(always-y)
|
|
||||||
@:
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Descending
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
PHONY += $(subdir-ym)
|
|
||||||
$(subdir-ym):
|
|
||||||
$(Q)$(MAKE) $(build)=$@ \
|
|
||||||
$(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \
|
|
||||||
need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \
|
|
||||||
need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1)
|
|
||||||
|
|
||||||
# Add FORCE to the prequisites of a target to force it to be always rebuilt.
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
PHONY += FORCE
|
|
||||||
|
|
||||||
FORCE:
|
|
||||||
|
|
||||||
# Read all saved command lines and dependencies for the $(targets) we
|
|
||||||
# may be building above, using $(if_changed{,_dep}). As an
|
|
||||||
# optimization, we don't need to read them if the target does not
|
|
||||||
# exist, we will rebuild anyway in that case.
|
|
||||||
|
|
||||||
existing-targets := $(wildcard $(sort $(targets)))
|
|
||||||
|
|
||||||
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
|
|
||||||
|
|
||||||
# Create directories for object files if they do not exist
|
|
||||||
obj-dirs := $(sort $(patsubst %/,%, $(dir $(targets))))
|
|
||||||
# If targets exist, their directories apparently exist. Skip mkdir.
|
|
||||||
existing-dirs := $(sort $(patsubst %/,%, $(dir $(existing-targets))))
|
|
||||||
obj-dirs := $(strip $(filter-out $(existing-dirs), $(obj-dirs)))
|
|
||||||
ifneq ($(obj-dirs),)
|
|
||||||
$(shell mkdir -p $(obj-dirs))
|
|
||||||
endif
|
|
||||||
|
|
||||||
.PHONY: $(PHONY)
|
|
||||||
@@ -1,523 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
# Backward compatibility
|
|
||||||
asflags-y += $(EXTRA_AFLAGS)
|
|
||||||
ccflags-y += $(EXTRA_CFLAGS)
|
|
||||||
cppflags-y += $(EXTRA_CPPFLAGS)
|
|
||||||
ldflags-y += $(EXTRA_LDFLAGS)
|
|
||||||
|
|
||||||
# flags that take effect in current and sub directories
|
|
||||||
KBUILD_AFLAGS += $(subdir-asflags-y)
|
|
||||||
KBUILD_CFLAGS += $(subdir-ccflags-y)
|
|
||||||
|
|
||||||
# Figure out what we need to build from the various variables
|
|
||||||
# ===========================================================================
|
|
||||||
|
|
||||||
# When an object is listed to be built compiled-in and modular,
|
|
||||||
# only build the compiled-in version
|
|
||||||
obj-m := $(filter-out $(obj-y),$(obj-m))
|
|
||||||
|
|
||||||
# Libraries are always collected in one lib file.
|
|
||||||
# Filter out objects already built-in
|
|
||||||
lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
|
|
||||||
|
|
||||||
# Subdirectories we need to descend into
|
|
||||||
subdir-ym := $(sort $(subdir-y) $(subdir-m) \
|
|
||||||
$(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m))))
|
|
||||||
|
|
||||||
# Handle objects in subdirs:
|
|
||||||
# - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and
|
|
||||||
# foo/modules.order
|
|
||||||
# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order
|
|
||||||
#
|
|
||||||
# Generate modules.order to determine modorder. Unfortunately, we don't have
|
|
||||||
# information about ordering between -y and -m subdirs. Just put -y's first.
|
|
||||||
|
|
||||||
ifdef need-modorder
|
|
||||||
obj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m))
|
|
||||||
else
|
|
||||||
obj-m := $(filter-out %/, $(obj-m))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef need-builtin
|
|
||||||
obj-y := $(patsubst %/, %/built-in.a, $(obj-y))
|
|
||||||
else
|
|
||||||
obj-y := $(filter-out %/, $(obj-y))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Expand $(foo-objs) $(foo-y) etc. by replacing their individuals
|
|
||||||
suffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s))))
|
|
||||||
# List composite targets that are constructed by combining other targets
|
|
||||||
multi-search = $(sort $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $m)))
|
|
||||||
# List primitive targets that are compiled from source files
|
|
||||||
real-search = $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $(call suffix-search, $m, $2, $3), $m))
|
|
||||||
|
|
||||||
# If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object
|
|
||||||
multi-obj-y := $(call multi-search, $(obj-y), .o, -objs -y)
|
|
||||||
multi-obj-m := $(call multi-search, $(obj-m), .o, -objs -y -m)
|
|
||||||
multi-obj-ym := $(multi-obj-y) $(multi-obj-m)
|
|
||||||
|
|
||||||
# Replace multi-part objects by their individual parts,
|
|
||||||
# including built-in.a from subdirectories
|
|
||||||
real-obj-y := $(call real-search, $(obj-y), .o, -objs -y)
|
|
||||||
real-obj-m := $(call real-search, $(obj-m), .o, -objs -y -m)
|
|
||||||
|
|
||||||
always-y += $(always-m)
|
|
||||||
|
|
||||||
# hostprogs-always-y += foo
|
|
||||||
# ... is a shorthand for
|
|
||||||
# hostprogs += foo
|
|
||||||
# always-y += foo
|
|
||||||
hostprogs += $(hostprogs-always-y) $(hostprogs-always-m)
|
|
||||||
always-y += $(hostprogs-always-y) $(hostprogs-always-m)
|
|
||||||
|
|
||||||
# userprogs-always-y is likewise.
|
|
||||||
userprogs += $(userprogs-always-y) $(userprogs-always-m)
|
|
||||||
always-y += $(userprogs-always-y) $(userprogs-always-m)
|
|
||||||
|
|
||||||
# DTB
|
|
||||||
# If CONFIG_OF_ALL_DTBS is enabled, all DT blobs are built
|
|
||||||
dtb-$(CONFIG_OF_ALL_DTBS) += $(dtb-)
|
|
||||||
|
|
||||||
# Composite DTB (i.e. DTB constructed by overlay)
|
|
||||||
multi-dtb-y := $(call multi-search, $(dtb-y), .dtb, -dtbs)
|
|
||||||
# Primitive DTB compiled from *.dts
|
|
||||||
real-dtb-y := $(call real-search, $(dtb-y), .dtb, -dtbs)
|
|
||||||
# Base DTB that overlay is applied onto (each first word of $(*-dtbs) expansion)
|
|
||||||
base-dtb-y := $(foreach m, $(multi-dtb-y), $(firstword $(call suffix-search, $m, .dtb, -dtbs)))
|
|
||||||
|
|
||||||
always-y += $(dtb-y)
|
|
||||||
|
|
||||||
ifneq ($(CHECK_DTBS),)
|
|
||||||
always-y += $(patsubst %.dtb,%.dt.yaml, $(real-dtb-y))
|
|
||||||
always-y += $(patsubst %.dtbo,%.dt.yaml, $(real-dtb-y))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Add subdir path
|
|
||||||
|
|
||||||
extra-y := $(addprefix $(obj)/,$(extra-y))
|
|
||||||
always-y := $(addprefix $(obj)/,$(always-y))
|
|
||||||
targets := $(addprefix $(obj)/,$(targets))
|
|
||||||
obj-m := $(addprefix $(obj)/,$(obj-m))
|
|
||||||
lib-y := $(addprefix $(obj)/,$(lib-y))
|
|
||||||
real-obj-y := $(addprefix $(obj)/,$(real-obj-y))
|
|
||||||
real-obj-m := $(addprefix $(obj)/,$(real-obj-m))
|
|
||||||
multi-obj-m := $(addprefix $(obj)/, $(multi-obj-m))
|
|
||||||
multi-dtb-y := $(addprefix $(obj)/, $(multi-dtb-y))
|
|
||||||
real-dtb-y := $(addprefix $(obj)/, $(real-dtb-y))
|
|
||||||
subdir-ym := $(addprefix $(obj)/,$(subdir-ym))
|
|
||||||
|
|
||||||
# Finds the multi-part object the current object will be linked into.
|
|
||||||
# If the object belongs to two or more multi-part objects, list them all.
|
|
||||||
modname-multi = $(sort $(foreach m,$(multi-obj-ym),\
|
|
||||||
$(if $(filter $*.o, $(call suffix-search, $m, .o, -objs -y -m)),$(m:.o=))))
|
|
||||||
|
|
||||||
__modname = $(if $(modname-multi),$(modname-multi),$(basetarget))
|
|
||||||
|
|
||||||
modname = $(subst $(space),:,$(__modname))
|
|
||||||
modfile = $(addprefix $(obj)/,$(__modname))
|
|
||||||
|
|
||||||
# target with $(obj)/ and its suffix stripped
|
|
||||||
target-stem = $(basename $(patsubst $(obj)/%,%,$@))
|
|
||||||
|
|
||||||
# These flags are needed for modversions and compiling, so we define them here
|
|
||||||
# $(modname_flags) defines KBUILD_MODNAME as the name of the module it will
|
|
||||||
# end up in (or would, if it gets compiled in)
|
|
||||||
name-fix-token = $(subst $(comma),_,$(subst -,_,$1))
|
|
||||||
name-fix = $(call stringify,$(call name-fix-token,$1))
|
|
||||||
basename_flags = -DKBUILD_BASENAME=$(call name-fix,$(basetarget))
|
|
||||||
modname_flags = -DKBUILD_MODNAME=$(call name-fix,$(modname)) \
|
|
||||||
-D__KBUILD_MODNAME=kmod_$(call name-fix-token,$(modname))
|
|
||||||
modfile_flags = -DKBUILD_MODFILE=$(call stringify,$(modfile))
|
|
||||||
|
|
||||||
_c_flags = $(filter-out $(CFLAGS_REMOVE_$(target-stem).o), \
|
|
||||||
$(filter-out $(ccflags-remove-y), \
|
|
||||||
$(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(ccflags-y)) \
|
|
||||||
$(CFLAGS_$(target-stem).o))
|
|
||||||
_a_flags = $(filter-out $(AFLAGS_REMOVE_$(target-stem).o), \
|
|
||||||
$(filter-out $(asflags-remove-y), \
|
|
||||||
$(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) $(asflags-y)) \
|
|
||||||
$(AFLAGS_$(target-stem).o))
|
|
||||||
_cpp_flags = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(target-stem).lds)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable gcov profiling flags for a file, directory or for all files depending
|
|
||||||
# on variables GCOV_PROFILE_obj.o, GCOV_PROFILE and CONFIG_GCOV_PROFILE_ALL
|
|
||||||
# (in this order)
|
|
||||||
#
|
|
||||||
ifeq ($(CONFIG_GCOV_KERNEL),y)
|
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
|
||||||
$(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
|
|
||||||
$(CFLAGS_GCOV))
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable address sanitizer flags for kernel except some files or directories
|
|
||||||
# we don't want to check (depends on variables KASAN_SANITIZE_obj.o, KASAN_SANITIZE)
|
|
||||||
#
|
|
||||||
ifeq ($(CONFIG_KASAN),y)
|
|
||||||
ifneq ($(CONFIG_KASAN_HW_TAGS),y)
|
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
|
||||||
$(KASAN_SANITIZE_$(basetarget).o)$(KASAN_SANITIZE)y), \
|
|
||||||
$(CFLAGS_KASAN), $(CFLAGS_KASAN_NOSANITIZE))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_UBSAN),y)
|
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
|
||||||
$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)), \
|
|
||||||
$(CFLAGS_UBSAN))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_KCOV),y)
|
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
|
||||||
$(KCOV_INSTRUMENT_$(basetarget).o)$(KCOV_INSTRUMENT)$(CONFIG_KCOV_INSTRUMENT_ALL)), \
|
|
||||||
$(CFLAGS_KCOV))
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable KCSAN flags except some files or directories we don't want to check
|
|
||||||
# (depends on variables KCSAN_SANITIZE_obj.o, KCSAN_SANITIZE)
|
|
||||||
#
|
|
||||||
ifeq ($(CONFIG_KCSAN),y)
|
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
|
||||||
$(KCSAN_SANITIZE_$(basetarget).o)$(KCSAN_SANITIZE)y), \
|
|
||||||
$(CFLAGS_KCSAN))
|
|
||||||
endif
|
|
||||||
|
|
||||||
# $(srctree)/$(src) for including checkin headers from generated source files
|
|
||||||
# $(objtree)/$(obj) for including generated headers from checkin source files
|
|
||||||
ifeq ($(KBUILD_EXTMOD),)
|
|
||||||
ifdef building_out_of_srctree
|
|
||||||
_c_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
|
|
||||||
_a_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
|
|
||||||
_cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
part-of-module = $(if $(filter $(basename $@).o, $(real-obj-m)),y)
|
|
||||||
quiet_modtag = $(if $(part-of-module),[M], )
|
|
||||||
|
|
||||||
modkern_cflags = \
|
|
||||||
$(if $(part-of-module), \
|
|
||||||
$(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
|
|
||||||
$(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL) $(modfile_flags))
|
|
||||||
|
|
||||||
modkern_aflags = $(if $(part-of-module), \
|
|
||||||
$(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE), \
|
|
||||||
$(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL))
|
|
||||||
|
|
||||||
c_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
|
||||||
-include $(srctree)/include/linux/compiler_types.h \
|
|
||||||
$(_c_flags) $(modkern_cflags) \
|
|
||||||
$(basename_flags) $(modname_flags)
|
|
||||||
|
|
||||||
a_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
|
||||||
$(_a_flags) $(modkern_aflags)
|
|
||||||
|
|
||||||
cpp_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
|
||||||
$(_cpp_flags)
|
|
||||||
|
|
||||||
ld_flags = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F))
|
|
||||||
|
|
||||||
DTC_INCLUDE += $(srctree)/scripts/dtc/include-prefixes
|
|
||||||
|
|
||||||
dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \
|
|
||||||
$(addprefix -I,$(DTC_INCLUDE)) \
|
|
||||||
$(DTC_CPP_FLAGS) \
|
|
||||||
-undef -D__DTS__
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_LTO_CLANG),y)
|
|
||||||
# With CONFIG_LTO_CLANG, .o files in modules might be LLVM bitcode, so we
|
|
||||||
# need to run LTO to compile them into native code (.lto.o) before further
|
|
||||||
# processing.
|
|
||||||
mod-prelink-ext := .lto
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Objtool arguments are also needed for modfinal with LTO, so we define
|
|
||||||
# then here to avoid duplication.
|
|
||||||
objtool_args = \
|
|
||||||
$(if $(CONFIG_UNWINDER_ORC),orc generate,check) \
|
|
||||||
$(if $(part-of-module), --module) \
|
|
||||||
$(if $(CONFIG_FRAME_POINTER),, --no-fp) \
|
|
||||||
$(if $(CONFIG_GCOV_KERNEL)$(CONFIG_LTO_CLANG), --no-unreachable)\
|
|
||||||
$(if $(CONFIG_RETPOLINE), --retpoline) \
|
|
||||||
$(if $(CONFIG_X86_SMAP), --uaccess) \
|
|
||||||
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)
|
|
||||||
|
|
||||||
# Useful for describing the dependency of composite objects
|
|
||||||
# Usage:
|
|
||||||
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
|
|
||||||
define multi_depend
|
|
||||||
$(foreach m, $(notdir $1), \
|
|
||||||
$(eval $(obj)/$m: \
|
|
||||||
$(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
|
|
||||||
endef
|
|
||||||
|
|
||||||
quiet_cmd_copy = COPY $@
|
|
||||||
cmd_copy = cp $< $@
|
|
||||||
|
|
||||||
# Shipped files
|
|
||||||
# ===========================================================================
|
|
||||||
# 'cp' preserves permissions. If you use it to copy a file in read-only srctree,
|
|
||||||
# the copy would be read-only as well, leading to an error when executing the
|
|
||||||
# rule next time. Use 'cat' instead in order to generate a writable file.
|
|
||||||
|
|
||||||
quiet_cmd_shipped = SHIPPED $@
|
|
||||||
cmd_shipped = cat $< > $@
|
|
||||||
|
|
||||||
$(obj)/%: $(src)/%_shipped
|
|
||||||
$(call cmd,shipped)
|
|
||||||
|
|
||||||
# Commands useful for building a boot image
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# Use as following:
|
|
||||||
#
|
|
||||||
# target: source(s) FORCE
|
|
||||||
# $(if_changed,ld/objcopy/gzip)
|
|
||||||
#
|
|
||||||
# and add target to 'targets' so that we know we have to
|
|
||||||
# read in the saved command line
|
|
||||||
|
|
||||||
# Linking
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
quiet_cmd_ld = LD $@
|
|
||||||
cmd_ld = $(LD) $(ld_flags) $(real-prereqs) -o $@
|
|
||||||
|
|
||||||
# Archive
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
quiet_cmd_ar = AR $@
|
|
||||||
cmd_ar = rm -f $@; $(AR) cDPrsT $@ $(real-prereqs)
|
|
||||||
|
|
||||||
# Objcopy
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
quiet_cmd_objcopy = OBJCOPY $@
|
|
||||||
cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
|
|
||||||
|
|
||||||
# Gzip
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
quiet_cmd_gzip = GZIP $@
|
|
||||||
cmd_gzip = cat $(real-prereqs) | $(KGZIP) -n -f -9 > $@
|
|
||||||
|
|
||||||
# DTC
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
DTC ?= $(objtree)/scripts/dtc/dtc
|
|
||||||
DTC_FLAGS += -Wno-interrupt_provider
|
|
||||||
|
|
||||||
# Disable noisy checks by default
|
|
||||||
ifeq ($(findstring 1,$(KBUILD_EXTRA_WARN)),)
|
|
||||||
DTC_FLAGS += -Wno-unit_address_vs_reg \
|
|
||||||
-Wno-unit_address_format \
|
|
||||||
-Wno-avoid_unnecessary_addr_size \
|
|
||||||
-Wno-alias_paths \
|
|
||||||
-Wno-graph_child_address \
|
|
||||||
-Wno-simple_bus_reg \
|
|
||||||
-Wno-unique_unit_address
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(findstring 2,$(KBUILD_EXTRA_WARN)),)
|
|
||||||
DTC_FLAGS += -Wnode_name_chars_strict \
|
|
||||||
-Wproperty_name_chars_strict \
|
|
||||||
-Winterrupt_provider
|
|
||||||
endif
|
|
||||||
|
|
||||||
DTC_FLAGS += $(DTC_FLAGS_$(basetarget))
|
|
||||||
|
|
||||||
# Set -@ if the target is a base DTB that overlay is applied onto
|
|
||||||
DTC_FLAGS += $(if $(filter $(patsubst $(obj)/%,%,$@), $(base-dtb-y)), -@)
|
|
||||||
|
|
||||||
# Generate an assembly file to wrap the output of the device tree compiler
|
|
||||||
quiet_cmd_dt_S_dtb= DTB $@
|
|
||||||
cmd_dt_S_dtb= \
|
|
||||||
{ \
|
|
||||||
echo '\#include <asm-generic/vmlinux.lds.h>'; \
|
|
||||||
echo '.section .dtb.init.rodata,"a"'; \
|
|
||||||
echo '.balign STRUCT_ALIGNMENT'; \
|
|
||||||
echo '.global __dtb_$(subst -,_,$(*F))_begin'; \
|
|
||||||
echo '__dtb_$(subst -,_,$(*F))_begin:'; \
|
|
||||||
echo '.incbin "$<" '; \
|
|
||||||
echo '__dtb_$(subst -,_,$(*F))_end:'; \
|
|
||||||
echo '.global __dtb_$(subst -,_,$(*F))_end'; \
|
|
||||||
echo '.balign STRUCT_ALIGNMENT'; \
|
|
||||||
} > $@
|
|
||||||
|
|
||||||
$(obj)/%.dtb.S: $(obj)/%.dtb FORCE
|
|
||||||
$(call if_changed,dt_S_dtb)
|
|
||||||
|
|
||||||
quiet_cmd_dtc = DTC $@
|
|
||||||
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
|
|
||||||
$(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
|
||||||
$(DTC) -o $@ -b 0 \
|
|
||||||
$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
|
|
||||||
-d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
|
||||||
cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
|
||||||
|
|
||||||
$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
|
|
||||||
$(call if_changed_dep,dtc)
|
|
||||||
|
|
||||||
$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
|
|
||||||
$(call if_changed_dep,dtc)
|
|
||||||
|
|
||||||
quiet_cmd_fdtoverlay = DTOVL $@
|
|
||||||
cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(real-prereqs)
|
|
||||||
|
|
||||||
$(multi-dtb-y): FORCE
|
|
||||||
$(call if_changed,fdtoverlay)
|
|
||||||
$(call multi_depend, $(multi-dtb-y), .dtb, -dtbs)
|
|
||||||
|
|
||||||
DT_CHECKER ?= dt-validate
|
|
||||||
DT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),,-m)
|
|
||||||
DT_BINDING_DIR := Documentation/devicetree/bindings
|
|
||||||
# DT_TMP_SCHEMA may be overridden from Documentation/devicetree/bindings/Makefile
|
|
||||||
DT_TMP_SCHEMA ?= $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
|
|
||||||
|
|
||||||
quiet_cmd_dtb_check = CHECK $@
|
|
||||||
cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@
|
|
||||||
|
|
||||||
define rule_dtc
|
|
||||||
$(call cmd_and_fixdep,dtc)
|
|
||||||
$(call cmd,dtb_check)
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
|
|
||||||
$(call if_changed_rule,dtc)
|
|
||||||
|
|
||||||
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
|
|
||||||
|
|
||||||
# Bzip2
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Bzip2 and LZMA do not include size in file... so we have to fake that;
|
|
||||||
# append the size as a 32-bit littleendian number as gzip does.
|
|
||||||
size_append = printf $(shell \
|
|
||||||
dec_size=0; \
|
|
||||||
for F in $(real-prereqs); do \
|
|
||||||
fsize=$$($(CONFIG_SHELL) $(srctree)/scripts/file-size.sh $$F); \
|
|
||||||
dec_size=$$(expr $$dec_size + $$fsize); \
|
|
||||||
done; \
|
|
||||||
printf "%08x\n" $$dec_size | \
|
|
||||||
sed 's/\(..\)/\1 /g' | { \
|
|
||||||
read ch0 ch1 ch2 ch3; \
|
|
||||||
for ch in $$ch3 $$ch2 $$ch1 $$ch0; do \
|
|
||||||
printf '%s%03o' '\\' $$((0x$$ch)); \
|
|
||||||
done; \
|
|
||||||
} \
|
|
||||||
)
|
|
||||||
|
|
||||||
quiet_cmd_bzip2 = BZIP2 $@
|
|
||||||
cmd_bzip2 = { cat $(real-prereqs) | $(KBZIP2) -9; $(size_append); } > $@
|
|
||||||
|
|
||||||
# Lzma
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
quiet_cmd_lzma = LZMA $@
|
|
||||||
cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@
|
|
||||||
|
|
||||||
quiet_cmd_lzo = LZO $@
|
|
||||||
cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@
|
|
||||||
|
|
||||||
quiet_cmd_lz4 = LZ4 $@
|
|
||||||
cmd_lz4 = { cat $(real-prereqs) | $(LZ4) -l -c1 stdin stdout; \
|
|
||||||
$(size_append); } > $@
|
|
||||||
|
|
||||||
# U-Boot mkimage
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
MKIMAGE := $(srctree)/scripts/mkuboot.sh
|
|
||||||
|
|
||||||
# SRCARCH just happens to match slightly more than ARCH (on sparc), so reduces
|
|
||||||
# the number of overrides in arch makefiles
|
|
||||||
UIMAGE_ARCH ?= $(SRCARCH)
|
|
||||||
UIMAGE_COMPRESSION ?= $(if $(2),$(2),none)
|
|
||||||
UIMAGE_OPTS-y ?=
|
|
||||||
UIMAGE_TYPE ?= kernel
|
|
||||||
UIMAGE_LOADADDR ?= arch_must_set_this
|
|
||||||
UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)
|
|
||||||
UIMAGE_NAME ?= 'Linux-$(KERNELRELEASE)'
|
|
||||||
|
|
||||||
quiet_cmd_uimage = UIMAGE $@
|
|
||||||
cmd_uimage = $(BASH) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \
|
|
||||||
-C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \
|
|
||||||
-T $(UIMAGE_TYPE) \
|
|
||||||
-a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \
|
|
||||||
-n $(UIMAGE_NAME) -d $< $@
|
|
||||||
|
|
||||||
# XZ
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# Use xzkern to compress the kernel image and xzmisc to compress other things.
|
|
||||||
#
|
|
||||||
# xzkern uses a big LZMA2 dictionary since it doesn't increase memory usage
|
|
||||||
# of the kernel decompressor. A BCJ filter is used if it is available for
|
|
||||||
# the target architecture. xzkern also appends uncompressed size of the data
|
|
||||||
# using size_append. The .xz format has the size information available at
|
|
||||||
# the end of the file too, but it's in more complex format and it's good to
|
|
||||||
# avoid changing the part of the boot code that reads the uncompressed size.
|
|
||||||
# Note that the bytes added by size_append will make the xz tool think that
|
|
||||||
# the file is corrupt. This is expected.
|
|
||||||
#
|
|
||||||
# xzmisc doesn't use size_append, so it can be used to create normal .xz
|
|
||||||
# files. xzmisc uses smaller LZMA2 dictionary than xzkern, because a very
|
|
||||||
# big dictionary would increase the memory usage too much in the multi-call
|
|
||||||
# decompression mode. A BCJ filter isn't used either.
|
|
||||||
quiet_cmd_xzkern = XZKERN $@
|
|
||||||
cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \
|
|
||||||
$(size_append); } > $@
|
|
||||||
|
|
||||||
quiet_cmd_xzmisc = XZMISC $@
|
|
||||||
cmd_xzmisc = cat $(real-prereqs) | $(XZ) --check=crc32 --lzma2=dict=1MiB > $@
|
|
||||||
|
|
||||||
# ZSTD
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
# Appends the uncompressed size of the data using size_append. The .zst
|
|
||||||
# format has the size information available at the beginning of the file too,
|
|
||||||
# but it's in a more complex format and it's good to avoid changing the part
|
|
||||||
# of the boot code that reads the uncompressed size.
|
|
||||||
#
|
|
||||||
# Note that the bytes added by size_append will make the zstd tool think that
|
|
||||||
# the file is corrupt. This is expected.
|
|
||||||
#
|
|
||||||
# zstd uses a maximum window size of 8 MB. zstd22 uses a maximum window size of
|
|
||||||
# 128 MB. zstd22 is used for kernel compression because it is decompressed in a
|
|
||||||
# single pass, so zstd doesn't need to allocate a window buffer. When streaming
|
|
||||||
# decompression is used, like initramfs decompression, zstd22 should likely not
|
|
||||||
# be used because it would require zstd to allocate a 128 MB buffer.
|
|
||||||
|
|
||||||
quiet_cmd_zstd = ZSTD $@
|
|
||||||
cmd_zstd = { cat $(real-prereqs) | $(ZSTD) -19; $(size_append); } > $@
|
|
||||||
|
|
||||||
quiet_cmd_zstd22 = ZSTD22 $@
|
|
||||||
cmd_zstd22 = { cat $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@
|
|
||||||
|
|
||||||
# ASM offsets
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Default sed regexp - multiline due to syntax constraints
|
|
||||||
#
|
|
||||||
# Use [:space:] because LLVM's integrated assembler inserts <tab> around
|
|
||||||
# the .ascii directive whereas GCC keeps the <space> as-is.
|
|
||||||
define sed-offsets
|
|
||||||
's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:; \
|
|
||||||
/^->/{s:->#\(.*\):/* \1 */:; \
|
|
||||||
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
|
|
||||||
s:->::; p;}'
|
|
||||||
endef
|
|
||||||
|
|
||||||
# Use filechk to avoid rebuilds when a header changes, but the resulting file
|
|
||||||
# does not
|
|
||||||
define filechk_offsets
|
|
||||||
echo "#ifndef $2"; \
|
|
||||||
echo "#define $2"; \
|
|
||||||
echo "/*"; \
|
|
||||||
echo " * DO NOT MODIFY."; \
|
|
||||||
echo " *"; \
|
|
||||||
echo " * This file was generated by Kbuild"; \
|
|
||||||
echo " */"; \
|
|
||||||
echo ""; \
|
|
||||||
sed -ne $(sed-offsets) < $<; \
|
|
||||||
echo ""; \
|
|
||||||
echo "#endif"
|
|
||||||
endef
|
|
||||||
Reference in New Issue
Block a user