命令
- call用于调用其它函数, 参数以逗号分隔,函数原型:
$(call <expression>,<parm1>,<parm2>,<parm3>,…)
当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参数<parm1>,<parm2>,<parm3>依次取代。
Makefile函数调用形式:$(<function> <arguments>)或${<function> <arguments>},<function>就是函数名,<arguments>为函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。call函数的返回值就是<expression>的返回值。
- eval: 在Makefile中构造一个可变的规则结构关系(依赖关系链),其中可以使用其它变量和函数。函数“eval”对它的参数进行展开,展开的结果作为Makefile的一部分,make可以对展开内容进行语法解析。“eval”函数执行时会对它的参数进行两次展开。第一次展开过程发是由函数本身完成的,第二次是函数展开后的结果被作为Makefile内容时由make解析时展开的。其实就是动态生成Makefile脚本,类似js中的eval(执行字符串形式的js代码),eval函数没有返回值。
- wildcard:用来扩展通配符。在Makefile中使用通配符时存在一定的局限性,通配符自动在规则中进行,但当通配符用在变量或者函数定义中时,通配符将失效,make不会将其展开,而是将其作为简单的字符串处理,这种情况下要使通配符有效,则需要使用wildcard函数。
-
foreach:做循环用的,函数原型是$(foreach <var>,<list>,<text>)
foreach的意思是,把参数<list>中的单词逐一取出放到参数<var> 所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,所返回的每个字符串会以空格分隔,当整个循环结束时,把<text>所返回的每个字符串所组成的字符串(以空格分隔)作为foreach函数的返回值。举一个简单的例子:
names := a b c d
files := $(foreach n,$(names),$(n).o)
$(files)的值是“a.o b.o c.o d.o”
-
$(src_files:$(LOCAL_PATH)/%=%) 进行了文本替换,”%”表示一个或多个任意字符,这里是去掉cpp/c文件路径中的$(LOCAL_PATH)部分,因为LOCAL_SRC_FILES文件的路径需要是Android.mk的相对路径。
-
include(变量名) “变量名”指向一个Makefile文件
命令定义的位置
在android源码目录下的build/目录下可以搜到命令的definitions,例如:
include $(call all-makefiles-under,$(LOCAL_PATH))
显然,这里的`all-makefiles-under`是一条命令,那么,这条命令的定义在什么位置呢?
到源码顶层目录source/下,进入其子目录build/,那么
预置宏与预置变量
- my-dir 由编译系统提供,返回 Android.mk 当前所在的路径(包含Android.mk文件的目录)。
- LOCAL_MODULE 生成模块的名称(注意应用名是LOCAL_PACKAGE_NAME)
-
LOCAL_PACKAGE_NAME package的名字,这个名字在脚本中将标识这个app或package。
-
LOCAL_SRC_FILES 基于LOCAL_PATH ,此变量赋值所有要编译的文件。如果是java文件可以赋值 $(call all-java-files-under , src )
-
LOCAL_MODULE_PATH: 目标的安装路径。如果没有明确指出LOCAL_MODULE_PATH,LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在,规则如下:
LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH)) ifeq ($(LOCAL_MODULE_PATH),) #LOCAL_MODULE_CLASS := LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)) $(info *******//$(LOCAL_MODULE_PATH)) ifeq ($(strip $(LOCAL_MODULE_PATH)),) $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)") endif endif
-
LOCAL_MODULE_RELATIVE_PATH:指定动态库的相对路径,以各自编译对象放置的目录为参考。
-
LOCAL_MODULE_CLASS 在采用预装这种形式的时候,该变量来指定预装的模块的类型
编译命令
参考
https://blog.csdn.net/gaojinshan/article/details/45500407
https://blog.csdn.net/qq_34305735/article/details/78688479
https://blog.csdn.net/u014135607/article/details/78545088
https://developer.android.com/ndk/guides/android_mk?hl=zh-cn
https://blog.csdn.net/baidu_31872269/article/details/59110150