1*7c3d14c8STreehugger Robot# Generic Makefile Utilities 2*7c3d14c8STreehugger Robot 3*7c3d14c8STreehugger Robot### 4*7c3d14c8STreehugger Robot# Utility functions 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot# Function: streq LHS RHS 7*7c3d14c8STreehugger Robot# 8*7c3d14c8STreehugger Robot# Return "true" if LHS == RHS, otherwise "". 9*7c3d14c8STreehugger Robot# 10*7c3d14c8STreehugger Robot# LHS == RHS <=> (LHS subst RHS is empty) and (RHS subst LHS is empty) 11*7c3d14c8STreehugger Robotstreq = $(if $(1),$(if $(subst $(1),,$(2))$(subst $(2),,$(1)),,true),$(if $(2),,true)) 12*7c3d14c8STreehugger Robot 13*7c3d14c8STreehugger Robot# Function: strneq LHS RHS 14*7c3d14c8STreehugger Robot# 15*7c3d14c8STreehugger Robot# Return "true" if LHS != RHS, otherwise "". 16*7c3d14c8STreehugger Robotstrneq = $(if $(call streq,$(1),$(2)),,true) 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot# Function: contains list item 19*7c3d14c8STreehugger Robot# 20*7c3d14c8STreehugger Robot# Return "true" if 'list' contains the value 'item'. 21*7c3d14c8STreehugger Robotcontains = $(if $(strip $(foreach i,$(1),$(if $(call streq,$(2),$(i)),T,))),true,) 22*7c3d14c8STreehugger Robot 23*7c3d14c8STreehugger Robot# Function: is_subset a b 24*7c3d14c8STreehugger Robot# Return "true" if 'a' is a subset of 'b'. 25*7c3d14c8STreehugger Robotis_subset = $(if $(strip $(set_difference $(1),$(2))),,true) 26*7c3d14c8STreehugger Robot 27*7c3d14c8STreehugger Robot# Function: set_difference a b 28*7c3d14c8STreehugger Robot# Return a - b. 29*7c3d14c8STreehugger Robotset_difference = $(foreach i,$(1),$(if $(call contains,$(2),$(i)),,$(i))) 30*7c3d14c8STreehugger Robot 31*7c3d14c8STreehugger Robot# Function: Set variable value 32*7c3d14c8STreehugger Robot# 33*7c3d14c8STreehugger Robot# Set the given make variable to the given value. 34*7c3d14c8STreehugger RobotSet = $(eval $(1) := $(2)) 35*7c3d14c8STreehugger Robot 36*7c3d14c8STreehugger Robot# Function: Append variable value 37*7c3d14c8STreehugger Robot# 38*7c3d14c8STreehugger Robot# Append the given value to the given make variable. 39*7c3d14c8STreehugger RobotAppend = $(eval $(1) += $(2)) 40*7c3d14c8STreehugger Robot 41*7c3d14c8STreehugger Robot# Function: IsDefined variable 42*7c3d14c8STreehugger Robot# 43*7c3d14c8STreehugger Robot# Check whether the given variable is defined. 44*7c3d14c8STreehugger RobotIsDefined = $(call strneq,undefined,$(flavor $(1))) 45*7c3d14c8STreehugger Robot 46*7c3d14c8STreehugger Robot# Function: IsUndefined variable 47*7c3d14c8STreehugger Robot# 48*7c3d14c8STreehugger Robot# Check whether the given variable is undefined. 49*7c3d14c8STreehugger RobotIsUndefined = $(call streq,undefined,$(flavor $(1))) 50*7c3d14c8STreehugger Robot 51*7c3d14c8STreehugger Robot# Function: VarOrDefault variable default-value 52*7c3d14c8STreehugger Robot# 53*7c3d14c8STreehugger Robot# Get the value of the given make variable, or the default-value if the variable 54*7c3d14c8STreehugger Robot# is undefined. 55*7c3d14c8STreehugger RobotVarOrDefault = $(if $(call IsDefined,$(1)),$($(1)),$(2)) 56*7c3d14c8STreehugger Robot 57*7c3d14c8STreehugger Robot# Function: CheckValue variable 58*7c3d14c8STreehugger Robot# 59*7c3d14c8STreehugger Robot# Print the name, definition, and value of a variable, for testing make 60*7c3d14c8STreehugger Robot# utilities. 61*7c3d14c8STreehugger Robot# 62*7c3d14c8STreehugger Robot# Example: 63*7c3d14c8STreehugger Robot# foo = $(call streq,a,a) 64*7c3d14c8STreehugger Robot# $(call CheckValue,foo) 65*7c3d14c8STreehugger Robot# Example Output: 66*7c3d14c8STreehugger Robot# CHECKVALUE: foo: $(call streq,,) - true 67*7c3d14c8STreehugger RobotCheckValue = $(info CHECKVALUE: $(1): $(value $(1)) - $($(1))) 68*7c3d14c8STreehugger Robot 69*7c3d14c8STreehugger Robot# Function: CopyVariable src dst 70*7c3d14c8STreehugger Robot# 71*7c3d14c8STreehugger Robot# Copy the value of the variable 'src' to 'dst', taking care to not define 'dst' 72*7c3d14c8STreehugger Robot# if 'src' is undefined. The destination variable must be undefined. 73*7c3d14c8STreehugger RobotCopyVariable = \ 74*7c3d14c8STreehugger Robot $(call AssertValue,$(call IsUndefined,$(2)),destination is already defined)\ 75*7c3d14c8STreehugger Robot $(if $(call IsUndefined,$(1)),,\ 76*7c3d14c8STreehugger Robot $(call Set,$(2),$($(1)))) 77*7c3d14c8STreehugger Robot 78*7c3d14c8STreehugger Robot# Function: Assert value message 79*7c3d14c8STreehugger Robot# 80*7c3d14c8STreehugger Robot# Check that a value is true, or give an error including the given message 81*7c3d14c8STreehugger RobotAssert = $(if $(1),,\ 82*7c3d14c8STreehugger Robot $(error Assertion failed: $(2))) 83*7c3d14c8STreehugger Robot 84*7c3d14c8STreehugger Robot# Function: AssertEqual variable expected-value 85*7c3d14c8STreehugger Robot# 86*7c3d14c8STreehugger Robot# Check that the value of a variable is 'expected-value'. 87*7c3d14c8STreehugger RobotAssertEqual = \ 88*7c3d14c8STreehugger Robot $(if $(call streq,$($(1)),$(2)),,\ 89*7c3d14c8STreehugger Robot $(error Assertion failed: $(1): $(value $(1)) - $($(1)) != $(2))) 90*7c3d14c8STreehugger Robot 91*7c3d14c8STreehugger Robot# Function: CheckCommandLineOverrides list 92*7c3d14c8STreehugger Robot# 93*7c3d14c8STreehugger Robot# Check that all command line variables are in the given list. This routine is 94*7c3d14c8STreehugger Robot# useful for validating that users aren't trying to override something which 95*7c3d14c8STreehugger Robot# will not work. 96*7c3d14c8STreehugger RobotCheckCommandLineOverrides = \ 97*7c3d14c8STreehugger Robot $(foreach arg,$(MAKEOVERRIDES),\ 98*7c3d14c8STreehugger Robot $(call Set,varname,$(firstword $(subst =, ,$(arg)))) \ 99*7c3d14c8STreehugger Robot $(if $(call contains,$(1),$(varname)),,\ 100*7c3d14c8STreehugger Robot $(error "Invalid command line override: $(1) $(varname) (not supported)"))) 101*7c3d14c8STreehugger Robot 102*7c3d14c8STreehugger Robot### 103*7c3d14c8STreehugger Robot# Clean up make behavior 104*7c3d14c8STreehugger Robot 105*7c3d14c8STreehugger Robot# Cancel all suffix rules. We don't want no stinking suffix rules. 106*7c3d14c8STreehugger Robot.SUFFIXES: 107*7c3d14c8STreehugger Robot 108*7c3d14c8STreehugger Robot### 109*7c3d14c8STreehugger Robot# Debugging 110*7c3d14c8STreehugger Robot 111*7c3d14c8STreehugger Robot# General debugging rule, use 'make print-XXX' to print the definition, value 112*7c3d14c8STreehugger Robot# and origin of XXX. 113*7c3d14c8STreehugger Robotmake-print-%: 114*7c3d14c8STreehugger Robot $(error PRINT: $(value $*) = "$($*)" (from $(origin $*))) 115