1

次のようなフォルダー レイアウトのプロジェクトがあります。

/project_root
  /common-code-sources
    /common1
    /common2
    /...
  /prog-A-sources
  /prog-B-sources
  /prog-C-sources

プログラム A、B、および C 用に 3 つの実行可能ファイルを作成する必要がありlibCommonCodeN.aます。

ただし、特定のコンパイル フラグ セットを使用して、プログラム C とそれに必要なすべての共通コード ライブラリをビルドする必要があります。(この場合、32 ビットで、いくつかの最適化が無効になっています。)

これはcommon_sources、プログラム C が必要とする特定のコードを、正しいフラグを使用してもう一度コンパイルする必要があることを意味します。

この状況をカバーするための Makefile ベースのビルド システムを最適に作成する方法についてのアイデアを探しています。

ソリューションには、lib ファイル用の並列出力フォルダーと、プロセスをガイドするいわゆる「ターゲット固有の」make変数が含まれると考えていますが、すべてを組み合わせる方法がわかりません。

質問:ソース makeの 1 つが変更されたときに、プロジェクトのルートでの実行が正しいことを確認するにはどうすればよいですか?common-code

つまり、問題の特定の 2 つのフレーバーを再構築し.a、3 つの実行可能ファイルを再リンクするにはどうすればよいでしょうか?

4

1 に答える 1

1

ここに2つのアプローチがあります:

  • 単一のMakefileを維持します (いつでもincludeディレクティブで Makefile を分割できます)。
  • サブプロジェクトごとに独自の Makefile を維持します (再帰的な make は有害なアプローチを考慮します)。

最初のケースでは、依存関係を完全に制御できます...カスタムビルドを使用するには:

  $ cat Makefile
...
ifeq '$(DEBUG)' 'はい'
  BUILD_DIR = デバッグ
  CFLAGS += $(CFLAGS_DEBUG)
そうしないと
  BUILD_DIR = リリース
  CFLAGS += $(CFLAGS_OPTIM)
終了
...
  $ make DEBUG=yes

2 番目のケースでは、最初のヒントを次のように混ぜます。

  $ cat Makefile
...
ifeq '$(DEBUG)' 'はい'
  BUILD_DIR = デバッグ
  MODULE_A_BUILD_DIR = ../モジュール-A/_debug_build
  CFLAGS += $(CFLAGS_DEBUG)
そうしないと
  BUILD_DIR = リリース
  MODULE_A_BUILD_DIR = ../モジュール-A/_release_build
  CFLAGS += $(CFLAGS_OPTIM)
終了

ビルド: $(MODULE_A_BUILD_DIR)/libmodulea.a
    make -C $(MODULE_A_BUILD_DIR)/.. DEBUG=$(DEBUG)
...

あなたは質問ですべて正しく言います。論理的に一貫性のあることを行うだけで、恐れることはありません))

したがって、make フラグまたはターゲット パターンに依存するbuild / distパスを作成します。

ifneq '$(filter %-debug,$(MAKECMDGOALS))' ''
  BUILD_DIR = デバッグ
  MODULE_A_BUILD_DIR = ../モジュール-A/_debug_build
  CFLAGS += $(CFLAGS_DEBUG)
  ...
終了
于 2012-06-24T19:25:14.333 に答える