このような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
の既存のバイナリファイルを自動的に削除してから、新しいもの。
これらの行をメイクファイルの最後に配置しようとしましたが、機能しません
clean:
rm -f $@
echo Clean done
それを行う正しい方法は何ですか?
メイクファイル言語では、$@
は「ターゲットの名前」を意味するため、rm -f $@
はrm -f clean
に変換されます。
rm
には、rm -f *.o code1 code2
のように、正確に削除するものを指定する必要があります。
最良の方法は、おそらくバイナリを保持する変数を作成することです。
binaries=code1 code2
次に、それをall
- targetで使用して、繰り返さないようにします。
all: clean $(binaries)
これでclean
- targetでもこれを使用でき、オブジェクトファイルなどをキャッチするためにいくつかのglobを追加するだけです。
.PHONY: clean
clean:
rm -f $(binaries) *.o
.PHONY
を使用してclean
を pseudo-target にすることに注意してください。これはGNU make機能であるため、他のmake実装に移植性が必要な場合は使用しないでください。
それが書かれているところでは、クリーンなルールは明示的に呼び出された場合にのみ呼び出されます:
きれいにする
毎回きれいにするよりも良いと思います。自分のやり方でこれをしたい場合は、これを試してください:
CXX = g ++ -O2 -Wall all:きれいなcode1 code2 code1:code1.cc Utilities.cc $(CXX)$ ^ -o $ @ code2:code2.cc Utilities.cc $(CXX)$ ^ -o $ @ clean: rm ... echo Clean done