Make 命令的使用
当我们执行 make 命令时,它会去当前目录下查找名为 Makefile 的文件,并解析执行命令。
make 命令后也可以跟参数:
- make -f Makefile.build:-f 指定文件,不再使用名为 Makefile 文件
- make -C a/ -f Makefile.build:-C 指定目录,切换到 a目录下
- make -C a/ -f Makefile.build other_target:不再默认生成第一个目标,生成指定的目标
即时变量和延时变量
变量的定义语法形式如下:
A = xxx //延时变量 B ?= xxx //延时变量,只有第一次定义时的赋值有效;如果曾经定义过,此赋值无效 C := xxx //即时变量 D +=yyy //如果D在前面是延时变量,那么现在它依然是延时变量;如果D在前面是即时变量,那么它现在还是即时变量
example:
- A:延时变量,A的值只有在执行后才确定。
- C:延时变量,第二次赋值无效
- B:即时变量:就近原则,后面的值会覆盖原有的值
变量的导出(export)
在编译程序时,我们会不断地使用make -C dir 切换到不同的目录,执行其他目录的Makefile。如果希望让某个变量的值在所有目录中都可见,要把它export出来
CC := $(CROSS_COMPILE)gcc export CC
Makefile 使用 shell命令
TOP_DIR := $(shell pwd)
Makefile 放置第一个目标
执行 make 命令时,如果不指定目标,那么它默认去生成第一个默认目标,因此第一个目标的位置很重要
first_target: //放在文件前面 ... //其他代码,比如include等 first_targrt: $(xxx) $(yyy) //在文件后面完善依赖 command
伪目标(.PHONY)
我们 Makefile 中有这样的目标:
clean: rm -f $(shell find -name "*.o") rm -f $(TARGET)
如果当前目录下面正好有名为 clean 的文件,那么执行clean时,就不会执行那些删除命令。
这时,可以通过.PHONY,将 clean 设置为伪目标,这样删除命令即可正确执行。
.PHONY: clean
常用函数
foreach
wildcard
filter
语法:$(filter pattern..., text)
作用:把 text 中 符合pattern的字符串过滤出来
用法:
obj-y :=a.o b.o c/ d/ DIR := $(filter %/, $(obj-y)) //结果为c/ d/
filter-out
语法:$(filter-out pattern..., text)
作用:把 text 中 符合pattern的字符串过滤扔掉
用法:
obj-y :=a.o b.o c/ d/ DIR := $(filter-out %/, $(obj-y)) //结果为a.o b.o
patsubst
语法:$(patsubst pattern, replacement,text)
作用:寻找text 中 符合pattern的字符,并替换为replacement
用法:
subdir-y := c/ d/ subdir-y := $(patsubst %/, %, $(subdir-y)) //结果为c d
总结
文章主要介绍了makefile使用过程中的一些基础知识,知识点比较散。
- make -C
- make -f
- := , ?=, = , +=
- export
- .PHONY
- filter函数
- filter-out函数
- patsubst函数