web-dev-qa-db-ja.com

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を実行するたびに、code1およびcode2の既存のバイナリファイルを自動的に削除してから、新しいもの。

これらの行をメイクファイルの最後に配置しようとしましたが、機能しません

clean: 
    rm -f $@
    echo Clean done

それを行う正しい方法は何ですか?

21
neversaint

メイクファイル言語では、$@は「ターゲットの名前」を意味するため、rm -f $@rm -f cleanに変換されます。

rmには、rm -f *.o code1 code2のように、正確に削除するものを指定する必要があります。

19
qrdl

最良の方法は、おそらくバイナリを保持する変数を作成することです。

binaries=code1 code2

次に、それをall- targetで使用して、繰り返さないようにします。

all: clean $(binaries)

これでclean- targetでもこれを使用でき、オブジェクトファイルなどをキャッチするためにいくつかのglobを追加するだけです。

.PHONY: clean

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

.PHONYを使用してcleanpseudo-target にすることに注意してください。これはGNU make機能であるため、他のmake実装に移植性が必要な場合は使用しないでください。

34
unwind

それが書かれているところでは、クリーンなルールは明示的に呼び出された場合にのみ呼び出されます:

きれいにする

毎回きれいにするよりも良いと思います。自分のやり方でこれをしたい場合は、これを試してください:

 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 
2
Alex F