Makefile -- 后缀规则

Makefile -- 后缀规则


(翻译自 GNU make 10.7 – Old-Fashioned Suffix Rules)

后缀规则是一种 make 定义隐式规则的旧式方式。模式规则更加通用、清晰,后缀规则已经被废弃。为了兼容旧的 makefiles,GNU make 依然支持后缀规则。后缀规则有两种形式:双后缀单后缀

双后缀规则由一对后缀定义:target 后缀和源文件后缀。双后缀规则会匹配任意以 target 后缀结尾的文件。对应的隐式依赖是 target 文件名加上源文件后缀。例如:双后缀 .c.o (target 后缀和源文件后缀分别为 .o.c)等效于模式规则 %.o: %.c

单后缀规则由单个后缀定义,定义了源文件后缀。单后缀规则匹配任意文件,对应的隐式依赖为 target 结尾添加源文件后缀。例如,单后缀规则 .c 等效于模式规则 %: %.c

后缀规则通过将每条规则的 target 与已知后缀列表的比较来识别。当 target 为已知的后缀,make 会将其视为单后缀规则。当 target 为已知的双后缀时,make 会将其视为双后缀规则。

例如,.c.o 都在默认后缀列表中。如果你定了一个目标.c.o,make 会将其视为双后缀规则,源文件后缀为 .c ,target 后缀为 .o。下面是编译C源文件的旧式规则:

.c.o:
	$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

后缀规则不能有自己的依赖。如果包含了依赖,那么将会被视为普通规则,而不是后缀规则,如:

.c.o: foo.h
	$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

上述规则说明了如何从依赖文件 foo.h 生成文件 .c.o,而不是类似下面的模式规则:

%.o: %.c foo.h
	$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

上面的模式规则说明了如何从 .c 文件生成 .o 文件,生成所有的 .o 文件都使用这条模式规则,同时也依赖 foo.h

没有命令的后缀规则没有任何意义,不会像模式规则一样覆盖隐式规则,仅仅简单的将单个后缀或者一对后缀作为 target 放入数据库。例如:

main: main.o
    echo "generate target"
    gcc -o main $<

.c.o:

.PHONY: clean
clean:
    -rm -f *.o

上面的 Makefile 可以正常生成 main,使用了隐式规则,cc -c -o main.o main.c。而下面的 Makefile 则会报错:

main: main.o
	echo "generate target"
	gcc -o main $<

%.o: %.c

.PHONY: clean
clean:
	-rm -f *.o

模式规则 %.o: %.c 覆盖了隐式规则 cc -c -o xxx.o xxx.c。报错如下:

make: *** No rule to make target 'main.o', needed by 'main'.  Stop.

已知后缀由特殊目标 .SUFFIXES 的依赖指定。可以通过写 .SUFFIXES 规则来添加自定义后缀,例如:

.SUFFIXES: .hack .win

上面的规则将 .hack.win 添加到后缀列表的尾部。

如果想要删除默认后缀,而不是添加后缀,则可以写一条没有依赖的 .SUFFIXES 规则。该规则会清空 .SUFFIXES 的依赖。然后可以通过另一条 .SUFFIXES 规则添加后缀,如:

.SUFFIXES: # Delete the default suffixes
.SUFFIXES: .c .o .h # Define our suffix list

-r 或者 --no-builtin-rules 参数也可以清空默认后缀列表。

make 默认定义 SUFFIXES 变量,用来保存默认后缀列表,这个变量定义与读取任何 makefiles 文件之前。可以通过 .SUFFIXES 目标改变后缀列表,但是这并不会改变 SUFFIXES 变量。如下:

.SUFFIXES:
.SUFFIXES: .c .o .s .h 

main: main.o
	@echo "generate target"
	@echo "default suffix: $(SUFFIXES)"
	@gcc -o main $<

.c.o:

.PHONY: clean
clean:
	-rm -f *.o main

输出为:

generate target
default suffix: .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值