1# vars for use by utils
2colon := $(empty):$(empty)
3underscore := $(empty)_$(empty)
4
5# $(call match-word,w1,w2)
6# checks if w1 == w2
7# How it works
8#   if (w1-w2 not empty or w2-w1 not empty) then not_match else match
9#
10# returns true or empty
11#$(warning :$(1): :$(2): :$(subst $(1),,$(2)):) \
12#$(warning :$(2): :$(1): :$(subst $(2),,$(1)):) \
13#
14define match-word
15$(strip \
16  $(if $(or $(subst $(1),$(empty),$(2)),$(subst $(2),$(empty),$(1))),,true) \
17)
18endef
19
20# $(call find-word-in-list,w,wlist)
21# finds an exact match of word w in word list wlist
22#
23# How it works
24#   fill wlist spaces with colon
25#   wrap w with colon
26#   search word w in list wl, if found match m, return stripped word w
27#
28# returns stripped word or empty
29define find-word-in-list
30$(strip \
31  $(eval wl:= $(colon)$(subst $(space),$(colon),$(strip $(2)))$(colon)) \
32  $(eval w:= $(colon)$(strip $(1))$(colon)) \
33  $(eval m:= $(findstring $(w),$(wl))) \
34  $(if $(m),$(1),) \
35)
36endef
37
38# $(call match-word-in-list,w,wlist)
39# does an exact match of word w in word list wlist
40# How it works
41#   if the input word is not empty
42#     return output of an exact match of word w in wordlist wlist
43#   else
44#     return empty
45# returns true or empty
46define match-word-in-list
47$(strip \
48  $(if $(strip $(1)), \
49    $(call match-word,$(call find-word-in-list,$(1),$(2)),$(strip $(1))), \
50  ) \
51)
52endef
53
54# $(call match-prefix,p,delim,w/wlist)
55# matches prefix p in wlist using delimiter delim
56#
57# How it works
58#   trim the words in wlist w
59#   if find-word-in-list returns not empty
60#     return true
61#   else
62#     return empty
63#
64define match-prefix
65$(strip \
66  $(eval w := $(strip $(1)$(strip $(2)))) \
67  $(eval text := $(patsubst $(w)%,$(1),$(3))) \
68  $(if $(call match-word-in-list,$(1),$(text)),true,) \
69)
70endef
71
72# ----
73# The following utilities are meant for board platform specific
74# featurisation
75
76# $(call get-vendor-board-platforms,v)
77# returns list of board platforms for vendor v
78define get-vendor-board-platforms
79$($(1)_BOARD_PLATFORMS)
80endef
81
82# $(call is-board-platform,bp)
83# returns true or empty
84define is-board-platform
85$(call match-word,$(1),$(TARGET_BOARD_PLATFORM))
86endef
87
88# $(call is-not-board-platform,bp)
89# returns true or empty
90define is-not-board-platform
91$(if $(call match-word,$(1),$(TARGET_BOARD_PLATFORM)),,true)
92endef
93
94# $(call is-board-platform-in-list,bpl)
95# returns true or empty
96define is-board-platform-in-list
97$(call match-word-in-list,$(TARGET_BOARD_PLATFORM),$(1))
98endef
99
100# $(call is-vendor-board-platform,vendor)
101# returns true or empty
102define is-vendor-board-platform
103$(strip \
104  $(call match-word-in-list,$(TARGET_BOARD_PLATFORM),\
105    $(call get-vendor-board-platforms,$(1)) \
106  ) \
107)
108endef
109
110# $(call is-chipset-in-board-platform,chipset)
111# does a prefix match of chipset in TARGET_BOARD_PLATFORM
112# uses underscore as a delimiter
113#
114# returns true or empty
115define is-chipset-in-board-platform
116$(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM))
117endef
118
119# $(call is-chipset-prefix-in-board-platform,prefix)
120# does a chipset prefix match in TARGET_BOARD_PLATFORM
121# assumes '_' and 'a' as the delimiter to the chipset prefix
122#
123# How it works
124#   if ($(prefix)_ or $(prefix)a match in board platform)
125#     return true
126#   else
127#     return empty
128#
129define is-chipset-prefix-in-board-platform
130$(strip \
131  $(eval delim_a := $(empty)a$(empty)) \
132  $(if \
133    $(or \
134      $(call match-prefix,$(1),$(delim_a),$(TARGET_BOARD_PLATFORM)), \
135      $(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)), \
136    ), \
137    true, \
138  ) \
139)
140endef
141
142#----
143# The following utilities are meant for Android Code Name
144# specific featurisation
145#
146# refer http://source.android.com/source/build-numbers.html
147# for code names and associated sdk versions
148CUPCAKE_SDK_VERSIONS := 3
149DONUT_SDK_VERSIONS   := 4
150ECLAIR_SDK_VERSIONS  := 5 6 7
151FROYO_SDK_VERSIONS   := 8
152GINGERBREAD_SDK_VERSIONS := 9 10
153HONEYCOMB_SDK_VERSIONS := 11 12 13
154ICECREAM_SANDWICH_SDK_VERSIONS := 14 15
155JELLY_BEAN_SDK_VERSIONS := 16 17 18
156
157# $(call is-platform-sdk-version-at-least,version)
158# version is a numeric SDK_VERSION defined above
159define is-platform-sdk-version-at-least
160$(strip \
161  $(if $(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= $(1) ))" )), \
162    true, \
163  ) \
164)
165endef
166
167# $(call is-android-codename,codename)
168# codename is one of cupcake,donut,eclair,froyo,gingerbread,icecream
169# please refer the $(codename)_SDK_VERSIONS declared above
170define is-android-codename
171$(strip \
172  $(if \
173    $(call match-word-in-list,$(PLATFORM_SDK_VERSION),$($(1)_SDK_VERSIONS)), \
174    true, \
175  ) \
176)
177endef
178
179# $(call is-android-codename-in-list,cnlist)
180# cnlist is combination/list of android codenames
181define is-android-codename-in-list
182$(strip \
183  $(eval acn := $(empty)) \
184    $(foreach \
185      i,$(1),\
186      $(eval acn += \
187        $(if \
188          $(call \
189            match-word-in-list,\
190            $(PLATFORM_SDK_VERSION),\
191            $($(i)_SDK_VERSIONS)\
192          ),\
193          true,\
194        )\
195      )\
196    ) \
197  $(if $(strip $(acn)),true,) \
198)
199endef
200