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