4-1.Pattern rule
有Implicit Rules/隐私规则,和过时的后缀规则。主要是为了方便使用。
可以使用 make -p 来显示默认的规则,当然也可以使用配置文件覆盖规则。
如果prerequires没有找到对应的target,或者文件,会使用pattern rule来进行模式匹配,
如果匹配上的话,使用pattern rule定义的规则,做出target/文件,让别的target引用。
如果编译的时候出现奇怪的现象,可以覆盖这些pattern rule,就当是写shell来写Makefile
简单的C语言编译的隐含规则。
%.o: %.c
# recipe to execute (built-in): 将.c文件编译为.o文件
$(COMPILE.c) $(OUTPUT_OPTION) $<
%.o: %.C
# recipe to execute (built-in): 将.C文件编译为.o文件
$(COMPILE.C) $(OUTPUT_OPTION) $<
%: %.o
# recipe to execute (built-in): 将.o文件链接为可执行文件
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
例子
Makefile
.PHONY: all clean
test_target : src/main.o test.o
#这里没有写recipe,prequires中的.o文件本身也还没存在,
#例如src/main.o 这个prequires,make没有找到这个文件,然后找它的同名target,也没找到,就会pattern中的下面这个
#使用.c文件编译成.o文件
#改写的默认的pattern rule,依然会编译,但是会输出一行信息
%.o : %.c
$(COMPILE.c) $< $(OUTPUT_OPTION)
@echo c-----------------o
clean:
rm -rf *.o src/*.o lib/*.o *.exe src/*.exe lib/*.exe