NOTE:

Makefile 必须使用制表符,而不是空格进行锁紧。

语法

1
2
3
4
targets: prerequisites
command
command
command
  • targets 目标
  • prerequisites 先决条件
  • commands 命令

目标

all 目标

要制作多个目标,而你想让所有目标都运行?

  • 制作一个all目标。
  • 由于这是列出的第一个规则,因此如果调用 make 而未指定目标,则默认情况下它将运行。
1
2
3
4
5
6
7
8
9
10
11
all: one two three

one:
touch one
two:
touch two
three:
touch three

clean:
rm -f one two three

多个目标

当一个规则有多个目标时,将为每个目标运行命令。

1
2
3
4
all: f1.o f2.o

f1.o f2.o:
echo $@ # $@ 是包含目标名称的自动变量。

自动变量和通配符

*通配符

  • 在你的文件系统中搜索匹配的文件名。 建议始终将其包装在wildcard 函数中
1
2
3
# 打印出每个.c文件的文件信息
print: $(wildcard *.c)
ls -la $?

%通配符

  • 在“匹配”模式下使用时,匹配字符串中的一个或多个字符。
  • 在“替换”模式下使用时,它会获取匹配的词干,并替换字符串中的词干。
  • % 最常用于规则定义和某些特定函数中。

$@

  • 构建目标
1
2
main.o: main.c
gcc -c main.c -o $@

此处 $@ 就表示目标 main.o

$?

  • 比目标文件更新的所有依赖文件
1
2
main: main.o func.o
gcc $? -o main

若 main.o 或 func.o 比 main 的更新,则会被包含在 $? 中。

$^

  • 所有的依赖文件
1
2
main: main.o func.o
gcc $^ -o main

这里的 $^ 就表示所有的依赖文件,即 main.o 和 func.o

$<

  • 第一个依赖条件
1
2
main: main.o func.o
gcc $< -o main

此处 $< 就表示第一个依赖文件,即 main.o