| .. | .. |
|---|
| 1 | +# SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | 2 | #### |
|---|
| 2 | 3 | # kbuild: Generic definitions |
|---|
| 3 | 4 | |
|---|
| .. | .. |
|---|
| 15 | 16 | dot-target = $(dir $@).$(notdir $@) |
|---|
| 16 | 17 | |
|---|
| 17 | 18 | ### |
|---|
| 18 | | -# The temporary file to save gcc -MD generated dependencies must not |
|---|
| 19 | +# The temporary file to save gcc -MMD generated dependencies must not |
|---|
| 19 | 20 | # contain a comma |
|---|
| 20 | 21 | depfile = $(subst $(comma),_,$(dot-target).d) |
|---|
| 21 | 22 | |
|---|
| .. | .. |
|---|
| 24 | 25 | basetarget = $(basename $(notdir $@)) |
|---|
| 25 | 26 | |
|---|
| 26 | 27 | ### |
|---|
| 27 | | -# filename of first prerequisite with directory and extension stripped |
|---|
| 28 | | -baseprereq = $(basename $(notdir $<)) |
|---|
| 28 | +# real prerequisites without phony targets |
|---|
| 29 | +real-prereqs = $(filter-out $(PHONY), $^) |
|---|
| 29 | 30 | |
|---|
| 30 | 31 | ### |
|---|
| 31 | 32 | # Escape single quote for use in echo statements |
|---|
| 32 | 33 | escsq = $(subst $(squote),'\$(squote)',$1) |
|---|
| 34 | + |
|---|
| 35 | +### |
|---|
| 36 | +# Quote a string to pass it to C files. foo => '"foo"' |
|---|
| 37 | +stringify = $(squote)$(quote)$1$(quote)$(squote) |
|---|
| 33 | 38 | |
|---|
| 34 | 39 | ### |
|---|
| 35 | 40 | # Easy method for doing a status message |
|---|
| .. | .. |
|---|
| 41 | 46 | ### |
|---|
| 42 | 47 | # filechk is used to check if the content of a generated file is updated. |
|---|
| 43 | 48 | # Sample usage: |
|---|
| 44 | | -# define filechk_sample |
|---|
| 45 | | -# echo $KERNELRELEASE |
|---|
| 46 | | -# endef |
|---|
| 47 | | -# version.h : Makefile |
|---|
| 49 | +# |
|---|
| 50 | +# filechk_sample = echo $(KERNELRELEASE) |
|---|
| 51 | +# version.h: FORCE |
|---|
| 48 | 52 | # $(call filechk,sample) |
|---|
| 53 | +# |
|---|
| 49 | 54 | # The rule defined shall write to stdout the content of the new file. |
|---|
| 50 | 55 | # The existing file will be compared with the new one. |
|---|
| 51 | 56 | # - If no file exist it is created |
|---|
| 52 | 57 | # - If the content differ the new file is used |
|---|
| 53 | 58 | # - If they are equal no change, and no timestamp update |
|---|
| 54 | | -# - stdin is piped in from the first prerequisite ($<) so one has |
|---|
| 55 | | -# to specify a valid file as first prerequisite (often the kbuild file) |
|---|
| 56 | 59 | define filechk |
|---|
| 57 | | - $(Q)set -e; \ |
|---|
| 58 | | - mkdir -p $(dir $@); \ |
|---|
| 59 | | - $(filechk_$(1)) > $@.tmp; \ |
|---|
| 60 | | - if [ -r $@ ] && cmp -s $@ $@.tmp; then \ |
|---|
| 61 | | - rm -f $@.tmp; \ |
|---|
| 62 | | - else \ |
|---|
| 63 | | - $(kecho) ' UPD $@'; \ |
|---|
| 64 | | - mv -f $@.tmp $@; \ |
|---|
| 60 | + $(Q)set -e; \ |
|---|
| 61 | + mkdir -p $(dir $@); \ |
|---|
| 62 | + trap "rm -f $(dot-target).tmp" EXIT; \ |
|---|
| 63 | + { $(filechk_$(1)); } > $(dot-target).tmp; \ |
|---|
| 64 | + if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then \ |
|---|
| 65 | + $(kecho) ' UPD $@'; \ |
|---|
| 66 | + mv -f $(dot-target).tmp $@; \ |
|---|
| 65 | 67 | fi |
|---|
| 66 | 68 | endef |
|---|
| 67 | 69 | |
|---|
| 68 | 70 | ###### |
|---|
| 69 | 71 | # gcc support functions |
|---|
| 70 | | -# See documentation in Documentation/kbuild/makefiles.txt |
|---|
| 72 | +# See documentation in Documentation/kbuild/makefiles.rst |
|---|
| 71 | 73 | |
|---|
| 72 | 74 | # cc-cross-prefix |
|---|
| 73 | 75 | # Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-) |
|---|
| 74 | | -# Return first prefix where a prefix$(CC) is found in PATH. |
|---|
| 75 | | -# If no $(CC) found in PATH with listed prefixes return nothing |
|---|
| 76 | | -cc-cross-prefix = \ |
|---|
| 77 | | - $(word 1, $(foreach c,$(1), \ |
|---|
| 78 | | - $(shell set -e; \ |
|---|
| 79 | | - if (which $(strip $(c))$(CC)) > /dev/null 2>&1 ; then \ |
|---|
| 80 | | - echo $(c); \ |
|---|
| 81 | | - fi))) |
|---|
| 76 | +# Return first <prefix> where a <prefix>gcc is found in PATH. |
|---|
| 77 | +# If no gcc found in PATH with listed prefixes return nothing |
|---|
| 78 | +# |
|---|
| 79 | +# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it |
|---|
| 80 | +# would try to directly execute the shell builtin 'command'. This workaround |
|---|
| 81 | +# should be kept for a long time since this issue was fixed only after the |
|---|
| 82 | +# GNU Make 4.2.1 release. |
|---|
| 83 | +cc-cross-prefix = $(firstword $(foreach c, $(1), \ |
|---|
| 84 | + $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c)))) |
|---|
| 82 | 85 | |
|---|
| 83 | 86 | # output directory for tests below |
|---|
| 84 | 87 | TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$ |
|---|
| .. | .. |
|---|
| 114 | 117 | __cc-option = $(call try-run,\ |
|---|
| 115 | 118 | $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4)) |
|---|
| 116 | 119 | |
|---|
| 117 | | -# Do not attempt to build with gcc plugins during cc-option tests. |
|---|
| 118 | | -# (And this uses delayed resolution so the flags will be up to date.) |
|---|
| 119 | | -CC_OPTION_CFLAGS = $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS)) |
|---|
| 120 | | - |
|---|
| 121 | 120 | # cc-option |
|---|
| 122 | 121 | # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) |
|---|
| 123 | 122 | |
|---|
| 124 | 123 | cc-option = $(call __cc-option, $(CC),\ |
|---|
| 125 | | - $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS),$(1),$(2)) |
|---|
| 126 | | - |
|---|
| 127 | | -# hostcc-option |
|---|
| 128 | | -# Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586) |
|---|
| 129 | | -hostcc-option = $(call __cc-option, $(HOSTCC),\ |
|---|
| 130 | | - $(KBUILD_HOSTCFLAGS) $(HOST_EXTRACFLAGS),$(1),$(2)) |
|---|
| 124 | + $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2)) |
|---|
| 131 | 125 | |
|---|
| 132 | 126 | # cc-option-yn |
|---|
| 133 | 127 | # Usage: flag := $(call cc-option-yn,-march=winchip-c6) |
|---|
| 134 | 128 | cc-option-yn = $(call try-run,\ |
|---|
| 135 | | - $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) |
|---|
| 129 | + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) |
|---|
| 136 | 130 | |
|---|
| 137 | 131 | # cc-disable-warning |
|---|
| 138 | 132 | # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) |
|---|
| 139 | 133 | cc-disable-warning = $(call try-run,\ |
|---|
| 140 | | - $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) |
|---|
| 141 | | - |
|---|
| 142 | | -# cc-name |
|---|
| 143 | | -# Expands to either gcc or clang |
|---|
| 144 | | -cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc) |
|---|
| 145 | | - |
|---|
| 146 | | -# cc-version |
|---|
| 147 | | -cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) |
|---|
| 148 | | - |
|---|
| 149 | | -# cc-fullversion |
|---|
| 150 | | -cc-fullversion = $(shell $(CONFIG_SHELL) \ |
|---|
| 151 | | - $(srctree)/scripts/gcc-version.sh -p $(CC)) |
|---|
| 134 | + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) |
|---|
| 152 | 135 | |
|---|
| 153 | 136 | # cc-ifversion |
|---|
| 154 | 137 | # Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) |
|---|
| 155 | | -cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && echo $(3) || echo $(4)) |
|---|
| 156 | | - |
|---|
| 157 | | -# cc-ldoption |
|---|
| 158 | | -# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) |
|---|
| 159 | | -cc-ldoption = $(call try-run,\ |
|---|
| 160 | | - $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) |
|---|
| 138 | +cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4)) |
|---|
| 161 | 139 | |
|---|
| 162 | 140 | # ld-option |
|---|
| 163 | 141 | # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y) |
|---|
| 164 | 142 | ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3)) |
|---|
| 165 | | - |
|---|
| 166 | | -# ar-option |
|---|
| 167 | | -# Usage: KBUILD_ARFLAGS := $(call ar-option,D) |
|---|
| 168 | | -# Important: no spaces around options |
|---|
| 169 | | -ar-option = $(call try-run, $(AR) rc$(1) "$$TMP",$(1),$(2)) |
|---|
| 170 | 143 | |
|---|
| 171 | 144 | # ld-version |
|---|
| 172 | 145 | # Note this is mainly for HJ Lu's 3 number binutil versions |
|---|
| .. | .. |
|---|
| 185 | 158 | build := -f $(srctree)/scripts/Makefile.build obj |
|---|
| 186 | 159 | |
|---|
| 187 | 160 | ### |
|---|
| 188 | | -# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= |
|---|
| 189 | | -# Usage: |
|---|
| 190 | | -# $(Q)$(MAKE) $(modbuiltin)=dir |
|---|
| 191 | | -modbuiltin := -f $(srctree)/scripts/Makefile.modbuiltin obj |
|---|
| 192 | | - |
|---|
| 193 | | -### |
|---|
| 194 | 161 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj= |
|---|
| 195 | 162 | # Usage: |
|---|
| 196 | 163 | # $(Q)$(MAKE) $(dtbinst)=dir |
|---|
| 197 | | -dtbinst := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.dtbinst obj |
|---|
| 164 | +dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj |
|---|
| 198 | 165 | |
|---|
| 199 | 166 | ### |
|---|
| 200 | 167 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj= |
|---|
| .. | .. |
|---|
| 202 | 169 | # $(Q)$(MAKE) $(clean)=dir |
|---|
| 203 | 170 | clean := -f $(srctree)/scripts/Makefile.clean obj |
|---|
| 204 | 171 | |
|---|
| 205 | | -### |
|---|
| 206 | | -# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.headersinst obj= |
|---|
| 207 | | -# Usage: |
|---|
| 208 | | -# $(Q)$(MAKE) $(hdr-inst)=dir |
|---|
| 209 | | -hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj |
|---|
| 210 | | - |
|---|
| 211 | | -# Prefix -I with $(srctree) if it is not an absolute path. |
|---|
| 212 | | -# skip if -I has no parameter |
|---|
| 213 | | -addtree = $(if $(patsubst -I%,%,$(1)), \ |
|---|
| 214 | | -$(if $(filter-out -I/% -I./% -I../%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)),$(1)) |
|---|
| 215 | | - |
|---|
| 216 | | -# Find all -I options and call addtree |
|---|
| 217 | | -flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o))) |
|---|
| 218 | | - |
|---|
| 219 | 172 | # echo command. |
|---|
| 220 | 173 | # Short version is used, if $(quiet) equals `quiet_', otherwise full one. |
|---|
| 221 | 174 | echo-cmd = $(if $($(quiet)cmd_$(1)),\ |
|---|
| 222 | 175 | echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) |
|---|
| 223 | 176 | |
|---|
| 224 | | -# printing commands |
|---|
| 225 | | -cmd = @$(echo-cmd) $(cmd_$(1)) |
|---|
| 177 | +# sink stdout for 'make -s' |
|---|
| 178 | + redirect := |
|---|
| 179 | + quiet_redirect := |
|---|
| 180 | +silent_redirect := exec >/dev/null; |
|---|
| 226 | 181 | |
|---|
| 227 | | -# Add $(obj)/ for paths that are not absolute |
|---|
| 228 | | -objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) |
|---|
| 182 | +# Delete the target on interruption |
|---|
| 183 | +# |
|---|
| 184 | +# GNU Make automatically deletes the target if it has already been changed by |
|---|
| 185 | +# the interrupted recipe. So, you can safely stop the build by Ctrl-C (Make |
|---|
| 186 | +# will delete incomplete targets), and resume it later. |
|---|
| 187 | +# |
|---|
| 188 | +# However, this does not work when the stderr is piped to another program, like |
|---|
| 189 | +# $ make >&2 | tee log |
|---|
| 190 | +# Make dies with SIGPIPE before cleaning the targets. |
|---|
| 191 | +# |
|---|
| 192 | +# To address it, we clean the target in signal traps. |
|---|
| 193 | +# |
|---|
| 194 | +# Make deletes the target when it catches SIGHUP, SIGINT, SIGQUIT, SIGTERM. |
|---|
| 195 | +# So, we cover them, and also SIGPIPE just in case. |
|---|
| 196 | +# |
|---|
| 197 | +# Of course, this is unneeded for phony targets. |
|---|
| 198 | +delete-on-interrupt = \ |
|---|
| 199 | + $(if $(filter-out $(PHONY), $@), \ |
|---|
| 200 | + $(foreach sig, HUP INT QUIT TERM PIPE, \ |
|---|
| 201 | + trap 'rm -f $@; trap - $(sig); kill -s $(sig) $$$$' $(sig);)) |
|---|
| 202 | + |
|---|
| 203 | +# printing commands |
|---|
| 204 | +cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(delete-on-interrupt) $(cmd_$(1)) |
|---|
| 229 | 205 | |
|---|
| 230 | 206 | ### |
|---|
| 231 | 207 | # if_changed - execute command if any prerequisite is newer than |
|---|
| .. | .. |
|---|
| 233 | 209 | # if_changed_dep - as if_changed, but uses fixdep to reveal dependencies |
|---|
| 234 | 210 | # including used config symbols |
|---|
| 235 | 211 | # if_changed_rule - as if_changed but execute rule instead |
|---|
| 236 | | -# See Documentation/kbuild/makefiles.txt for more info |
|---|
| 212 | +# See Documentation/kbuild/makefiles.rst for more info |
|---|
| 237 | 213 | |
|---|
| 238 | 214 | ifneq ($(KBUILD_NOCMDDEP),1) |
|---|
| 239 | | -# Check if both arguments are the same including their order. Result is empty |
|---|
| 215 | +# Check if both commands are the same including their order. Result is empty |
|---|
| 240 | 216 | # string if equal. User may override this check using make KBUILD_NOCMDDEP=1 |
|---|
| 241 | | -arg-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ |
|---|
| 217 | +cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ |
|---|
| 242 | 218 | $(subst $(space),$(space_escape),$(strip $(cmd_$1)))) |
|---|
| 243 | 219 | else |
|---|
| 244 | | -arg-check = $(if $(strip $(cmd_$@)),,1) |
|---|
| 220 | +cmd-check = $(if $(strip $(cmd_$@)),,1) |
|---|
| 245 | 221 | endif |
|---|
| 246 | 222 | |
|---|
| 247 | 223 | # Replace >$< with >$$< to preserve $ when reloading the .cmd file |
|---|
| .. | .. |
|---|
| 252 | 228 | # (needed for the shell) |
|---|
| 253 | 229 | make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))) |
|---|
| 254 | 230 | |
|---|
| 255 | | -# Find any prerequisites that is newer than target or that does not exist. |
|---|
| 231 | +# Find any prerequisites that are newer than target or that do not exist. |
|---|
| 232 | +# (This is not true for now; $? should contain any non-existent prerequisites, |
|---|
| 233 | +# but it does not work as expected when .SECONDARY is present. This seems a bug |
|---|
| 234 | +# of GNU Make.) |
|---|
| 256 | 235 | # PHONY targets skipped in both cases. |
|---|
| 257 | | -any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) |
|---|
| 236 | +newer-prereqs = $(filter-out $(PHONY),$?) |
|---|
| 258 | 237 | |
|---|
| 259 | 238 | # Execute command if command has changed or prerequisite(s) are updated. |
|---|
| 260 | | -if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ |
|---|
| 261 | | - @set -e; \ |
|---|
| 262 | | - $(echo-cmd) $(cmd_$(1)); \ |
|---|
| 239 | +if_changed = $(if $(newer-prereqs)$(cmd-check), \ |
|---|
| 240 | + $(cmd); \ |
|---|
| 263 | 241 | printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) |
|---|
| 264 | 242 | |
|---|
| 265 | 243 | # Execute the command and also postprocess generated .d dependencies file. |
|---|
| 266 | | -if_changed_dep = $(if $(strip $(any-prereq) $(arg-check) ), \ |
|---|
| 267 | | - @set -e; \ |
|---|
| 268 | | - $(cmd_and_fixdep), @:) |
|---|
| 269 | | - |
|---|
| 270 | | -ifndef CONFIG_TRIM_UNUSED_KSYMS |
|---|
| 244 | +if_changed_dep = $(if $(newer-prereqs)$(cmd-check),$(cmd_and_fixdep),@:) |
|---|
| 271 | 245 | |
|---|
| 272 | 246 | cmd_and_fixdep = \ |
|---|
| 273 | | - $(echo-cmd) $(cmd_$(1)); \ |
|---|
| 274 | | - scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;\ |
|---|
| 275 | | - rm -f $(depfile); \ |
|---|
| 276 | | - mv -f $(dot-target).tmp $(dot-target).cmd; |
|---|
| 277 | | - |
|---|
| 278 | | -else |
|---|
| 279 | | - |
|---|
| 280 | | -# Filter out exported kernel symbol names from the preprocessor output. |
|---|
| 281 | | -# See also __KSYM_DEPS__ in include/linux/export.h. |
|---|
| 282 | | -# We disable the depfile generation here, so as not to overwrite the existing |
|---|
| 283 | | -# depfile while fixdep is parsing it. |
|---|
| 284 | | -flags_nodeps = $(filter-out -Wp$(comma)-M%, $($(1))) |
|---|
| 285 | | -ksym_dep_filter = \ |
|---|
| 286 | | - case "$(1)" in \ |
|---|
| 287 | | - cc_*_c|cpp_i_c) \ |
|---|
| 288 | | - $(CPP) $(call flags_nodeps,c_flags) -D__KSYM_DEPS__ $< ;; \ |
|---|
| 289 | | - as_*_S|cpp_s_S) \ |
|---|
| 290 | | - $(CPP) $(call flags_nodeps,a_flags) -D__KSYM_DEPS__ $< ;; \ |
|---|
| 291 | | - boot*|build*|cpp_its_S|*cpp_lds_S|dtc|host*|vdso*) : ;; \ |
|---|
| 292 | | - *) echo "Don't know how to preprocess $(1)" >&2; false ;; \ |
|---|
| 293 | | - esac | grep -F '=== __KSYM_' | tr ";" "\n" | sed -n 's/^.*=== __KSYM_\(.*\) ===.*$$/_\1/p' |
|---|
| 294 | | - |
|---|
| 295 | | -cmd_and_fixdep = \ |
|---|
| 296 | | - $(echo-cmd) $(cmd_$(1)); \ |
|---|
| 297 | | - $(ksym_dep_filter) | \ |
|---|
| 298 | | - scripts/basic/fixdep -e $(depfile) $@ '$(make-cmd)' \ |
|---|
| 299 | | - > $(dot-target).tmp; \ |
|---|
| 300 | | - rm -f $(depfile); \ |
|---|
| 301 | | - mv -f $(dot-target).tmp $(dot-target).cmd; |
|---|
| 302 | | - |
|---|
| 303 | | -endif |
|---|
| 247 | + $(cmd); \ |
|---|
| 248 | + scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\ |
|---|
| 249 | + rm -f $(depfile) |
|---|
| 304 | 250 | |
|---|
| 305 | 251 | # Usage: $(call if_changed_rule,foo) |
|---|
| 306 | 252 | # Will check if $(cmd_foo) or any of the prerequisites changed, |
|---|
| 307 | 253 | # and if so will execute $(rule_foo). |
|---|
| 308 | | -if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \ |
|---|
| 309 | | - @set -e; \ |
|---|
| 310 | | - $(rule_$(1)), @:) |
|---|
| 254 | +if_changed_rule = $(if $(newer-prereqs)$(cmd-check),$(rule_$(1)),@:) |
|---|
| 311 | 255 | |
|---|
| 312 | 256 | ### |
|---|
| 313 | 257 | # why - tell why a target got built |
|---|
| .. | .. |
|---|
| 332 | 276 | why = \ |
|---|
| 333 | 277 | $(if $(filter $@, $(PHONY)),- due to target is PHONY, \ |
|---|
| 334 | 278 | $(if $(wildcard $@), \ |
|---|
| 335 | | - $(if $(strip $(any-prereq)),- due to: $(any-prereq), \ |
|---|
| 336 | | - $(if $(arg-check), \ |
|---|
| 279 | + $(if $(newer-prereqs),- due to: $(newer-prereqs), \ |
|---|
| 280 | + $(if $(cmd-check), \ |
|---|
| 337 | 281 | $(if $(cmd_$@),- due to command line change, \ |
|---|
| 338 | 282 | $(if $(filter $@, $(targets)), \ |
|---|
| 339 | 283 | - due to missing .cmd file, \ |
|---|
| .. | .. |
|---|
| 400 | 344 | |
|---|
| 401 | 345 | # delete partially updated (i.e. corrupted) files on error |
|---|
| 402 | 346 | .DELETE_ON_ERROR: |
|---|
| 347 | + |
|---|
| 348 | +# do not delete intermediate files automatically |
|---|
| 349 | +.SECONDARY: |
|---|