语法
基本格式
目标(target)... : 依赖(prerequiries)
<tab\> 命令(commad)
如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目标文件”。命令被执行的 2 个条件:依赖文件比目标文件新,或是 目标文件还没生成。
- 必须以 Tab 键缩进命令行,不能以空格键缩进;
- 多个规则单元之间可以用存在任意空行、TAB空行、空格空行。(这里将由一个目标、一个依赖,一个命令组成的部分称为一个单元);
- 命令前可以有多个<TAB>,也可以有空格。但起始必须是<TAB>。
- 目标和依赖所在行,开头不能有<TAB>,但可以有空格;
- 多个文件时,Makefile命令顺序不需要根据执行顺序;
注释
以#注释
# #表示注释
hello.i:hello.c
gcc -E hello.c -o hello.i
hello.S:hello.i
gcc -S hello.i -o hello.S
hello.o:hello.S
gcc -c hello.S -o hello.o
hello:hello.o
gcc hello.o -o hello
第一个目标文件为最终目标
所以上面的Makefile文件应该反向
# #表示注释
# 第一个目标文件为最终目标
hello:hello.o
gcc hello.o -o hello
hello.o:hello.S
gcc -c hello.S -o hello.o
hello.S:hello.i
gcc -S hello.i -o hello.S
hello.i:hello.c
gcc -E hello.c -o hello.i
伪目标
对于不需要依赖文件,只想在Makefile中执行命令时,需要用到伪目标。
伪目标:.PHONY:
# #表示注释
# 第一个目标文件为最终目标
# 伪目标:.PHONY:。不需要目标文件,只执行命令。
hello:hello.o
gcc hello.o -o hello
hello.o:hello.S
gcc -c hello.S -o hello.o
hello.S:hello.i
gcc -S hello.i -o hello.S
hello.i:hello.c
gcc -E hello.c -o hello.i
.PHONY:
clean:
rm -rf hello.i hello.S hello.o hello
此时,make clean将运行rm -rf hello.i hello.S hello.o hello。
变量
变量定义方式主要包括:= (替换) += (追加) := (恒等于);
应用方式是 $(变量)
替换
利用TAR替换test,后续可以追加。
TAR = test
追加
对于可以追加的变量,采用+=追加。
OBJ = main.o
OBJ += circle.o
OBJ += square.o
这样 $(OBJ) 等同于 main.o circle.o square.o。
恒等于
利用CC来代替gcc,且不能追加。类似于常量定义
CC := gcc
这样,就可以将gcc -c main.c -o main.o
,替换成
$(CC) -c main.c -o main.o
# main.c main.h circle.c circle.h square.c square.h
# 变量:= (替换) += (追加) := (恒等于)
#
CC := gcc
TAR = test
OBJ = main.o
OBJ += circle.o
OBJ += square.o
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
main.o:main.c
$(CC) -c main.c -o main.o
circle.o:circle.c
$(CC) -c circle.c -o circle.o
square.o:square.c
$(CC) -c square.c -o square.o
.PHONY:
cleanall:
rm -rf $(OBJ) $(TAR)
clean:
rm -rf $(OBJ)