Android.mk 分析android buid工程需要的makefile知识点总结

1.0 make -C /home/wangxiancan/android -f build/core/main.mk all_modules

   -C 表示进入到某目录 执行(解析)其中的makefile

   -f  表示将后面的文件当做makefile文件解析 (make命令默认只识别如Makefile命名的文件,不过你会发现-C后面目录下已经有一个makefile了,并且这个makefile只一句话:include build/core/main.mk,那这个-f 选项是不是重复了呢????)

2.0 makefile  基本上就三个东西  依赖关系,命令规则,变量和函数,它的执行顺序,多线程解析的,可不是想shell脚本一样执行,而是直接更加目标文件,查找依赖关系,然后执行命令规则生成文件,里面唯一可以执行的,就是命令规则,在这里面可以用shell脚本的命令,可以调用shell里面的语法,至于 makefile中的变量和函数,也只有在这个命令规则中使用的时候才会调用,函数其实和变量用法一样,所以就不要想着突然在Android.mk文件中echo 了,这不是shell,除非echo放在命令规则里面,而且该命令规则会被执行

3.0 怎么在makefile里面输出?

一种办法就是在2.0 说的在命令规则中echo,还有就是 

$(warning "hello world!")  $(erro "no, I'm dying") 其中原理就不摘抄了:https://blog.csdn.net/daoshuti/article/details/72732964

4.0 makefile 中自定义函数:

define foo1

    @echo "My name is $(0)"

endef

build/core/definitions.mk中很多函数。有一篇文章提到自定义函数的调用方法,$(call foo1 var0 var1 ...) 不过Android build中也有直接$(foo1 var0) 这样的调用

这一篇博客所说,自定义函数的调用其实是通过 makefile中的预定义函数call 来间接调用的,似乎却有道理,不过上面确实像调用预定于函数一样直接用了,没有深入研究,是否和函数预先声明顺序有类似关系?

4.0 include 被包含的文件相当于在当前位置直接展开

5.0 makefile中预定义函数,即makefile自身支持的直接用的基本函数,它的调用就 $(fun var0 var1...)

常用举例: 5.1 排序函数 $(sort <list>) 给字符串 <list> 中的单词排序 (升序)  

                  5.2 加前缀函数 $(addprefix <prefix>,<names...>)把前缀 <prefix> 加到 <names> 中的每个单词前面

                  5.3 循环 $(foreach <var>,<list>,<text>)
这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行< text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。

                5.4 $(eval text) 它的意思是 text 的内容将作为makefile的一部分而被make解析和执行  

                5.5 $(filter PATTERN…,TEXT) 函数名称:过滤函数—filter。 函数功能:过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所有符合此模式的单词。

 

猜你喜欢

转载自blog.csdn.net/u012459903/article/details/88345510