cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

Makefile.build (16514B)


      1# SPDX-License-Identifier: GPL-2.0
      2# ==========================================================================
      3# Building
      4# ==========================================================================
      5
      6src := $(obj)
      7
      8PHONY := __build
      9__build:
     10
     11# Init all relevant variables used in kbuild files so
     12# 1) they have correct type
     13# 2) they do not inherit any value from the environment
     14obj-y :=
     15obj-m :=
     16lib-y :=
     17lib-m :=
     18always-y :=
     19always-m :=
     20targets :=
     21subdir-y :=
     22subdir-m :=
     23EXTRA_AFLAGS   :=
     24EXTRA_CFLAGS   :=
     25EXTRA_CPPFLAGS :=
     26EXTRA_LDFLAGS  :=
     27asflags-y  :=
     28ccflags-y  :=
     29cppflags-y :=
     30ldflags-y  :=
     31
     32subdir-asflags-y :=
     33subdir-ccflags-y :=
     34
     35# Read auto.conf if it exists, otherwise ignore
     36-include include/config/auto.conf
     37
     38include $(srctree)/scripts/Kbuild.include
     39include $(srctree)/scripts/Makefile.compiler
     40
     41# The filename Kbuild has precedence over Makefile
     42kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
     43include $(or $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Makefile)
     44
     45include $(srctree)/scripts/Makefile.lib
     46
     47# Do not include hostprogs rules unless needed.
     48# $(sort ...) is used here to remove duplicated words and excessive spaces.
     49hostprogs := $(sort $(hostprogs))
     50ifneq ($(hostprogs),)
     51include $(srctree)/scripts/Makefile.host
     52endif
     53
     54# Do not include userprogs rules unless needed.
     55# $(sort ...) is used here to remove duplicated words and excessive spaces.
     56userprogs := $(sort $(userprogs))
     57ifneq ($(userprogs),)
     58include $(srctree)/scripts/Makefile.userprogs
     59endif
     60
     61ifndef obj
     62$(warning kbuild: Makefile.build is included improperly)
     63endif
     64
     65ifeq ($(need-modorder),)
     66ifneq ($(obj-m),)
     67$(warning $(patsubst %.o,'%.ko',$(obj-m)) will not be built even though obj-m is specified.)
     68$(warning You cannot use subdir-y/m to visit a module Makefile. Use obj-y/m instead.)
     69endif
     70endif
     71
     72# ===========================================================================
     73
     74# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
     75subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
     76subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
     77
     78targets-for-builtin := $(extra-y)
     79
     80ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
     81targets-for-builtin += $(obj)/lib.a
     82endif
     83
     84ifdef need-builtin
     85targets-for-builtin += $(obj)/built-in.a
     86endif
     87
     88targets-for-modules := $(foreach x, o mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usyms), \
     89				$(patsubst %.o, %.$x, $(filter %.o, $(obj-m))))
     90
     91ifdef need-modorder
     92targets-for-modules += $(obj)/modules.order
     93endif
     94
     95targets += $(targets-for-builtin) $(targets-for-modules)
     96
     97# Linus' kernel sanity checking tool
     98ifeq ($(KBUILD_CHECKSRC),1)
     99  quiet_cmd_checksrc       = CHECK   $<
    100        cmd_checksrc       = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
    101else ifeq ($(KBUILD_CHECKSRC),2)
    102  quiet_cmd_force_checksrc = CHECK   $<
    103        cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
    104endif
    105
    106ifneq ($(KBUILD_EXTRA_WARN),)
    107  cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $<
    108endif
    109
    110# Compile C sources (.c)
    111# ---------------------------------------------------------------------------
    112
    113quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
    114      cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS) $(CC_FLAGS_LTO), $(c_flags)) -fverbose-asm -S -o $@ $<
    115
    116$(obj)/%.s: $(src)/%.c FORCE
    117	$(call if_changed_dep,cc_s_c)
    118
    119quiet_cmd_cpp_i_c = CPP $(quiet_modtag) $@
    120cmd_cpp_i_c       = $(CPP) $(c_flags) -o $@ $<
    121
    122$(obj)/%.i: $(src)/%.c FORCE
    123	$(call if_changed_dep,cpp_i_c)
    124
    125genksyms = scripts/genksyms/genksyms		\
    126	$(if $(1), -T $(2))			\
    127	$(if $(KBUILD_PRESERVE), -p)		\
    128	-r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null)
    129
    130# These mirror gensymtypes_S and co below, keep them in synch.
    131cmd_gensymtypes_c = $(CPP) -D__GENKSYMS__ $(c_flags) $< | $(genksyms)
    132
    133quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
    134      cmd_cc_symtypes_c = $(call cmd_gensymtypes_c,true,$@) >/dev/null
    135
    136$(obj)/%.symtypes : $(src)/%.c FORCE
    137	$(call cmd,cc_symtypes_c)
    138
    139# LLVM assembly
    140# Generate .ll files from .c
    141quiet_cmd_cc_ll_c = CC $(quiet_modtag)  $@
    142      cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $<
    143
    144$(obj)/%.ll: $(src)/%.c FORCE
    145	$(call if_changed_dep,cc_ll_c)
    146
    147# C (.c) files
    148# The C file is compiled and updated dependency information is generated.
    149# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
    150
    151is-single-obj-m = $(and $(part-of-module),$(filter $@, $(obj-m)),y)
    152
    153# When a module consists of a single object, there is no reason to keep LLVM IR.
    154# Make $(LD) covert LLVM IR to ELF here.
    155ifdef CONFIG_LTO_CLANG
    156cmd_ld_single_m = $(if $(is-single-obj-m), ; $(LD) $(ld_flags) -r -o $(tmp-target) $@; mv $(tmp-target) $@)
    157endif
    158
    159quiet_cmd_cc_o_c = CC $(quiet_modtag)  $@
    160      cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< \
    161		$(cmd_ld_single_m) \
    162		$(cmd_objtool)
    163
    164ifdef CONFIG_MODVERSIONS
    165# When module versioning is enabled the following steps are executed:
    166# o compile a <file>.o from <file>.c
    167# o if <file>.o doesn't contain a __ksymtab version, i.e. does
    168#   not export symbols, it's done.
    169# o otherwise, we calculate symbol versions using the good old
    170#   genksyms on the preprocessed source and dump them into the .cmd file.
    171# o modpost will extract versions from that file and create *.c files that will
    172#   be compiled and linked to the kernel and/or modules.
    173
    174gen_symversions =								\
    175	if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then			\
    176		$(call cmd_gensymtypes_$(1),$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
    177			>> $(dot-target).cmd;					\
    178	fi
    179
    180cmd_gen_symversions_c =	$(call gen_symversions,c)
    181
    182endif
    183
    184ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
    185# compiler will not generate __mcount_loc use recordmcount or recordmcount.pl
    186ifdef BUILD_C_RECORDMCOUNT
    187ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
    188  RECORDMCOUNT_FLAGS = -w
    189endif
    190# Due to recursion, we must skip empty.o.
    191# The empty.o file is created in the make process in order to determine
    192# the target endianness and word size. It is made before all other C
    193# files, including recordmcount.
    194sub_cmd_record_mcount =					\
    195	if [ $(@) != "scripts/mod/empty.o" ]; then	\
    196		$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";	\
    197	fi;
    198recordmcount_source := $(srctree)/scripts/recordmcount.c \
    199		    $(srctree)/scripts/recordmcount.h
    200else
    201sub_cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
    202	"$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
    203	"$(if $(CONFIG_64BIT),64,32)" \
    204	"$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \
    205	"$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \
    206	"$(if $(part-of-module),1,0)" "$(@)";
    207recordmcount_source := $(srctree)/scripts/recordmcount.pl
    208endif # BUILD_C_RECORDMCOUNT
    209cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)),	\
    210	$(sub_cmd_record_mcount))
    211endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
    212
    213# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
    214# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
    215# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
    216
    217is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y)
    218
    219$(obj)/%.o: objtool-enabled = $(if $(is-standard-object),$(if $(delay-objtool),$(is-single-obj-m),y))
    220
    221ifdef CONFIG_TRIM_UNUSED_KSYMS
    222cmd_gen_ksymdeps = \
    223	$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
    224endif
    225
    226cmd_check_local_export = $(srctree)/scripts/check-local-export $@
    227
    228define rule_cc_o_c
    229	$(call cmd_and_fixdep,cc_o_c)
    230	$(call cmd,gen_ksymdeps)
    231	$(call cmd,check_local_export)
    232	$(call cmd,checksrc)
    233	$(call cmd,checkdoc)
    234	$(call cmd,gen_objtooldep)
    235	$(call cmd,gen_symversions_c)
    236	$(call cmd,record_mcount)
    237endef
    238
    239define rule_as_o_S
    240	$(call cmd_and_fixdep,as_o_S)
    241	$(call cmd,gen_ksymdeps)
    242	$(call cmd,check_local_export)
    243	$(call cmd,gen_objtooldep)
    244	$(call cmd,gen_symversions_S)
    245endef
    246
    247# Built-in and composite module parts
    248$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
    249	$(call if_changed_rule,cc_o_c)
    250	$(call cmd,force_checksrc)
    251
    252# To make this rule robust against "Argument list too long" error,
    253# ensure to add $(obj)/ prefix by a shell command.
    254cmd_mod = printf '%s\n' $(call real-search, $*.o, .o, -objs -y -m) | \
    255	$(AWK) '!x[$$0]++ { print("$(obj)/"$$0) }' > $@
    256
    257$(obj)/%.mod: FORCE
    258	$(call if_changed,mod)
    259
    260# List module undefined symbols
    261cmd_undefined_syms = $(NM) $< | sed -n 's/^  *U //p' > $@
    262
    263$(obj)/%.usyms: $(obj)/%.o FORCE
    264	$(call if_changed,undefined_syms)
    265
    266quiet_cmd_cc_lst_c = MKLST   $@
    267      cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
    268		     $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
    269				     System.map $(OBJDUMP) > $@
    270
    271$(obj)/%.lst: $(src)/%.c FORCE
    272	$(call if_changed_dep,cc_lst_c)
    273
    274# Compile assembler sources (.S)
    275# ---------------------------------------------------------------------------
    276
    277# .S file exports must have their C prototypes defined in asm/asm-prototypes.h
    278# or a file that it includes, in order to get versioned symbols. We build a
    279# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from
    280# the .S file (with trailing ';'), and run genksyms on that, to extract vers.
    281#
    282# This is convoluted. The .S file must first be preprocessed to run guards and
    283# expand names, then the resulting exports must be constructed into plain
    284# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
    285# to make the genksyms input.
    286#
    287# These mirror gensymtypes_c and co above, keep them in synch.
    288cmd_gensymtypes_S =                                                         \
    289   { echo "\#include <linux/kernel.h>" ;                                    \
    290     echo "\#include <asm/asm-prototypes.h>" ;                              \
    291    $(CPP) $(a_flags) $< |                                                  \
    292     grep "\<___EXPORT_SYMBOL\>" |                                          \
    293     sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
    294    $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms)
    295
    296quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
    297      cmd_cc_symtypes_S = $(call cmd_gensymtypes_S,true,$@) >/dev/null
    298
    299$(obj)/%.symtypes : $(src)/%.S FORCE
    300	$(call cmd,cc_symtypes_S)
    301
    302
    303quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
    304cmd_cpp_s_S       = $(CPP) $(a_flags) -o $@ $<
    305
    306$(obj)/%.s: $(src)/%.S FORCE
    307	$(call if_changed_dep,cpp_s_S)
    308
    309quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
    310      cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< $(cmd_objtool)
    311
    312ifdef CONFIG_ASM_MODVERSIONS
    313
    314# versioning matches the C process described above, with difference that
    315# we parse asm-prototypes.h C header to get function definitions.
    316
    317cmd_gen_symversions_S = $(call gen_symversions,S)
    318
    319endif
    320
    321$(obj)/%.o: $(src)/%.S FORCE
    322	$(call if_changed_rule,as_o_S)
    323
    324targets += $(filter-out $(subdir-builtin), $(real-obj-y))
    325targets += $(filter-out $(subdir-modorder), $(real-obj-m))
    326targets += $(real-dtb-y) $(lib-y) $(always-y) $(MAKECMDGOALS)
    327
    328# Linker scripts preprocessor (.lds.S -> .lds)
    329# ---------------------------------------------------------------------------
    330quiet_cmd_cpp_lds_S = LDS     $@
    331      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
    332	                     -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
    333
    334$(obj)/%.lds: $(src)/%.lds.S FORCE
    335	$(call if_changed_dep,cpp_lds_S)
    336
    337# ASN.1 grammar
    338# ---------------------------------------------------------------------------
    339quiet_cmd_asn1_compiler = ASN.1   $(basename $@).[ch]
    340      cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
    341				$(basename $@).c $(basename $@).h
    342
    343$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
    344	$(call cmd,asn1_compiler)
    345
    346# Build the compiled-in targets
    347# ---------------------------------------------------------------------------
    348
    349# To build objects in subdirs, we need to descend into the directories
    350$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
    351$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
    352
    353#
    354# Rule to compile a set of .o files into one .a file (without symbol table)
    355#
    356# To make this rule robust against "Argument list too long" error,
    357# remove $(obj)/ prefix, and restore it by a shell command.
    358
    359quiet_cmd_ar_builtin = AR      $@
    360      cmd_ar_builtin = rm -f $@; \
    361		echo $(patsubst $(obj)/%,%,$(real-prereqs)) | \
    362		sed -E 's:([^ ]+):$(obj)/\1:g' | \
    363		xargs $(AR) cDPrST $@
    364
    365$(obj)/built-in.a: $(real-obj-y) FORCE
    366	$(call if_changed,ar_builtin)
    367
    368#
    369# Rule to create modules.order file
    370#
    371# Create commands to either record .ko file or cat modules.order from
    372# a subdirectory
    373# Add $(obj-m) as the prerequisite to avoid updating the timestamp of
    374# modules.order unless contained modules are updated.
    375
    376cmd_modules_order = { $(foreach m, $(real-prereqs), \
    377	$(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \
    378	| $(AWK) '!x[$$0]++' - > $@
    379
    380$(obj)/modules.order: $(obj-m) FORCE
    381	$(call if_changed,modules_order)
    382
    383#
    384# Rule to compile a set of .o files into one .a file (with symbol table)
    385#
    386
    387$(obj)/lib.a: $(lib-y) FORCE
    388	$(call if_changed,ar)
    389
    390quiet_cmd_ld_multi_m = LD [M]  $@
    391      cmd_ld_multi_m = $(LD) $(ld_flags) -r -o $@ @$(patsubst %.o,%.mod,$@) $(cmd_objtool)
    392
    393define rule_ld_multi_m
    394	$(call cmd_and_savecmd,ld_multi_m)
    395	$(call cmd,gen_objtooldep)
    396endef
    397
    398$(multi-obj-m): objtool-enabled := $(delay-objtool)
    399$(multi-obj-m): part-of-module := y
    400$(multi-obj-m): %.o: %.mod FORCE
    401	$(call if_changed_rule,ld_multi_m)
    402$(call multi_depend, $(multi-obj-m), .o, -objs -y -m)
    403
    404targets := $(filter-out $(PHONY), $(targets))
    405
    406# Add intermediate targets:
    407# When building objects with specific suffix patterns, add intermediate
    408# targets that the final targets are derived from.
    409intermediate_targets = $(foreach sfx, $(2), \
    410				$(patsubst %$(strip $(1)),%$(sfx), \
    411					$(filter %$(strip $(1)), $(targets))))
    412# %.asn1.o <- %.asn1.[ch] <- %.asn1
    413# %.dtb.o <- %.dtb.S <- %.dtb <- %.dts
    414# %.lex.o <- %.lex.c <- %.l
    415# %.tab.o <- %.tab.[ch] <- %.y
    416targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \
    417	   $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \
    418	   $(call intermediate_targets, .lex.o, .lex.c) \
    419	   $(call intermediate_targets, .tab.o, .tab.c .tab.h)
    420
    421# Build
    422# ---------------------------------------------------------------------------
    423
    424ifdef single-build
    425
    426KBUILD_SINGLE_TARGETS := $(filter $(obj)/%, $(KBUILD_SINGLE_TARGETS))
    427
    428curdir-single := $(sort $(foreach x, $(KBUILD_SINGLE_TARGETS), \
    429			$(if $(filter $(x) $(basename $(x)).o, $(targets)), $(x))))
    430
    431# Handle single targets without any rule: show "Nothing to be done for ..." or
    432# "No rule to make target ..." depending on whether the target exists.
    433unknown-single := $(filter-out $(addsuffix /%, $(subdir-ym)), \
    434			$(filter-out $(curdir-single), $(KBUILD_SINGLE_TARGETS)))
    435
    436single-subdirs := $(foreach d, $(subdir-ym), \
    437			$(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d)))
    438
    439__build: $(curdir-single) $(single-subdirs)
    440ifneq ($(unknown-single),)
    441	$(Q)$(MAKE) -f /dev/null $(unknown-single)
    442endif
    443	@:
    444
    445ifeq ($(curdir-single),)
    446# Nothing to do in this directory. Do not include any .*.cmd file for speed-up
    447targets :=
    448else
    449targets += $(curdir-single)
    450endif
    451
    452else
    453
    454__build: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \
    455	 $(if $(KBUILD_MODULES), $(targets-for-modules)) \
    456	 $(subdir-ym) $(always-y)
    457	@:
    458
    459endif
    460
    461# Descending
    462# ---------------------------------------------------------------------------
    463
    464PHONY += $(subdir-ym)
    465$(subdir-ym):
    466	$(Q)$(MAKE) $(build)=$@ \
    467	$(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \
    468	need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \
    469	need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1)
    470
    471# Add FORCE to the prequisites of a target to force it to be always rebuilt.
    472# ---------------------------------------------------------------------------
    473
    474PHONY += FORCE
    475
    476FORCE:
    477
    478# Read all saved command lines and dependencies for the $(targets) we
    479# may be building above, using $(if_changed{,_dep}). As an
    480# optimization, we don't need to read them if the target does not
    481# exist, we will rebuild anyway in that case.
    482
    483existing-targets := $(wildcard $(sort $(targets)))
    484
    485-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
    486
    487# Create directories for object files if they do not exist
    488obj-dirs := $(sort $(patsubst %/,%, $(dir $(targets))))
    489# If targets exist, their directories apparently exist. Skip mkdir.
    490existing-dirs := $(sort $(patsubst %/,%, $(dir $(existing-targets))))
    491obj-dirs := $(strip $(filter-out $(existing-dirs), $(obj-dirs)))
    492ifneq ($(obj-dirs),)
    493$(shell mkdir -p $(obj-dirs))
    494endif
    495
    496.PHONY: $(PHONY)