xref: /aosp_15_r20/external/compiler-rt/make/util.mk (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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