2017-01-12 14 views
2

Makefileで%が間違っているようです。 myotherlibのみが構築されつつ、MYLIBは常に、(第2 make mylib呼び出しが再びtouchコマンドを実行している)に再建され%が常に再構築されたgnu makeターゲットはなぜですか?

> make mylib 
touch mylib-13.dll 
> make mylib 
touch mylib-13.dll 

> make myotherlib 
touch myotherlib-13.dll 
> make myotherlib 
make: Nothing to be done for `myotherlib'. 

:出力

mylib: mylib-%.dll 

mylib-%.dll: 
    touch mylib-13.dll 


myotherlib: myotherlib-13.dll 

myotherlib-13.dll: 
    touch myotherlib-13.dll 

:この単純なメイクファイルは問題

Makefileを示し一度。

mylibが必ずしも再構築されないように、つまりmake mylibへの2回目の呼び出しでmake: Nothing to be done for 'mylib'.が返されるようにする必要があるのはなぜですか。

答えて

0

説明

ルール(:の左側部分)の目標、.PHONY特殊なルールの下でマークされていない限り、makeプロセスの終了時に作成されることになっていると、あなた場合に存在します直後にコマンドを再発行してください。

あなたのルールmyotherlib-13.dllは、あなたのルールmyotherlibが直接それに依存し、それが基本ルールなので、そのターゲットを正しく作成します。

ただし、ルールmylib-%.dllはパターンルールであり、可能な場合はターゲットと一致します。トリックは、mylib-%.dllターゲットに依存するあなたのルールmylibにあります。 mylibは、mylib-%.dllという名前のファイルに依存しなければならないと言っているので、一致するルールを探して見つけますが、代わりにmylib-13.dllという名前のファイルが作成されます。あなたは何が起こっているかのデモをしたい場合は、touch [email protected]であなたのtouch xxxコマンドを変更

はデモ

[email protected]は、パターンマッチング部品を交換した後に、ルールの名前に置き換え自動変数です)。

ので

mylib: mylib-%.dll 

mylib-%.dll: 
    touch [email protected] 

myotherlib: myotherlib-13.dll 

myotherlib-13.dll: 
    touch [email protected] 

そして

$ make mylib 

をやってあなたは、出力

touch mylib-%.dll 

ソリューション

は、単ににmylib: mylib-%.dllを変更するでしょうとそれは意図したとおりに動作します。

デモのコードを使用すると、[email protected]mylib13.dllに正しく置き換えられるようになります。

+0

説明していただきありがとうございます。私が%を使用しようとした理由は、Makefileをバージョン番号に依存させたくないため、バージョンを増やすときに変更する必要はありません。 mylib-14.dllへ。私はそれを行うための他の方法があるのだろうかと思います。面白いことに、mylib - %。dllという名前のファイルがルールがパターンルールのときに作成されることを期待しています... –

+0

彼はあなたがそれをルールの要件部分に入れているので、彼はそれを期待しています。より柔軟なものを使いたい場合は、バージョン変数、つまり 'mylib - $(LATEST_DLL_VERSION).dll'を使用してルールの上に宣言して、単一のアクセスポイントを持つことができます。 しかし、ある時点では、バージョン番号をバンプするときにシステムが魔法のように知っているとは思えません。あなたはどこかにそれを伝えなければなりません。 – Chnossos

+0

これも私がやったことですが、バージョン番号を付ける必要はありません。私のシナリオは:私のアプリケーションは第三者のライブラリに依存しています。 makefileにはライブラリがありませんが、私が使っているバージョン番号は本当に気にしませんが、ここのコメントには当てはまらない別の質問です... –

関連する問題