16260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Generic Makefile Utilities
2b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
3b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar###
4b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Utility functions
5b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
6faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar# Function: streq LHS RHS
7faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar#
8faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar# Return "true" if LHS == RHS, otherwise "".
9faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar#
10faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar# LHS == RHS <=> (LHS subst RHS is empty) and (RHS subst LHS is empty)
11faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbarstreq = $(if $(1),$(if $(subst $(1),,$(2))$(subst $(2),,$(1)),,true),$(if $(2),,true))
12faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar
13faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar# Function: strneq LHS RHS
14faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar#
15faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar# Return "true" if LHS != RHS, otherwise "".
16faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbarstrneq = $(if $(call streq,$(1),$(2)),,true)
17faf0150036689985ecea64e78f2637093857cd7bDaniel Dunbar
186260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: contains list item
196260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
206260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Return "true" if 'list' contains the value 'item'.
216260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbarcontains = $(if $(strip $(foreach i,$(1),$(if $(call streq,$(2),$(i)),T,))),true,)
226260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
236260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: is_subset a b
246260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Return "true" if 'a' is a subset of 'b'.
256260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbaris_subset = $(if $(strip $(set_difference $(1),$(2))),,true)
266260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
276260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: set_difference a b
286260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Return a - b.
296260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbarset_difference = $(foreach i,$(1),$(if $(call contains,$(2),$(i)),,$(i)))
306260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
31b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Function: Set variable value
32b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#
33b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Set the given make variable to the given value.
34b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel DunbarSet = $(eval $(1) := $(2))
35b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
36b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Function: Append variable value
37b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#
38b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Append the given value to the given make variable.
39b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel DunbarAppend = $(eval $(1) += $(2))
40b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
416260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: IsDefined variable
426260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
436260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Check whether the given variable is defined.
446260e4a3af0d4cd136e7976feb3465489da59141Daniel DunbarIsDefined = $(call strneq,undefined,$(flavor $(1)))
456260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
466260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: IsUndefined variable
476260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
486260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Check whether the given variable is undefined.
496260e4a3af0d4cd136e7976feb3465489da59141Daniel DunbarIsUndefined = $(call streq,undefined,$(flavor $(1)))
506260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
516260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: VarOrDefault variable default-value
526260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
536260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Get the value of the given make variable, or the default-value if the variable
546260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# is undefined.
556260e4a3af0d4cd136e7976feb3465489da59141Daniel DunbarVarOrDefault = $(if $(call IsDefined,$(1)),$($(1)),$(2))
566260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
576260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: CheckValue variable
586260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
596260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Print the name, definition, and value of a variable, for testing make
606260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# utilities.
616260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
626260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Example:
636260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#   foo = $(call streq,a,a)
646260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#   $(call CheckValue,foo)
656260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Example Output:
666260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#   CHECKVALUE: foo: $(call streq,,) - true
676260e4a3af0d4cd136e7976feb3465489da59141Daniel DunbarCheckValue = $(info CHECKVALUE: $(1): $(value $(1)) - $($(1)))
686260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
6948464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Function: CopyVariable src dst
7048464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar#
7148464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# Copy the value of the variable 'src' to 'dst', taking care to not define 'dst'
7248464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar# if 'src' is undefined. The destination variable must be undefined.
7348464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel DunbarCopyVariable = \
7448464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $(call AssertValue,$(call IsUndefined,$(2)),destination is already defined)\
7548464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar  $(if $(call IsUndefined,$(1)),,\
7648464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar       $(call Set,$(2),$($(1))))
7748464e0ee1c2de5bcbf0d609348f55d0c301085dDaniel Dunbar
786260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: Assert value message
796260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
806260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Check that a value is true, or give an error including the given message
816260e4a3af0d4cd136e7976feb3465489da59141Daniel DunbarAssert = $(if $(1),,\
826260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar           $(error Assertion failed: $(2)))
836260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
846260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Function: AssertEqual variable expected-value
856260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar#
866260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar# Check that the value of a variable is 'expected-value'.
876260e4a3af0d4cd136e7976feb3465489da59141Daniel DunbarAssertEqual = \
886260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar  $(if $(call streq,$($(1)),$(2)),,\
896260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar       $(error Assertion failed: $(1): $(value $(1)) - $($(1)) != $(2)))
906260e4a3af0d4cd136e7976feb3465489da59141Daniel Dunbar
911d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar# Function: CheckCommandLineOverrides list
921d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar#
931d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar# Check that all command line variables are in the given list. This routine is
941d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar# useful for validating that users aren't trying to override something which
951d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar# will not work.
961d16fdede4010acc771695cbcec63aa650564b99Daniel DunbarCheckCommandLineOverrides = \
971d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar  $(foreach arg,$(MAKEOVERRIDES),\
981d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar    $(call Set,varname,$(firstword $(subst =, ,$(arg)))) \
991d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar    $(if $(call contains,$(1),$(varname)),,\
1001d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar      $(error "Invalid command line override: $(1) $(varname) (not supported)")))
1011d16fdede4010acc771695cbcec63aa650564b99Daniel Dunbar
102b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar###
103b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Clean up make behavior
104b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
105b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Cancel all suffix rules. We don't want no stinking suffix rules.
106b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar.SUFFIXES:
107b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
108b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar###
109b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar# Debugging
110b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar
111557a6eace292091d14419a334e8d62d9ec9e772bDaniel Dunbar# General debugging rule, use 'make print-XXX' to print the definition, value
112557a6eace292091d14419a334e8d62d9ec9e772bDaniel Dunbar# and origin of XXX.
113557a6eace292091d14419a334e8d62d9ec9e772bDaniel Dunbarmake-print-%:
114b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar	$(error PRINT: $(value $*) = "$($*)" (from $(origin $*)))
115