2016-06-12 61 views
2

我通过复制/粘贴来自Stack Overflow的建议编写了一个看起来很吓人的Makefile。但是,我已经读过,可能没有必要多次提供显式的编译器调用(例如,-O3标志无处不在)。我怎样才能简化这个Makefile?简化makefile

CFLAGS = -Weverything -Wno-padded -Wno-unused-parameter -Wno-unused-variable -Wno-sign-conversion 
all: fianchetto.o util.o ttable.o movegen.o 
    clang -O3 $(CFLAGS) -D NDEBUG $^ -o fianchetto 
debugf: fianchetto.o ttable.o movegen.o 
    clang -O3 $(CFLAGS) -g3 $^ -o fianchetto 
clean: 
    rm *.o && rm *.gch & rm fianchetto && rm -rf fianchetto.dSYM 
%.o: %.c 
    clang -O3 -c $(CFLAGS) $< -o [email protected] 
fianchetto.o: fianchetto.c 
ttable.o: ttable.h ttable.c 
movegen.o: movegen.h movegen.c 
util.o: util.h util.c 

我被很多语法迷住了,并且很感谢为什么简化工作的链接或解释!

+0

O3标志中的第一行:其纳入CFLAGS宏。 – Evert

+0

你的'clean'命令中有一个'&';大概也应该是'&&',就像其他的一样? – Evert

+0

除了'.o'文件名的重复和硬编码的依赖关系规则(它们看起来也可能是不完整的:除此之外,没有任何C源文件依赖于任何其他头文件),除了重复使用'.o'文件外,比它自己的?)依赖是最好的编译器生成。您不需要它们进行全新重建,只需要进行增量重建,并且可以在重建过程中获取它们。 – Kaz

回答

2
  • CFLAGS和定义(这应该是在CPPFLAGS反正)连接
  • 你重塑make的内置规则时是无用的,如果做它的一个依赖是“target.o会自动链接目标“(在这种情况下为fianchetto: fianchetto.o)。 Make也知道如何编译C源文件(只要源和目标路径匹配),所以你的模式规则也是多余的。
  • 对象先决条件不是必需的,因为clang和GCC都可以使用-M标志集来为您生成依赖关系。
  • 将编译版本和调试版本编译到同一个目录中会产生一个更简单的makefile,尽管在切换时需要记住清理目标文件。
  • 作出缺席分配ccCC,并cc应该是系统的默认编译器的链接,所以你可能甚至不需要低于
CC  := clang 
CPPFLAGS := -MMD -MP 
CFLAGS := -Weverything -Wno-padded -Wno-unused-parameter -Wno-unused-variable -Wno-sign-conversion -O3 

objs := fianchetto.o util.o ttable.o movegen.o 
deps := $(objs:.o=.d) 

.PHONY: all debugf clean 
all: CPPFLAGS += -DNDEBUG 
debugf: CFLAGS += -g3 
all debugf: fianchetto 
fianchetto: $(objs) 
clean: ; $(RM) $(objs) $(deps) fianchetto fianchetto.dSYM 

-include $(deps)