make: Makefile或makefile文件
make -f othername
make --file=othername 这两个命令使用其他名字的文件make
makefile写法:
target: components[;rule]
<TAB>rule
说明:target依赖于components,其生成规则定义于rule。components中有一个文件比target新,rule就执行
例如:
main: main.o
gcc -o $@ $^
..c.o:
gcc -o $<
说明:以上后三行是隐含规则。只不过隐含规则里是CC,首先要CC=gcc
两条隐含规则:
$(CC) $(CFLAGS) $@ $<
$(CC) -c $< $@
1).PHONY:clean
clean:
-rm -f *.o
说明:.PHONY说明clean是伪目标文件
2)include filename 把别的makefile文件包含进来,使用空格分隔
3)例子:
objects=foo.o far.o
all: $(objects)
$(objects): %.c
$(CC) -c $(CFLAGS) $< -o $@
说明:$(objects)表示变量;
%用来匹配0个或若干个字符
4)- 如执行本命令有错误,继续执行不退出
+ 本命令始终被执行
@ 执行本命令不打印本命令内容
5)makefile中第一个目标文件为终极目标
6)多个文件使用同一个头文件的简单写法:
module1.o module2.o module3.o: head.h
7)vpath %.h ../headers 空格或:分隔,指定头文件位置
或者使用VPATH=……
vpath 清除所有
vpath<pattern> 清楚该模式
8)\续行,但是\与新的一行之间不能有空白符
9)根据隐含规则,以下等价
a)module1.o: head1.h
b) mudule1.o: module1.c head1.h
gcc -c module1.c -o module1.o
10)变量名 赋值符 变量值
赋值符包括:
=
:= 定义时展开
?= 没有值则赋值
+= 追加
11)预定义变量: CC CFLAGS PWD
12)自动变量:
$^ 所有依赖文件名
$< 第一个依赖文件名
$@ 目标文件名
$* 目标文件去后缀名
$? 比目标文件新的依赖文件列表
这些只能出现在命令里,出现在文件列表里为$$^之类
13)ifeq ifneq ifdef ifndef