Makefile规则
一个简单的Makefile文件包含一系列的“规则”,其样式如下:
目标(target)...依赖(prerequiries)
目标(target)通常是要生成的文件的名称,可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,诸如`clean’。
依赖是用来产生目标的材料(比如源文件),一个目标经常有几个依赖。
命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行。
目标 :依赖1 依赖2 ...
当“目标文件不存在“,或某个依赖文件比目标文件”新“,则执行”命令“
注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。这是容易出错的地方。
通常,如果一个依赖发生了变化,就需要规则调用命令以更新或创建目标。但是并非所有的目标都有依赖,例如,目标“clern”的作用是清除文件,它没有依赖。
规则一般是用于解释怎样和何时重建目标。make首先调用命令处理依赖,进而才能创建或更新目标。当然,一个规则也可以是用于解释怎样和何时执行一个动作,即打印提示信息。
一个Makefile文件可以包含规则以外的其他文本,但一个简单的Makefile文件仅仅需要包含规则。虽然真正的规则比这里展示的例子复杂,但格式是完全一样的。
Makefile的简单使用
Makefile的简单使用
a.通配符 : %.o
$@ 表示目标
$< 表示第一个依赖文件
$^ 表示所有的依赖文件
...仅列出几个常用的通配符
b.假象目标:
执行make[目标](若没有目标执行就执行第一个目标)
例如该txt文件下的Makefile的例子 在Linux下运行 make 则相当于运行 make test !
当文件夹内存在与Makefile内规则要生成的文件同时存在时,Makefile将不会执行该规则。
例:如下列代码所示 文件下存在clean文件,但是我的Makefile想执行clean规则,这里冲突了clean规则将不会被执行!
所以引入 PHONY 假象目标来解决上诉问题
test:a.o b.o c.ogcc -o test a.o b.o c.o%.o : %.cgcc -c -o $@ $
c.即时变量、延时变量,export
简单变量(即时变量)
A := xxx #A的值即可确定
B = xxx #B到使用时才确定
:= #即时变量
= #延时变量
?= #延时变量,如果是第一次定义才有效,如果在前面该变量已定义则忽略这句
+= #附加,它是即时变量还是延时变量取决于前面的定义
A := $(C)B = $(C)C = abcall:@echo $(A)@echo $(B)
运行结果
运行make指令,C为空。
A := $(C)该指令使用时A的值被确定为C,因此打印出空字符
而B = xxx指令是当该指令运行时才确定B被赋予的值,即输出C的最终结果!C的最终结果为abc
常用函数
$(filter pattern...,text)
把text中符合pattern格式的内容,filter(过滤)出来、留下来。
$(wildcard pattern)
pattern所列出的文件是否存在,把存在的文件都列出来。
$(filter-out pattern...,text)
把text中符合pattern格式的内容,filter-out(过滤)出来、扔掉。
$(patsubst pattern,replacement,text)
寻找`text’中符合格式`pattern’的字,用`replacement’替换它们。`pattern’和`replacement’中可以使用通配符。
以上函数用一个实例来表示
A = a b cB = $(foreach f, $(A), $(f).o)//将A中的值全部转化为.o格式C = a b c d/D = $(filter %/, $(C)) //将C中有/的值赋给DE = $(filter-out %/, $(C))//滤除C中含有/的值并赋值给E,即将C中除了/以外的值都赋给Efiles = $(wildcard *.c) //查询文件夹中是否含有.c文件并赋值给filesfiles2 = a.c b.c c.c d.c e.c abcfiles3 = $(wildcard $(files2))//查询该文件夹下是否存在file2s里面存在的文件dep_files = $(patsubst %.c,%.d,$(files2))//将files2中的所有.c转换为.dall:@echo B = $(B)@echo D = $(D)@echo E = $(E)@echo files = $(files)@echo files2 = $(files3)@echo dep_files = $(dep_files)
运行结果
以上是最近学习Makefile的一些浅显的见解,写的不好,烦请各位大佬多多指正!