作業時には、他のメイクファイルに(includeステートメントを介して)含める一般的なメイクファイルを使用し、一般的な「クリーン」ターゲットを使用して、いくつかの一般的なファイルを強制終了します。新しいmakefileでそのターゲットに追加したいので、特定のファイルを削除できますが、makefileにクリーンなターゲットを追加すると、古いターゲットが上書きされるだけです。
新しい名前で新しいターゲットを作成し、cleanを呼び出してから、他のことを実行できることはわかっていますが、一貫性を保つために、make cleanを呼び出してすべてを実行できるようにしたいと考えています。
それは可能ですか?
独自のクリーンを記述して、一般的なクリーンのpreqにすることができます。
クリーン:myclean myclean: rm何でも
あなたが最初に実行されます。何らかの理由で共通クリーンを最初に実行したい場合、ソリューションはより複雑になります。
編集:
これが、ローカルルールの前に共通ルールを実行する、私が確認できる最良のソリューションです。
include Makefile.common
clean:
$(MAKE) -f Makefile.common $@
rm whatever additional things
ローカルのmakefileはinclude
以外のものについては共通のmakefileに依存しているため、clean
ディレクティブが必要です。ローカルのclean
ルールは、共通のclean
ルールをオーバーライドしますが、追加の作業を行う前に、共通のclean
ルールを呼び出します。 (このオーバーライドはいくつかの警告を引き起こしますが、これは厄介です。私はそれらを黙らせるための良い方法を知りません。)
私はこれがいくつかの店で行われるのを見ました。最も一般的なアプローチは、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つのルールを定義するときに通常発生する「コマンドのオーバーライド」エラーが発生しないことに注意してください。それが、ダブルコロンルールの要点です。
一般的なメイクファイルのルールはcommon-clean
。次に、各メインmakefileは、次のようにクリーンルールを宣言します。
clean: common-clean
そしてあなたは設定されています。
それが選択肢ではない場合は、 ダブルコロンルール を検討することもできますが、これらは検討すべき他の一連の問題を引き起こします。
暗黙のルールを使用します。
existing-target: my-extention
my-extention:
echo running command 1
echo running command 2
::を使用すると、単一のコロンを混合すると文句を言うため、問題が発生する可能性があります:と二重コロン::ルール:
a:
echo a
a::
echo aa
結果は:
. . .
*** target file `a' has both : and :: entries. Stop.
私が後世に見た別の可能な解決策を追加します... 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
私たちの場合、変数EXTRAFILESTOCLEANを定義します。その後、クリーンアップルールが実行されると、EXTRAFILESTOCLEAN変数で指定されたものをすべて削除するステップが含まれます。
clean:
rm -f *.o
ifdef $(EXTRAFILESTOCLEAN)
rm -f $(EXTRAFILESTOCLEAN)
endif
その変数を奇妙な値に設定すると、予期しない問題が発生する可能性がありますが、接頭辞やその他のテストを追加することで、それらを防ぐことができます。