Makefile特性记录

xiaoxiao2025-10-12  17

makefile的规则

target ... : prerequisites ... command ... ...

target可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是makefile的规则。也就是makefile中最核心的内容。

书写规则

规则包含两个部分,一个是依赖关系,一个是生成目标的方法。

在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。

.mk 文件中,= 、:= 、?= 、+= 的区别

= 是最基本的赋值 := 是覆盖之前的值 ?= 是如果没有被赋值过就赋予等号后面的值

+= 是添加等号后面的值

而 = 与 := 的区别在于,= 会在makefile 展开后再决定变量的值,即最后被指定的值

eg:

x = foo y = $(x) bar x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

而:= 表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

make file中ifneq含义

ifneq是比较两个参数是否相同。

ifneq ($(BOARD_HAVE_BLUETOOTH_BCM),)

第二个参数空就是NULL

意思是$(BOARD_HAVE_BLUETOOTH_BCM)的值不是NULL就可以进行下面的编译处理

$(BOARD_HAVE_BLUETOOTH_BCM)是获取make file中的环境变量或者宏定义 ---- BOARD_HAVE_BLUETOOTH_BCM的值。

Makefile三个非常有用的变量

分别是$@,$^,$<:

$@--目标文件$^--所有的依赖文件$<--第一个依赖文件

Android.mk中打印输出信息

在Android.mk中打印输出信息的方法是:$(warning string)或者$(error string)  $(info string)

出变量方式为:$(warning $(var))

$(warning "platform") $(warning "platform = $(TARGET_BOARD_PLATFORM)") $(warning $(TARGET_BOARD_PLATFORM))

mk文件中过滤

ifneq ($(filter msm8998 sdm845,$(TARGET_BOARD_PLATFORM)),) ...... endif

 

转载请注明原文地址: https://www.6miu.com/read-5037774.html

最新回复(0)