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