| # -*- coding: utf-8; mode: makefile-gmake -*- | |
| # SPDX-License-Identifier: AGPL-3.0-or-later | |
| PHONY += make-help | |
| make-help: | |
| @echo 'options:' | |
| @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build' | |
| @echo ' make V=2 [targets] 2 => give reason for rebuild of target' | |
| ifeq ("$(origin V)", "command line") | |
| VERBOSE = $(V) | |
| endif | |
| ifndef VERBOSE | |
| VERBOSE = 0 | |
| endif | |
| export VERBOSE | |
| ifeq ($(VERBOSE),1) | |
| quiet = | |
| Q = | |
| else | |
| quiet=quiet_ | |
| Q = @ | |
| endif | |
| # stolen from linux/scripts/Kbuild.include | |
| # | |
| # Convenient variables | |
| squote := ' | |
| #' this comment is only for emacs highlighting | |
| # Find any prerequisites that is newer than target or that does not exist. | |
| # PHONY targets skipped in both cases. | |
| any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) | |
| # | |
| ### | |
| # why - tell why a a target got build | |
| # enabled by make V=2 | |
| # Output (listed in the order they are checked): | |
| # (1) - due to target is PHONY | |
| # (2) - due to target missing | |
| # (3) - due to: file1.h file2.h | |
| # (4) - due to command line change | |
| # (5) - due to missing .cmd file | |
| # (6) - due to target not in $(targets) | |
| # (1) PHONY targets are always build | |
| # (2) No target, so we better build it | |
| # (3) Prerequisite is newer than target | |
| # (4) The command line stored in the file named dir/.target.cmd | |
| # differed from actual command line. This happens when compiler | |
| # options changes | |
| # (5) No dir/.target.cmd file (used to store command line) | |
| # (6) No dir/.target.cmd file and target not listed in $(targets) | |
| # This is a good hint that there is a bug in the kbuild file | |
| ifeq ($(VERBOSE),2) | |
| why = \ | |
| $(if $(filter $@, $(PHONY)),- due to target is PHONY, \ | |
| $(if $(wildcard $@), \ | |
| $(if $(strip $(any-prereq)),- due to: $(any-prereq), \ | |
| $(if $(arg-check), \ | |
| $(if $(cmd_$@),- due to command line change, \ | |
| $(if $(filter $@, $(targets)), \ | |
| - due to missing .cmd file, \ | |
| - due to $(notdir $@) not in $$(targets) \ | |
| ) \ | |
| ) \ | |
| ) \ | |
| ), \ | |
| - due to target missing \ | |
| ) \ | |
| ) | |
| echo-why = $(call escsq, $(strip $(why))) | |
| endif | |
| # | |
| ### | |
| # Escape single quote for use in echo statements | |
| escsq = $(subst $(squote),'\$(squote)',$1) | |
| # | |
| # echo command. | |
| # Short version is used, if $(quiet) equals `quiet_', otherwise full one. | |
| echo-cmd = $(if $($(quiet)cmd_$(1)),echo '$(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) | |
| # | |
| # printing commands | |
| cmd = @$(echo-cmd) $(cmd_$(1)) | |