177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Generic Makefile Utilities 277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao### 477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Utility functions 577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: streq LHS RHS 777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Return "true" if LHS == RHS, otherwise "". 977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# LHS == RHS <=> (LHS subst RHS is empty) and (RHS subst LHS is empty) 1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostreq = $(if $(1),$(if $(subst $(1),,$(2))$(subst $(2),,$(1)),,true),$(if $(2),,true)) 1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: strneq LHS RHS 1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Return "true" if LHS != RHS, otherwise "". 1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostrneq = $(if $(call streq,$(1),$(2)),,true) 1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: contains list item 1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Return "true" if 'list' contains the value 'item'. 2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaocontains = $(if $(strip $(foreach i,$(1),$(if $(call streq,$(2),$(i)),T,))),true,) 2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: is_subset a b 2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Return "true" if 'a' is a subset of 'b'. 2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaois_subset = $(if $(strip $(set_difference $(1),$(2))),,true) 2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: set_difference a b 2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Return a - b. 2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoset_difference = $(foreach i,$(1),$(if $(call contains,$(2),$(i)),,$(i))) 3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: Set variable value 3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Set the given make variable to the given value. 3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoSet = $(eval $(1) := $(2)) 3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: Append variable value 3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Append the given value to the given make variable. 3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoAppend = $(eval $(1) += $(2)) 4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: IsDefined variable 4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Check whether the given variable is defined. 4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoIsDefined = $(call strneq,undefined,$(flavor $(1))) 4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: IsUndefined variable 4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Check whether the given variable is undefined. 4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoIsUndefined = $(call streq,undefined,$(flavor $(1))) 5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: VarOrDefault variable default-value 5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Get the value of the given make variable, or the default-value if the variable 5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# is undefined. 5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoVarOrDefault = $(if $(call IsDefined,$(1)),$($(1)),$(2)) 5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: CheckValue variable 5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Print the name, definition, and value of a variable, for testing make 6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# utilities. 6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Example: 6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# foo = $(call streq,a,a) 6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# $(call CheckValue,foo) 6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Example Output: 6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# CHECKVALUE: foo: $(call streq,,) - true 6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoCheckValue = $(info CHECKVALUE: $(1): $(value $(1)) - $($(1))) 6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: CopyVariable src dst 7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Copy the value of the variable 'src' to 'dst', taking care to not define 'dst' 7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# if 'src' is undefined. The destination variable must be undefined. 7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoCopyVariable = \ 7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(call AssertValue,$(call IsUndefined,$(2)),destination is already defined)\ 7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(if $(call IsUndefined,$(1)),,\ 7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(call Set,$(2),$($(1)))) 7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: Assert value message 7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Check that a value is true, or give an error including the given message 8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoAssert = $(if $(1),,\ 8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(error Assertion failed: $(2))) 8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Function: AssertEqual variable expected-value 8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# 8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Check that the value of a variable is 'expected-value'. 8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoAssertEqual = \ 8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(if $(call streq,$($(1)),$(2)),,\ 8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(error Assertion failed: $(1): $(value $(1)) - $($(1)) != $(2))) 9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 9177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao### 9277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Clean up make behavior 9377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 9477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Cancel all suffix rules. We don't want no stinking suffix rules. 9577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao.SUFFIXES: 9677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 9777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao### 9877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# Debugging 9977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 10077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# General debugging rule, use 'make print-XXX' to print the definition, value 10177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao# and origin of XXX. 10277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaomake-print-%: 10377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao $(error PRINT: $(value $*) = "$($*)" (from $(origin $*))) 104