简化makefile

时间:2016-06-12 03:05:42

标签: makefile

我通过Stack Overflow的复制/粘贴建议编写了一个可怕的Makefile。但是,我已经读过可能没有必要多次提供显式编译器调用(例如,-O3标志无处不在)。我该如何简化这个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 $@
fianchetto.o: fianchetto.c
ttable.o: ttable.h ttable.c
movegen.o: movegen.h movegen.c
util.o: util.h util.c

我对很多语法感到困惑,并希望简化工作的链接或解释工作!

1 个答案:

答案 0 :(得分:2)

  • (0>s?(s=-s,'-'):0)+和定义(无论如何应该在CFLAGS中)在链接时无用
  • 您正在重新制作make的内置规则,如果其中一个依赖项是“target.o”(在本例中为CPPFLAGS),make会自动链接目标。 Make也知道如何编译C源文件(只要源和对象路径匹配),所以你的模式规则也是多余的。
  • 对象先决条件不是必需的,因为clang和GCC都可以使用fianchetto: fianchetto.o标志集为您生成依赖项。
  • 在同一目录中编译发布和调试版本会产生更简单的makefile,尽管在切换时需要记住清理目标文件。
  • 默认情况下,将-M分配给ccCC应该是系统默认编译器的链接,因此您可能根本不需要下面的第一行
cc