2012-01-20 2 views
2

私は、次の行動を探しています:どのように明示的に別のターゲット間で 'make clean'を実行できますか?

# make debug (project is rebuilt. this works fine.) 
# make debug (project is not rebuilt because no changes have been made.) 
# make release (this is a different target than the currently-built one. I want 'make clean' to run before the release target is built) 
# make release (project is not rebuilt because no changes have been made.) 

ありがとうございました。

+0

は、私は最高のセットアップがで生成されたすべてのファイルを配置することだと思います'make '(オブジェクトファイル、ライブラリ、実行可能ファイルなど)をターゲット固有のディレクトリ。これにより、部分ビルドが混在する可能性が排除されます。 – NPE

+0

独立したビルドディレクトリはありません。これは、私たちからのさらに下流のプロセスが常に絶対パスで実行可能ファイルを見つけることを期待しているため不可能です。 – iraxef

+1

ターゲット間で 'make clean 'をどうやって_implicitly実行できるのでしょうか?明示的に行うことは簡単です。コマンドを実行するだけです。 :) –

答えて

1

興味深い問題です。私がこれを行うために思いつくことができる唯一の方法は、最新のターゲットを外部に記録することです(例えば、ファイルにエコーします)。そして、現在のターゲットと同じかどうかを確認します。それらが同じ場合は、通常のビルドプロセスを実行します。それらが異なる場合は、最初にmake cleanを実行してください。

私はこのプロセスを(テストされていない)説明するためにこれを最初に試みました。

 
debug release: 
ifneq ($(MAKECMDGOALS),$(shell cat last_target.txt)) 
    $(MAKE) clean 
endif 
    @echo [email protected] > last_target.txt 
    [regular build commands] 

これは、両方のターゲットが同じレシピ(特定の変数の設定が異なる)があることを前提としています。彼らが別個のレシピを持っているなら、明らかに両方のレシピに条件部とエコーコマンドを挿入する必要があります。

+0

この提案をありがとう。私はこれの変形で行くことになってしまい、私が探していたものを正確にやっているようです。さらに、それは私にターゲットごとのコントロールを与えます。たとえば、ビルドシステムは、最後のビルドステップとして「make test」を行います。私の最初の実装は、 'make debug'と 'make test'の間に 'make clean'を行いました。これはビルドされたテストを実際に実行する能力を壊しました。ターゲットごとの制御があるので、私はテストターゲットからこの「make clean」ロジックを削除しました。 – iraxef

0

おそらく、すでにDEBUGとRELEASEのための別個のディレクトリがあります。すべての仲介者と実行可能ファイルが異なるため、それらは別々にする必要があります。それから、各ディレクトリに別々のmakeターゲット/コンテキストを持ち、適切なmakeファイルを選択しそこから続行するための 'グローバルな'ターゲットを持つことは些細なことです。私のコメントについては詳しく説明し

+0

私たちは別々のビルドディレクトリを持っていません。これは、私たちからのさらに下流のプロセスが常に絶対パスで実行可能ファイルを見つけることを期待しているため不可能です。 – iraxef

+0

ビルドプロセスは、ビルドが完了したときにその結果として得られる実行可能ファイルをその想定された場所にコピーできませんか?これはあなたのビルドからそれらを分離し、デバッグ/リリースの混在を避けるのにも役立ちます。 – Ioan

+0

私たちはWindowsのビルドでこれを行い、Linux上ではうまくいくとは思っていますが、現時点では外部の制約のためにできません。 – iraxef

0

、私は最高のセットアップは、ビルドオプションの異なるセットごとに異なる出力ディレクトリを持つことだと思います。あなたの場合、debugの出力ディレクトリとreleaseの出力ディレクトリがあります。ビルド中に生成されるすべてのファイル(オブジェクトファイル、ライブラリ、実行可能ファイルなど)は、ターゲット固有のディレクトリに配置されるという考え方です。

make releasemake debugから完全に切り離され、部分的なビルドが混在する可能性はありません。

+0

これは最善の方法ですが、現時点では外部の制約のためにできません。フィードバックいただきありがとうございます。 – iraxef

0

おそらくdebugreleaseのターゲットは同じファイルを作成しますが、フラグは異なります。あなたが必要とすることをgmakeにさせる方法を記述したMr. Makeの記事Rebuilding when CPPFLAGS changesがあります。

代わりにあなたがElectricMakeに切り替えることができ、最新でコマンドライン引数/コンパイラフラグを考慮することができます台帳機能を含む標準gmakeを超える多くの改善、とのgmake互換メイク実装チェック、あなたはあなただけ記述している行動は、その機能を有効にする取得:

emake --emake-ledger=command debug ;# builds everything with debug flags 
emake --emake-ledger=command debug ;# does nothing 
emake --emake-ledger=command release ;# rebuilds everything with release flags 
emake --emake-ledger=command release ;# does nothing 

(免責事項:私はElectricMakeの建築家だ)

+0

フィードバックいただきありがとうございます。 – iraxef

関連する問題