Kbuild.include 5.1 KB
Newer Older
S
Sam Ravnborg 已提交
1 2 3 4 5
####
# kbuild: Generic definitions

# Convinient variables
comma   := ,
6
squote  := '
S
Sam Ravnborg 已提交
7 8 9 10 11 12 13 14
empty   :=
space   := $(empty) $(empty)

###
# The temporary file to save gcc -MD generated dependencies must not
# contain a comma
depfile = $(subst $(comma),_,$(@D)/.$(@F).d)

15 16 17 18
###
# Escape single quote for use in echo statements
escsq = $(subst $(squote),'\$(squote)',$1)

S
Sam Ravnborg 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
###
# filechk is used to check if the content of a generated file is updated.
# Sample usage:
# define filechk_sample
#	echo $KERNELRELEASE
# endef
# version.h : Makefile
#	$(call filechk,sample)
# The rule defined shall write to stdout the content of the new file.
# The existing file will be compared with the new one.
# - If no file exist it is created
# - If the content differ the new file is used
# - If they are equal no change, and no timestamp update
# - stdin is piped in from the first prerequisite ($<) so one has
#   to specify a valid file as first prerequisite (often the kbuild file)
define filechk
	$(Q)set -e;				\
	echo '  CHK     $@';			\
	mkdir -p $(dir $@);			\
	$(filechk_$(1)) < $< > $@.tmp;		\
	if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
		rm -f $@.tmp;			\
	else					\
		echo '  UPD     $@';		\
		mv -f $@.tmp $@;		\
	fi
endef

47
######
48
# gcc support functions
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
# See documentation in Documentation/kbuild/makefiles.txt

# as-option
# Usage: cflags-y += $(call as-option, -Wa$(comma)-isa=foo,)

as-option = $(shell if $(CC) $(CFLAGS) $(1) -Wa,-Z -c -o /dev/null \
	     -xassembler /dev/null > /dev/null 2>&1; then echo "$(1)"; \
	     else echo "$(2)"; fi ;)

# cc-option
# Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586)

cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
             > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)

# cc-option-yn
# Usage: flag := $(call cc-option-yn, -march=winchip-c6)
cc-option-yn = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
                > /dev/null 2>&1; then echo "y"; else echo "n"; fi;)

# cc-option-align
# Prefix align with either -falign or -malign
cc-option-align = $(subst -functions=0,,\
	$(call cc-option,-falign-functions=0,-malign-functions=0))

# cc-version
# Usage gcc-ver := $(call cc-version, $(CC))
cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \
              $(if $(1), $(1), $(CC)))

# cc-ifversion
# Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \
                       echo $(3); fi;)

S
Sam Ravnborg 已提交
84 85 86 87 88 89
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

90 91 92 93 94
# Prefix -I with $(srctree) if it is not an absolute path
addtree = $(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1)
# Find all -I options and call addtree
flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))

S
Sam Ravnborg 已提交
95
# If quiet is set, only print short version of command
96
cmd = @$(echo-cmd) $(cmd_$(1))
S
Sam Ravnborg 已提交
97

S
Sam Ravnborg 已提交
98 99 100
# Add $(obj)/ for paths that is not absolute
objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))

S
Sam Ravnborg 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
###
# if_changed      - execute command if any prerequisite is newer than 
#                   target, or command line has changed
# if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
#                   including used config symbols
# if_changed_rule - as if_changed but execute rule instead
# See Documentation/kbuild/makefiles.txt for more info

ifneq ($(KBUILD_NOCMDDEP),1)
# Check if both arguments has same arguments. Result in empty string if equal
# User may override this check using make KBUILD_NOCMDDEP=1
arg-check = $(strip $(filter-out $(1), $(2)) $(filter-out $(2), $(1)) )
endif

# echo command. Short version is $(quiet) equals quiet, otherwise full command
echo-cmd = $(if $($(quiet)cmd_$(1)), \
117
	echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
S
Sam Ravnborg 已提交
118

119 120
make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))

S
Sam Ravnborg 已提交
121 122 123
# function to only execute the passed command if necessary
# >'< substitution is for echo to work, >$< substitution to preserve $ when reloading .cmd file
# note: when using inline perl scripts [perl -e '...$$t=1;...'] in $(cmd_xxx) double $$ your perl vars
124 125 126
#
if_changed = $(if $(strip $(filter-out $(PHONY),$?)          \
		$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \
S
Sam Ravnborg 已提交
127
	@set -e; \
128 129
	$(echo-cmd) $(cmd_$(1)); \
	echo 'cmd_$@ := $(make-cmd)' > $(@D)/.$(@F).cmd)
S
Sam Ravnborg 已提交
130 131 132

# execute the command and also postprocess generated .d dependencies
# file
133 134 135
if_changed_dep = $(if $(strip $(filter-out $(PHONY),$?)  \
		$(filter-out FORCE $(wildcard $^),$^)    \
	$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),     \
S
Sam Ravnborg 已提交
136
	@set -e; \
137 138
	$(echo-cmd) $(cmd_$(1)); \
	scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(@D)/.$(@F).tmp; \
S
Sam Ravnborg 已提交
139 140 141 142 143 144
	rm -f $(depfile); \
	mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd)

# Usage: $(call if_changed_rule,foo)
# will check if $(cmd_foo) changed, or any of the prequisites changed,
# and if so will execute $(rule_foo)
145 146
if_changed_rule = $(if $(strip $(filter-out $(PHONY),$?)            \
			$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),\
S
Sam Ravnborg 已提交
147 148
			@set -e; \
			$(rule_$(1)))