makefile基本规则:
目标: 依赖
语句 # 这行前是一个tab
Makefile模板
#!/usr/bin/make -f
# 调用shell命令
ARCH = $(shell arch)
# 声明伪目标 clean(即实际不生成clean目标)
.PHONY: clean
# 目标a(无依赖)
a:
# a目标的动作;@符号表示不打印命令,只显示结果
@echo "arch = $(ARCH)"
# 目标b,依赖目标a(即,先执行目标a的动作,再执行目标b的动作)
b: a
@echo bbbbbbb
touch bbb
c: b
echo 'xxxxxxxxxxxxxxxx' > bbb
# 目标d依赖test.txt文件,如果没有test.txt则报错
d: test.txt
# 表示当前依赖的内置变量$< == 'test.txt'
echo 'abcdefghijklmnopqrst' > $<
# 表示当前目标的内置变量$@ == '目标'
echo '目标' > $@
clean:
rm bbb
- 关于变量
- 变量的
=
赋值:
var1 = foo
var2 = $(var1)
(这样的变量赋值是全局的,即var1和var2先后顺序无关——应该是处理全部的变量后再确认变量的值)变量的
:=
赋值:
x := foo
y := $(x) bar
x := later
(:= 只能使用在前面已经定义的赋值过的变量,而不管后面这个变量怎么赋值的;显然这种赋值方法更可控些)变量的
?=
赋值:
var ?= foo
(?=会先检查var是否已经被定义过,当var还未定义才会将foo赋值给var)变量的
+=
赋值:
var += foo
(将foo追加到变量var上)- 静态模式:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c # 这里的%.o先匹配所有.o后缀的目标集合,然后%.c表示为这个集合的名称加上.c作为后缀并形成一个集合
$(CC) -c $(CFLAGS) $< -o $@ # $< 表示依赖集合,$@表示目标集合
(就是用%时,先表示获取匹配的集合,然后才用%来表示通配符)