MakeFile 初识

324 阅读1分钟

什么是makefile?

简单的理解为一个工程文件的编译规则,指定了哪些文件先编译,哪些文件后编译,哪些不需要编译等等。

makefile 规则

简单的makefile 文件

test:hello.c  
	gcc -o hello hello.c
clean:
	rm -f hello 

特别主意:每个命令前必须是一个TAB符,不可以用空格。

1. 命令格式

target:required
<TAB>commond

target 就是要生成文件的名称,可以是OBJ文件或可执行文件, 或者一个命令 例如: clean。

required 就是需要依赖的文件,源码,可以有多个。

commond 就是生成目标文件时执行的命令,过程中可以有多个命令, 每个命令占据一行。

2. makefile文件中变量的定义

变量定义的语法形式

 immediate = deffered (递归赋值)
 immediate ?=deffered (条件赋值)
 immediate :=immediate(简单赋值)
 immediate +=deffered or immediate (追加赋值)
 define immediate 
 deffered
 endef

在GNU make 对变量的赋值两种方式,立即变量,延时变量。

延时变量:真正使用的时候才确定值,使用 = ,?= define 定义的是延时变量。

立即变量::= 赋值是立即变量

3. makefile 常用函数

函数调用格式如下:

$(function  arguments)

这里的function 是函数名,arguments 是参数。 函数名和参数之间用空格隔开,后者用tab隔开,多个参数用 ,隔开。

  • $(subst from,to, text) 在text 文本中 from 替换每一个to 例如:$(subst EE ,ee, free fresh) 运行结果为 "frEE fresh "

  • $(patsubst pattern ,replacement ,text ) 在 text 中符合pattern 规则的 用 replacement 来替换。 例如:$(patsubstr %.c,%.o , test.c a.c b.c) 把所有.c 文件替换为.o 文件。 运行结果为:"test.o a.o c.o"

  • $(strip string) 去掉前导和尾端的空格,并且中间的多个空格变为一个空格。

  • $(findstring target, in ) 在 in 中查找 target ,如果找到返回target,否则返回空 例如:(findstringa,c,b,a)那么返回a,如果(findstring a, c,b,a) 那么返回 a, 如果 (findstring a, c,b) 那么返回 " "。

  • $(filter pattern... , text ) 过滤 text 中 不符合pattern 的内容。

  • $(filtere-out pattern..., text) filter 的反函数 保留text符合中符合 pattern的内容。

  • $(sort list) list 中的字按字母排序,并且去掉重复的,单个空格隔开。

  • $(dir names...)