如何在Makefile中包含干净的目标?

时间:2010-04-14 07:01:48

标签: unix makefile

我有一个看起来像这样的Makefile

CXX = g++ -O2 -Wall

all: code1 code2

code1: code1.cc utilities.cc
   $(CXX) $^ -o $@

code2: code2.cc utilities.cc
   $(CXX) $^ -o $@

接下来我要做的是每次都包含clean target 我运行make它会自动删除code1code2的现有二进制文件,然后再创建新文件。

我试图将这些行放在makefile的最后,但它不起作用

clean: 
    rm -f $@
    echo Clean done

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:33)

最好的办法是创建一个包含二进制文件的变量:

binaries=code1 code2

然后在all - 目标中使用它,以避免重复:

all: clean $(binaries)

现在,你可以将它与clean - 目标一起使用,只需添加一些globs来捕获目标文件和东西:

.PHONY: clean

clean:
    rm -f $(binaries) *.o

请注意使用.PHONY使clean成为pseudo-target。这是一个GNU make功能,因此如果您需要可移植到其他make实现,请不要使用它。

答案 1 :(得分:19)

在makefile语言中,$@表示“目标名称”,因此rm -f $@会转换为rm -f clean

您需要指定rm确切删除的内容,例如rm -f *.o code1 code2

答案 2 :(得分:2)

顺便说一下,只有明确调用干净规则时才会调用干净规则:

make clean

我认为这比每次都干净更好。如果你想按照自己的方式做到这一点,试试这个:

CXX = g++ -O2 -Wall

all: clean code1 code2

code1: code1.cc utilities.cc
   $(CXX) $^ -o $@

code2: code2.cc utilities.cc
   $(CXX) $^ -o $@

clean: 
    rm ...
    echo Clean done