web-dev-qa-db-ja.com

makefileのターゲットをオーバーライドして、コマンドを追加しますか?

作業時には、他のメイクファイルに(includeステートメントを介して)含める一般的なメイクファイルを使用し、一般的な「クリーン」ターゲットを使用して、いくつかの一般的なファイルを強制終了します。新しいmakefileでそのターゲットに追加したいので、特定のファイルを削除できますが、makefileにクリーンなターゲットを追加すると、古いターゲットが上書きされるだけです。

新しい名前で新しいターゲットを作成し、cleanを呼び出してから、他のことを実行できることはわかっていますが、一貫性を保つために、make cleanを呼び出してすべてを実行できるようにしたいと考えています。

それは可能ですか?

43
Paul D.

独自のクリーンを記述して、一般的なクリーンのpreqにすることができます。

クリーン:myclean 
 
 myclean:
 rm何でも

あなたが最初に実行されます。何らかの理由で共通クリーンを最初に実行したい場合、ソリューションはより複雑になります。

編集:

これが、ローカルルールの前に共通ルールを実行する、私が確認できる最良のソリューションです。

include Makefile.common

clean:
    $(MAKE) -f Makefile.common $@
    rm whatever additional things

ローカルのmakefileはinclude以外のものについては共通のmakefileに依存しているため、cleanディレクティブが必要です。ローカルのcleanルールは、共通のcleanルールをオーバーライドしますが、追加の作業を行う前に、共通のcleanルールを呼び出します。 (このオーバーライドはいくつかの警告を引き起こしますが、これは厄介です。私はそれらを黙らせるための良い方法を知りません。)

34
Beta

私はこれがいくつかの店で行われるのを見ました。最も一般的なアプローチは、GNU makeのようなものを使用していると想定して、ダブルコロンのルールを使用することです。一般的なmakefileでは、次のようになります。

clean::
        # standard cleanup, like remove all .o's:
        rm -f *.o

cleanの後にコロンが1つだけではなく2あることに注意してください!

他のメイクファイルでは、ダブルコロンルールとしてcleanを再び宣言するだけです。

clean::
        # custom cleanup, like remove my special generated files:
        rm -f *.h.gen

make cleanを呼び出すと、GNU makeは、クリーンルールのこれらの「ブランチ」の両方を自動的に実行します。

% make clean
rm -f *.o
rm -f *.h.gen

設定は簡単で、とてもきれいに構成されていると思います。特にダブルコロンルールであるため、同じターゲットに2つのルールを定義するときに通常発生する「コマンドのオーバーライド」エラーが発生しないことに注意してください。それが、ダブルコロンルールの要点です。

68
Eric Melski

一般的なメイクファイルのルールはcommon-clean。次に、各メインmakefileは、次のようにクリーンルールを宣言します。

clean: common-clean

そしてあなたは設定されています。

それが選択肢ではない場合は、 ダブルコロンルール を検討することもできますが、これらは検討すべき他の一連の問題を引き起こします。

5
jamessan

暗黙のルールを使用します。

existing-target: my-extention

my-extention:
    echo running command 1
    echo running command 2

起動する非常に単純なmakeチュートリアル。

::を使用すると、単一のコロンを混合すると文句を言うため、問題が発生する可能性がありますと二重コロン::ルール:

a:
    echo a

a::
    echo aa

結果は:

. . .
*** target file `a' has both : and :: entries.  Stop.
4
Bohdan

私が後世に見た別の可能な解決策を追加します... OPが共通のメイクファイルを変更することについて警戒していたことを知っていますが、このようなものは機能し、最小限の変更が含まれます。

ローカルmakefile 1:

CLEAN=MyExe1 MyExe2
....
include /my/common/makefile

ローカルmakefile 2:

CLEAN=MyExe3 MyExe4
....
include /my/common/makefile

一般的なメイクファイル:

clean:
     rm -f *.dep *.o *.a $(CLEAN)

基本的には、削除したい特定のアイテムをすべて含む各ローカルmakefileで変数(この場合はCLEAN)を定義するという考え方です。次に、共通のmakefileが実行されますrm -f削除するすべての一般的なファイルタイプに加えて、CLEAN変数を介して各ローカルmakefileで削除のフラグが特に付けられたものすべて。削除するものがない場合は、変数宣言を省略するか、空のままにします(CLEAN=

したがって、make cleanローカルmakefile 1の場合、実行されます

rm -f *.dep *.o *.a MyExe1 MyExe2

そしてmake cleanローカルmakefile 2の場合、実行されます

rm -f *.dep *.o *.a MyExe3 MyExe4
3
yano

私たちの場合、変数EXTRAFILESTOCLEANを定義します。その後、クリーンアップルールが実行されると、EXTRAFILESTOCLEAN変数で指定されたものをすべて削除するステップが含まれます。

clean:
    rm -f *.o
ifdef $(EXTRAFILESTOCLEAN)
    rm -f $(EXTRAFILESTOCLEAN)
endif

その変数を奇妙な値に設定すると、予期しない問題が発生する可能性がありますが、接頭辞やその他のテストを追加することで、それらを防ぐことができます。

1
davenpcj