Android Makefile

命令

  • 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/,那么

预置宏与预置变量

  1. my-dir 由编译系统提供,返回 Android.mk 当前所在的路径(包含Android.mk文件的目录)。
  2. LOCAL_MODULE 生成模块的名称(注意应用名是LOCAL_PACKAGE_NAME)
  3. LOCAL_PACKAGE_NAME package的名字,这个名字在脚本中将标识这个app或package。

  4. LOCAL_SRC_FILES 基于LOCAL_PATH ,此变量赋值所有要编译的文件。如果是java文件可以赋值 $(call all-java-files-under , src )

  5. 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  

  6. LOCAL_MODULE_RELATIVE_PATH:指定动态库的相对路径,以各自编译对象放置的目录为参考。

  7. 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

https://www.jianshu.com/p/ee2454800e27

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值