filter

语法:
$(filter key1 key2,$(VAR))
功能:
从 VAR 中将包含有key1或者key2的过滤出来。
例如:

1
2
3
4
5
VAR = a b c d,  key1=a,key2=e
$(filter key1 key2,$(VAR))

#### 结果:
a

filter-out

语法:
$(filter-out key1 key2,$(VAR))
功能:
从 VAR 中将包含有key1或者key2的过滤掉,保留其他的。
例如:

1
2
3
4
5
VAR = a b c d,  key1=a,key2=e
$(filter-out key1 key2,$(VAR))

#### 结果:
b c d

call

语法:
$(call VARIABLE,PARAM,PARAM,...)
功能:
在执行时,将参数PARAM依次赋给临时变量$(1),$(2),...。然后再对VARIABLE展开后的表达式进行处理。
例如:

1
2
3
4
5
define FUNC1
$(info echo 4-$(1) $(2))
endef

$(call FUNC1,hello,wolrd)

inherit-product

使用如下:

1
$(call inherit-product, device/google/atv/products/atv_base.mk)

表示引入 device/google/atv/products/atv_base.mk 文件并执行,和 include 有点像,区别在于多处理了几件事情:

  • 1、继承通过参数传入的 Makefile 文件中的所有变量;
  • 2、在 .INHERITS_FROM 变量中记录下这些继承关系;
  • 3、在 ALL_PRODUCTS 变量中标识出当前操作的 Makefile 文件已经被访问过了(以免重复访问)。

具体可以参考下边连接,或者去看函数定义,源码在:build/core/product.mk

参考:《Difference between call inherit-product and include in AOSP makefiles?》

inherit-product-if-exists

如下:

1
$(call inherit-product-if-exists, frameworks/base/data/sounds/AudioTv.mk)

功能和 inherit-product 一样,只是调用时候检查下文件是否存在,存在就加载,否则直接跳过。

ifeq/ifneq

判断两个参数是否相等/不相等(Android.mk中没有 || && 操作)。

1
2
3
4
5
6
7
8
9
10
11
ifeq ($(MTK_LIVETV_SUPPORT),true)
...
else
...
endif

ifneq (,$(filter mt8888_512m%, $(TARGET_PRODUCT)))
...
else
...
endif

ifdef/ifndef

判断是否有定义某个值。

1
2
3
ifndef ANDROID_CFG_FILES_FOLDER
export ANDROID_CFG_FILES_FOLDER=device/mediatek/mt8888/configs
endif

打印信息

1
2
3
4
5
$(info string)
$(warning string)
$(error string)
# 打印变量
$(warning $(var))