162306a36Sopenharmony_ci###
262306a36Sopenharmony_ci# build: Generic definitions
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci#  Lots of this code have been borrowed or heavily inspired from parts
562306a36Sopenharmony_ci#  of kbuild code, which is not credited, but mostly developed by:
662306a36Sopenharmony_ci#
762306a36Sopenharmony_ci#  Copyright (C) Sam Ravnborg <sam@mars.ravnborg.org>, 2015
862306a36Sopenharmony_ci#  Copyright (C) Linus Torvalds <torvalds@linux-foundation.org>, 2015
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci###
1262306a36Sopenharmony_ci# Convenient variables
1362306a36Sopenharmony_cicomma   := ,
1462306a36Sopenharmony_cisquote  := '
1562306a36Sopenharmony_cipound   := \#
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci###
1862306a36Sopenharmony_ci# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
1962306a36Sopenharmony_cidot-target = $(dir $@).$(notdir $@)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci###
2262306a36Sopenharmony_ci# filename of target with directory and extension stripped
2362306a36Sopenharmony_cibasetarget = $(basename $(notdir $@))
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci###
2662306a36Sopenharmony_ci# The temporary file to save gcc -MD generated dependencies must not
2762306a36Sopenharmony_ci# contain a comma
2862306a36Sopenharmony_cidepfile = $(subst $(comma),_,$(dot-target).d)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci###
3162306a36Sopenharmony_ci# Check if both arguments has same arguments. Result is empty string if equal.
3262306a36Sopenharmony_ciarg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
3362306a36Sopenharmony_ci                    $(filter-out $(cmd_$@),   $(cmd_$(1))) )
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci###
3662306a36Sopenharmony_ci# Escape single quote for use in echo statements
3762306a36Sopenharmony_ciescsq = $(subst $(squote),'\$(squote)',$1)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci# Echo command
4062306a36Sopenharmony_ci# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
4162306a36Sopenharmony_ciecho-cmd = $(if $($(quiet)cmd_$(1)),\
4262306a36Sopenharmony_ci           echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci###
4562306a36Sopenharmony_ci# Replace >$< with >$$< to preserve $ when reloading the .cmd file
4662306a36Sopenharmony_ci# (needed for make)
4762306a36Sopenharmony_ci# Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file
4862306a36Sopenharmony_ci# (needed for make)
4962306a36Sopenharmony_ci# Replace >'< with >'\''< to be able to enclose the whole string in '...'
5062306a36Sopenharmony_ci# (needed for the shell)
5162306a36Sopenharmony_cimake-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci###
5462306a36Sopenharmony_ci# Find any prerequisites that is newer than target or that does not exist.
5562306a36Sopenharmony_ci# PHONY targets skipped in both cases.
5662306a36Sopenharmony_ciany-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci###
5962306a36Sopenharmony_ci# Copy dependency data into .cmd file
6062306a36Sopenharmony_ci#  - gcc -M dependency info
6162306a36Sopenharmony_ci#  - command line to create object 'cmd_object :='
6262306a36Sopenharmony_cidep-cmd = $(if $(wildcard $(fixdep)),                                           \
6362306a36Sopenharmony_ci           $(fixdep) $(depfile) $@ '$(make-cmd)' > $(dot-target).tmp;           \
6462306a36Sopenharmony_ci           rm -f $(depfile);                                                    \
6562306a36Sopenharmony_ci           mv -f $(dot-target).tmp $(dot-target).cmd,                           \
6662306a36Sopenharmony_ci           printf '$(pound) cannot find fixdep (%s)\n' $(fixdep) > $(dot-target).cmd; \
6762306a36Sopenharmony_ci           printf '$(pound) using basic dep data\n\n' >> $(dot-target).cmd;           \
6862306a36Sopenharmony_ci           cat $(depfile) >> $(dot-target).cmd;                                 \
6962306a36Sopenharmony_ci           printf '\n%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd)
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci###
7262306a36Sopenharmony_ci# if_changed_dep  - execute command if any prerequisite is newer than
7362306a36Sopenharmony_ci#                   target, or command line has changed and update
7462306a36Sopenharmony_ci#                   dependencies in the cmd file
7562306a36Sopenharmony_ciif_changed_dep = $(if $(strip $(any-prereq) $(arg-check)),         \
7662306a36Sopenharmony_ci                  @set -e;                                         \
7762306a36Sopenharmony_ci                  $(echo-cmd) $(cmd_$(1));                         \
7862306a36Sopenharmony_ci                  $(dep-cmd))
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci# if_changed      - execute command if any prerequisite is newer than
8162306a36Sopenharmony_ci#                   target, or command line has changed
8262306a36Sopenharmony_ciif_changed = $(if $(strip $(any-prereq) $(arg-check)),                   \
8362306a36Sopenharmony_ci              @set -e;                                                   \
8462306a36Sopenharmony_ci              $(echo-cmd) $(cmd_$(1));                                   \
8562306a36Sopenharmony_ci              printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci###
8862306a36Sopenharmony_ci# C flags to be used in rule definitions, includes:
8962306a36Sopenharmony_ci# - depfile generation
9062306a36Sopenharmony_ci# - global $(CFLAGS)
9162306a36Sopenharmony_ci# - per target C flags
9262306a36Sopenharmony_ci# - per object C flags
9362306a36Sopenharmony_ci# - BUILD_STR macro to allow '-D"$(variable)"' constructs
9462306a36Sopenharmony_cic_flags_1 = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CFLAGS) -D"BUILD_STR(s)=\#s" $(CFLAGS_$(basetarget).o) $(CFLAGS_$(obj))
9562306a36Sopenharmony_cic_flags_2 = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(c_flags_1))
9662306a36Sopenharmony_cic_flags   = $(filter-out $(CFLAGS_REMOVE_$(obj)), $(c_flags_2))
9762306a36Sopenharmony_cicxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj))
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci###
10062306a36Sopenharmony_ci## HOSTCC C flags
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cihost_c_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(HOSTCFLAGS) -D"BUILD_STR(s)=\#s" $(HOSTCFLAGS_$(basetarget).o) $(HOSTCFLAGS_$(obj))
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci# output directory for tests below
10562306a36Sopenharmony_ciTMPOUT = .tmp_$$$$
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci# try-run
10862306a36Sopenharmony_ci# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
10962306a36Sopenharmony_ci# Exit code chooses option. "$$TMP" serves as a temporary file and is
11062306a36Sopenharmony_ci# automatically cleaned up.
11162306a36Sopenharmony_citry-run = $(shell set -e;		\
11262306a36Sopenharmony_ci	TMP=$(TMPOUT)/tmp;		\
11362306a36Sopenharmony_ci	mkdir -p $(TMPOUT);		\
11462306a36Sopenharmony_ci	trap "rm -rf $(TMPOUT)" EXIT;	\
11562306a36Sopenharmony_ci	if ($(1)) >/dev/null 2>&1;	\
11662306a36Sopenharmony_ci	then echo "$(2)";		\
11762306a36Sopenharmony_ci	else echo "$(3)";		\
11862306a36Sopenharmony_ci	fi)
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci# cc-option
12162306a36Sopenharmony_ci# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
12262306a36Sopenharmony_cicc-option = $(call try-run, \
12362306a36Sopenharmony_ci	$(CC) -Werror $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci# delete partially updated (i.e. corrupted) files on error
12662306a36Sopenharmony_ci.DELETE_ON_ERROR:
127