1*9e94795aSAndroid Build Coastguard Worker# 2*9e94795aSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project 3*9e94795aSAndroid Build Coastguard Worker# 4*9e94795aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*9e94795aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*9e94795aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*9e94795aSAndroid Build Coastguard Worker# 8*9e94795aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*9e94795aSAndroid Build Coastguard Worker# 10*9e94795aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*9e94795aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*9e94795aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*9e94795aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*9e94795aSAndroid Build Coastguard Worker# limitations under the License. 15*9e94795aSAndroid Build Coastguard Worker# 16*9e94795aSAndroid Build Coastguard Worker 17*9e94795aSAndroid Build Coastguard Worker########################################################### 18*9e94795aSAndroid Build Coastguard Worker## Convert to lower case without requiring a shell, which isn't cacheable. 19*9e94795aSAndroid Build Coastguard Worker## 20*9e94795aSAndroid Build Coastguard Worker## $(1): string 21*9e94795aSAndroid Build Coastguard Worker########################################################### 22*9e94795aSAndroid Build Coastguard Workerto-lower=$(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1)))))))))))))))))))))))))) 23*9e94795aSAndroid Build Coastguard Worker 24*9e94795aSAndroid Build Coastguard Worker########################################################### 25*9e94795aSAndroid Build Coastguard Worker## Convert to upper case without requiring a shell, which isn't cacheable. 26*9e94795aSAndroid Build Coastguard Worker## 27*9e94795aSAndroid Build Coastguard Worker## $(1): string 28*9e94795aSAndroid Build Coastguard Worker########################################################### 29*9e94795aSAndroid Build Coastguard Workerto-upper=$(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1)))))))))))))))))))))))))) 30*9e94795aSAndroid Build Coastguard Worker 31*9e94795aSAndroid Build Coastguard Worker# Test to-lower and to-upper 32*9e94795aSAndroid Build Coastguard Workerlower := abcdefghijklmnopqrstuvwxyz-_ 33*9e94795aSAndroid Build Coastguard Workerupper := ABCDEFGHIJKLMNOPQRSTUVWXYZ-_ 34*9e94795aSAndroid Build Coastguard Worker 35*9e94795aSAndroid Build Coastguard Workerifneq ($(lower),$(call to-lower,$(upper))) 36*9e94795aSAndroid Build Coastguard Worker $(error to-lower sanity check failure) 37*9e94795aSAndroid Build Coastguard Workerendif 38*9e94795aSAndroid Build Coastguard Worker 39*9e94795aSAndroid Build Coastguard Workerifneq ($(upper),$(call to-upper,$(lower))) 40*9e94795aSAndroid Build Coastguard Worker $(error to-upper sanity check failure) 41*9e94795aSAndroid Build Coastguard Workerendif 42*9e94795aSAndroid Build Coastguard Worker 43*9e94795aSAndroid Build Coastguard Workerlower := 44*9e94795aSAndroid Build Coastguard Workerupper := 45*9e94795aSAndroid Build Coastguard Worker 46*9e94795aSAndroid Build Coastguard Worker########################################################### 47*9e94795aSAndroid Build Coastguard Worker## Returns true if $(1) and $(2) are equal. Returns 48*9e94795aSAndroid Build Coastguard Worker## the empty string if they are not equal. 49*9e94795aSAndroid Build Coastguard Worker########################################################### 50*9e94795aSAndroid Build Coastguard Workerdefine streq 51*9e94795aSAndroid Build Coastguard Worker$(strip $(if $(strip $(1)),\ 52*9e94795aSAndroid Build Coastguard Worker $(if $(strip $(2)),\ 53*9e94795aSAndroid Build Coastguard Worker $(if $(filter-out __,_$(subst $(strip $(1)),,$(strip $(2)))$(subst $(strip $(2)),,$(strip $(1)))_),,true), \ 54*9e94795aSAndroid Build Coastguard Worker ),\ 55*9e94795aSAndroid Build Coastguard Worker $(if $(strip $(2)),\ 56*9e94795aSAndroid Build Coastguard Worker ,\ 57*9e94795aSAndroid Build Coastguard Worker true)\ 58*9e94795aSAndroid Build Coastguard Worker )) 59*9e94795aSAndroid Build Coastguard Workerendef 60*9e94795aSAndroid Build Coastguard Worker 61*9e94795aSAndroid Build Coastguard Worker########################################################### 62*9e94795aSAndroid Build Coastguard Worker## Convert "a b c" into "a:b:c" 63*9e94795aSAndroid Build Coastguard Worker########################################################### 64*9e94795aSAndroid Build Coastguard Workerdefine normalize-path-list 65*9e94795aSAndroid Build Coastguard Worker$(subst $(space),:,$(strip $(1))) 66*9e94795aSAndroid Build Coastguard Workerendef 67*9e94795aSAndroid Build Coastguard Worker 68*9e94795aSAndroid Build Coastguard Worker########################################################### 69*9e94795aSAndroid Build Coastguard Worker## Convert "a b c" into "a,b,c" 70*9e94795aSAndroid Build Coastguard Worker########################################################### 71*9e94795aSAndroid Build Coastguard Workerdefine normalize-comma-list 72*9e94795aSAndroid Build Coastguard Worker$(subst $(space),$(comma),$(strip $(1))) 73*9e94795aSAndroid Build Coastguard Workerendef 74*9e94795aSAndroid Build Coastguard Worker 75*9e94795aSAndroid Build Coastguard Worker########################################################### 76*9e94795aSAndroid Build Coastguard Worker## Read the word out of a colon-separated list of words. 77*9e94795aSAndroid Build Coastguard Worker## This has the same behavior as the built-in function 78*9e94795aSAndroid Build Coastguard Worker## $(word n,str). 79*9e94795aSAndroid Build Coastguard Worker## 80*9e94795aSAndroid Build Coastguard Worker## The individual words may not contain spaces. 81*9e94795aSAndroid Build Coastguard Worker## 82*9e94795aSAndroid Build Coastguard Worker## $(1): 1 based index 83*9e94795aSAndroid Build Coastguard Worker## $(2): value of the form a:b:c... 84*9e94795aSAndroid Build Coastguard Worker########################################################### 85*9e94795aSAndroid Build Coastguard Worker 86*9e94795aSAndroid Build Coastguard Workerdefine word-colon 87*9e94795aSAndroid Build Coastguard Worker$(word $(1),$(subst :,$(space),$(2))) 88*9e94795aSAndroid Build Coastguard Workerendef 89*9e94795aSAndroid Build Coastguard Worker 90*9e94795aSAndroid Build Coastguard Worker########################################################### 91*9e94795aSAndroid Build Coastguard Worker## Read a colon-separated sublist out of a colon-separated 92*9e94795aSAndroid Build Coastguard Worker## list of words. 93*9e94795aSAndroid Build Coastguard Worker## This has similar behavior to the built-in function 94*9e94795aSAndroid Build Coastguard Worker## $(wordlist s,e,str) except both the input and output 95*9e94795aSAndroid Build Coastguard Worker## word lists are colon-separated. 96*9e94795aSAndroid Build Coastguard Worker## 97*9e94795aSAndroid Build Coastguard Worker## The individual words may not contain spaces. 98*9e94795aSAndroid Build Coastguard Worker## 99*9e94795aSAndroid Build Coastguard Worker## $(1): 1 based index start 100*9e94795aSAndroid Build Coastguard Worker## $(2): 1 based index end (can be 0) 101*9e94795aSAndroid Build Coastguard Worker## $(3): value of the form a:b:c... 102*9e94795aSAndroid Build Coastguard Worker########################################################### 103*9e94795aSAndroid Build Coastguard Worker 104*9e94795aSAndroid Build Coastguard Workerdefine wordlist-colon 105*9e94795aSAndroid Build Coastguard Worker$(subst $(space),:,$(wordlist $(1),$(2),$(subst :,$(space),$(3)))) 106*9e94795aSAndroid Build Coastguard Workerendef 107*9e94795aSAndroid Build Coastguard Worker 108*9e94795aSAndroid Build Coastguard Worker########################################################### 109*9e94795aSAndroid Build Coastguard Worker## Convert "a=b c= d e = f = g h=" into "a=b c=d e= f=g h=" 110*9e94795aSAndroid Build Coastguard Worker## 111*9e94795aSAndroid Build Coastguard Worker## $(1): list to collapse 112*9e94795aSAndroid Build Coastguard Worker## $(2): if set, separator word; usually "=", ":", or ":=" 113*9e94795aSAndroid Build Coastguard Worker## Defaults to "=" if not set. 114*9e94795aSAndroid Build Coastguard Worker########################################################### 115*9e94795aSAndroid Build Coastguard Worker 116*9e94795aSAndroid Build Coastguard Workerdefine collapse-pairs 117*9e94795aSAndroid Build Coastguard Worker$(strip \ 118*9e94795aSAndroid Build Coastguard Worker$(eval _cpSEP := $(strip $(if $(2),$(2),=)))\ 119*9e94795aSAndroid Build Coastguard Worker$(eval _cpLHS :=)\ 120*9e94795aSAndroid Build Coastguard Worker$(eval _cpRET :=)\ 121*9e94795aSAndroid Build Coastguard Worker$(foreach w,$(subst $(space)$(_cpSEP),$(_cpSEP),$(strip \ 122*9e94795aSAndroid Build Coastguard Worker $(subst $(_cpSEP),$(space)$(_cpSEP)$(space),$(1)))),\ 123*9e94795aSAndroid Build Coastguard Worker $(if $(findstring $(_cpSEP),$(w)),\ 124*9e94795aSAndroid Build Coastguard Worker $(eval _cpRET += $(_cpLHS))$(eval _cpLHS := $(w)),\ 125*9e94795aSAndroid Build Coastguard Worker $(eval _cpRET += $(_cpLHS)$(w))$(eval _cpLHS :=)))\ 126*9e94795aSAndroid Build Coastguard Worker$(if $(_cpLHS),$(_cpRET)$(space)$(_cpLHS),$(_cpRET))\ 127*9e94795aSAndroid Build Coastguard Worker$(eval _cpSEP :=)\ 128*9e94795aSAndroid Build Coastguard Worker$(eval _cpLHS :=)\ 129*9e94795aSAndroid Build Coastguard Worker$(eval _cpRET :=)) 130*9e94795aSAndroid Build Coastguard Workerendef 131*9e94795aSAndroid Build Coastguard Worker 132*9e94795aSAndroid Build Coastguard Worker# Sanity check for collapse-pairs. 133*9e94795aSAndroid Build Coastguard Workerifneq (a=b c=d e= f=g h=,$(call collapse-pairs,a=b c= d e = f = g h=)) 134*9e94795aSAndroid Build Coastguard Worker $(error collapse-pairs sanity check failure) 135*9e94795aSAndroid Build Coastguard Workerendif 136*9e94795aSAndroid Build Coastguard Workerifneq (a:=b c:=d e:=f g:=h,$(call collapse-pairs,a:=b c:= d e :=f g := h,:=)) 137*9e94795aSAndroid Build Coastguard Worker $(error collapse-pairs sanity check failure) 138*9e94795aSAndroid Build Coastguard Workerendif 139*9e94795aSAndroid Build Coastguard Worker 140*9e94795aSAndroid Build Coastguard Worker########################################################### 141*9e94795aSAndroid Build Coastguard Worker## Given a list of pairs, if multiple pairs have the same 142*9e94795aSAndroid Build Coastguard Worker## first components, keep only the first pair. 143*9e94795aSAndroid Build Coastguard Worker## 144*9e94795aSAndroid Build Coastguard Worker## $(1): list of pairs 145*9e94795aSAndroid Build Coastguard Worker## $(2): the separator word, such as ":", "=", etc. 146*9e94795aSAndroid Build Coastguard Workerdefine uniq-pairs-by-first-component 147*9e94795aSAndroid Build Coastguard Worker$(eval _upbfc_fc_set :=)\ 148*9e94795aSAndroid Build Coastguard Worker$(strip $(foreach w,$(1), $(eval _first := $(word 1,$(subst $(2),$(space),$(w))))\ 149*9e94795aSAndroid Build Coastguard Worker $(if $(filter $(_upbfc_fc_set),$(_first)),,$(w)\ 150*9e94795aSAndroid Build Coastguard Worker $(eval _upbfc_fc_set += $(_first)))))\ 151*9e94795aSAndroid Build Coastguard Worker$(eval _upbfc_fc_set :=)\ 152*9e94795aSAndroid Build Coastguard Worker$(eval _first:=) 153*9e94795aSAndroid Build Coastguard Workerendef 154