6

gnumake マニュアルに記載されているように $(SUBDIRS) ターゲットを使用して make ターゲットを (ソース コード) サブディレクトリに適用する再帰的な makefile システムで、個別のデバッグおよびリリース ビルド サブディレクトリを適切に処理するための提案を探しています。

具体的には、「all」、「clean」、「realclean」などのターゲットを実装するための可能な戦略に興味があります.ツリーの1つを想定するか、両方のツリーで問題を引き起こしている必要があります。

私たちの現在のメイクファイルは、デバッグ (デフォルト) またはリリース ('リリース' ターゲット) に設定される COMPILETYPE 変数を使用します。これはビルドを適切に行いますが、クリーンアップとメイクはすべてデフォルトのデバッグ ツリーでのみ機能します。COMPILETYPE 変数を渡すのは面倒です。これを行うかどうか、およびどのように行うかは、実際のターゲットの値に依存するためです。

4

2 に答える 2

0

$(COMPILETYPE) 変数を使用して、オブジェクト ファイルを生成するルールから clean/dist/etc のルールまで、すべてのルールで適切なビルド ディレクトリを参照することについて Makefile で規律を守っている場合は、問題ありません。

私が取り組んだあるプロジェクトでは、$(BUILD) 変数を (同等の) build-(COMPILETYPE) に設定しました。これにより、すべてのルールが $(BUILD) を参照するだけで済むため、ルールが少し簡単になりました。たとえば、clean は rm -rf $(BUILD) になります。

$(MAKE) を使用してサブ make を呼び出す (および GNU make を使用する) 限り、COMPILETYPE 変数をすべてのサブ make に自動的にエクスポートできます。特別なことは何もしません。詳細については、GNU make マニュアルの関連セクションを参照してください。

その他のオプション:

  • 最後に使用されたコンパイラ フラグのセットを追跡するメタファイルにすべてのオブジェクトの依存関係を追加することにより、コンパイラ フラグが変更されたときに再ビルドを強制します。たとえば、Git がオブジェクト ファイルを管理する方法を参照してください。
  • autoconf/automake を使用している場合は、さまざまなビルド タイプに別のビルド アウトオブプレース ビルド ディレクトリを簡単に使用できます。たとえば、cd /scratch/build/$COMPILETYPE && $srcdir/configure --mode=$COMPILETYPE && makeビルドタイプを Makefile から configure に取り出します (ここで、 の値に基づいて目的のビルド フラグを指定するためのサポートを追加する必要が--modeありますconfigure.ac) 。

実際のルールのより具体的な例をいくつか挙げると、より具体的な提案が得られるかもしれません。

于 2009-02-13T16:59:41.733 に答える
0

1 つのオプションは、各ビルド タイプのサブディレクトリに特定のターゲットを設定することです。したがって、最上位で「すべてを作成」すると、COMPILETYPE が参照され、必要に応じて「すべてをデバッグする」または「すべてをリリースする」が呼び出されます。

または、最上位で COMPILETYPE 環境変数を設定し、各サブ Makefile でそれを処理することもできます。

本当の解決策は、再帰的な make を行うのではなく、最上位ファイルのサブディレクトリに makefile を含めることです。これにより、ソースが存在するディレクトリとは異なるディレクトリで簡単にビルドできるため、build_debugおよびbuild_releaseディレクトリを持つことができます。また、並行して make を機能させることもできます (make -j)。完全な説明については、再帰的なメイクを有害と見なすを参照してください。

于 2009-02-13T13:30:05.497 に答える