我有一个看起来像这样的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
它会自动删除code1
和code2
的现有二进制文件,然后再创建新文件。
我试图将这些行放在makefile的最后,但它不起作用
clean:
rm -f $@
echo Clean done
这样做的正确方法是什么?
答案 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