一、说明
上文我们对acp的Android.mk文件做了一个大致的描述,使得大家对Android.mk文件有了一个初步的认识,下面我们就重点分析下第一行: LOCAL_PATH:= $(call my-dir)
上文我们对acp的Android.mk文件做了一个大致的描述,使得大家对Android.mk文件有了一个初步的认识,下面我们就重点分析下第一行: LOCAL_PATH:= $(call my-dir)
二、LOCAL_PATH
有人就问了,在本Android.mk中又没有使用到LOCAL_PATH,为什么先 要定义这么一个变量呢?为什么规定必须放在所有的include $(CLEAR_VARS)之前呢?
在Android.mk中我们发现有LOCAL_SRC_FILES := acp.的定义,NDK文件中对LOCAL_SRC_FILES 的说明如下:
This is a list of source files that will be built for your module. Only list the files that will be passed to a compiler, since the build system automatically computes dependencies for you.
Note that source files names are all relative to LOCAL_PATH and you can use path components .
Note that source files names are all relative to LOCAL_PATH and you can use path components .
因此在定义LOCAL_SRC_FILES 时已经间接的使用到了LOCAL_PATH变量,即定义LOCAL_SRC_FILES是用的基于当前路径的相对路径。
我们接着看看为什么LOCAL_PATH的定义必须要放到所有的include $(CLEAR_VARS)之前。
LOCAL_PATH通过调用my-dir函数来获取当前的路径,my-dir函数的定义位于core/definitions.mk文件:
# Figure out where we are.
define my-dir
$(strip \
$(eval md_file_ := $$(lastword $$(MAKEFILE_LIST))) \
$(if $(filter $(CLEAR_VARS),$(md_file_)), \
$(error LOCAL_PATH must be set before including $$(CLEAR_VARS)) \
, \
$(patsubst %/,%,$(dir $(md_file_))) \
) \
)
endef
请注意,这里明确的说明了LOCAL_PATH的定义必须要放在任何include $(CLEAR_VARS)语句之前,如果不这么做的话,编译就直接报错,停止不干了。
可是它是怎么判断LOCAL_PATH的定义是在任何include $(CLEAR_VARS)语句之前呢,我们看到有这么一句话:
$(if $(filter $(CLEAR_VARS),$(md_file_))这个判断语句是个关键,我们先看看CLEAR_VARS变量的定义
三、CLEAR_VARS
在build/core/config.mk中有如下明确的定义:
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
而BUILD_SYSTEM的定义在build/core/main.mk文件中:
BUILD_SYSTEM := $(TOPDIR)build/core
BUILD_SYSTEM := $(TOPDIR)build/core
紧接着:
TOPDIR :=即TOPDIR为android源码的根目录, BUILD_SYSTEM= build/core, 所以CLEAR_VARS变量的值就为build/core/clear_vars.mk,当然这个也是相对于Android源码根路径。
得到了CLEAR_VARS变量的值,我们再回到my-dir函数中。
四、my-dir
根据gnu make定义,gnu make 会自动将所有读取的makefile路径都会加入到MAKEFILE_LIST变量中,而且是按照读取的先后顺序添加。
那么,在运行本makefile文件时,$(MAKEFILE_LIST)字符串中最后一个makefile肯定是最后读取的makefile,即$(lastword $(MAKEFILE_LIST))则会返回build/tools/acp/Android.mk,此字符串经过$(eval md_file_ := $$(lastword $$(MAKEFILE_LIST))运算,赋值给了临时变量md_file_。
判断md_file_中是否包含CLEAR_VARS变量的值$(if $(filter $(CLEAR_VARS),$(md_file_)),肯定也就会返回失败,再通过$(patsubst %/,%,$(dir $(md_file_)))函数,则会得到当前路径,即build/tools/acp
如果我们在include $(CLEAR_VARS)之后,再调用my-dir函数,那么$$(lastword $$(MAKEFILE_LIST))肯定就会返回$(BUILD_SYSTEM)/clear_vars.mk,同时,$(patsubst %/,%,$(dir $(md_file_))) 也就会返回$(BUILD_SYSTEM)的值build/core,而不是当前的路径build/tools/acp。
这么一来得到的LOCAL_PATH的值就是错误的值,依赖LOCAL_PATH的其他变量也就更加不可能是正确的了!所以说 ,LOCAL_PATH必须要在任何including $(CLEAR_VARS))之前定义 。
相关推荐
blink-led-stm8s103-makefile-master_stm32_labview_blink_源码.zip
D'RELATIVE_LIBEXEC_PATH="../libexec/qtcreator"' -D'RELATIVE_DATA_PATH="../share/qtcreator"' -D'RELATIVE_DOC_PATH="../share/doc/qtcreator"' -DIDE_LIBRARY_BASENAME=\"lib\" -DQT_CREATOR -DQT_NO_CAST_TO_...
u-boot-1.1.6__Makefile.new
跟我一起写Makefile和Shell的主要命令,对于初学Linux开发非常有用
lcd bling using stm32 and PId
linux unix makefile 编写指南
Blink表演项目代码--KinectV2舞者手势姿势分类--编写Arduino代码_C++_Makefile_下载.zip
3、#export PATH=$PATH:/usr/local/arm/2.95.3/bin //取决于你宿主机上的交叉编译工具路径 #arm-linux-gcc -o gpio_test gpio_test.c //编译应用程序 最终在你的当前文件夹下会生成gpiodrv.o与gpio_test两个文件。...
conan 详解 - (makefile)_files.zip
一套IM完整的UI实现方案_Objective-C_Makefile_下载.zip
Rust重写了pythonweechat-matrix脚本。_Rust_Makefile_下载.zip
uboot编译中的Makefile的解读
Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用...
android编译系统makefile(Android.mk)写法 Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-...
这份文档中用到的所有程序已经被打包并压缩成一个tar.gz文件。以下是这个压缩包解压缩后的目录结构: ncurses | |----> JustForFun -- ...对于每一个示例,我都给出了这些程序调用NCURSES目录下相关文件的路径名。
r16_project_ov2640_20160120不能编译uboot_验证版本parrotv1.0_20170302_1418没有外层目录.7z 开发板:SC3817。全志R16平台点亮OV2640。 切记:一定不要编译uboot。否则,你的LCD没有显示!哈哈哈……
Bazel是一个类似于Make的编译工具,是Google为其内部软件开发的特点量身定制的工具,如今Google...Google认为直接用Makefile构建软件速度太慢,结果不可靠,所以构建了一个新的工具叫做Bazel,Bazel的规则层级更高。
1、修改Makefile文件的交叉编译工具为你的交叉编译工具即可: #TOOLCHAIN= arm-linux- //注释掉 TOOLCHAIN= arm-linux-gnueabihf- //修改为你的交叉编译工具 2、执行编译 make 即可在当前目录得到fastboot工具,...
Linux/unix makefile 的详细介绍,教你如何编写Makefile文件
open DDS的补丁包没有makefile文件集成的功能,补丁包于安装包一起解压配置环境