Kbuild.include 5.4 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
###
# filename of target with directory and extension stripped
basetarget = $(basename $(notdir $@))

19 20 21 22
###
# Escape single quote for use in echo statements
escsq = $(subst $(squote),'\$(squote)',$1)

S
Sam Ravnborg 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
###
# 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

51
######
52
# gcc support functions
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 84 85 86 87
# 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;)

R
Roland McGrath 已提交
88 89 90 91 92 93 94
# ld-option
# Usage: ldflags += $(call ld-option, -Wl$(comma)--hash-style=both)
ld-option = $(shell if $(CC) $(1) \
			     -nostdlib -o ldtest$$$$.out -xc /dev/null \
             > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi; \
	     rm -f ldtest$$$$.out)

S
Sam Ravnborg 已提交
95 96 97 98 99 100
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

101 102 103 104 105
# 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 已提交
106
# If quiet is set, only print short version of command
107
cmd = @$(echo-cmd) $(cmd_$(1))
S
Sam Ravnborg 已提交
108

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

S
Sam Ravnborg 已提交
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
###
# 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)), \
128
	echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
S
Sam Ravnborg 已提交
129

130 131
make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))

S
Sam Ravnborg 已提交
132 133 134
# 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
135 136 137
#
if_changed = $(if $(strip $(filter-out $(PHONY),$?)          \
		$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \
S
Sam Ravnborg 已提交
138
	@set -e; \
139 140
	$(echo-cmd) $(cmd_$(1)); \
	echo 'cmd_$@ := $(make-cmd)' > $(@D)/.$(@F).cmd)
S
Sam Ravnborg 已提交
141 142 143

# execute the command and also postprocess generated .d dependencies
# file
144 145 146
if_changed_dep = $(if $(strip $(filter-out $(PHONY),$?)  \
		$(filter-out FORCE $(wildcard $^),$^)    \
	$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),     \
S
Sam Ravnborg 已提交
147
	@set -e; \
148 149
	$(echo-cmd) $(cmd_$(1)); \
	scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(@D)/.$(@F).tmp; \
S
Sam Ravnborg 已提交
150 151 152 153 154 155
	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)
156 157
if_changed_rule = $(if $(strip $(filter-out $(PHONY),$?)            \
			$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),\
S
Sam Ravnborg 已提交
158 159
			@set -e; \
			$(rule_$(1)))