6

2 つのビルド システムを結合しようとしています。どちらも再帰的です (makefile のルールは make を使用して他の makefile を呼び出し、プロジェクトのコンポーネントをビルドします)。

これらを「A」と「B」と呼びます。「A」はアプリケーションをビルドし、「B」は「A」が使用するライブラリをビルドします。

A の最上位の makefile は、'make TARGET=whatever' を呼び出します。これは、ビルドの再帰的に呼び出されるすべてのビットが、TARGET の値を読み取り専用変数として継承することを意味します。再帰ビルド。

「B」(別のプロジェクトからのもの) のビルド システムでこれが発生することを望んでいません。そこのメイクファイルは TARGET を独自の目的で使用し、TARGET の値が間違っていて読み取り専用であるためビルドが失敗するためです。

これに対する解決策は 2 つしかありません。

1) TARGET を設定する A の makefile とそれを使用する A の makefile で TARGET の名前を別の名前に変更して、ビルド システムの下位レベルとの衝突を回避します。

2) TARGET 変数が設定されている B の makefile のどこでも 'override' ディレクティブを使用して、その読み取り専用ステータスをオーバーライドします。

誰もがより良いアイデアを持っていますか? - 理想的には、A から B ビルド システムに明示的に渡すオプションを除いて、A から B のビルド システムに何も継承されないようにします。

ちなみにGNU Make v3.80を使っています。

4

4 に答える 4

3

A の第 2 レベルの makefile でMAKEOVERRIDESを何も設定できません。

callb:
      cd subdir && $(MAKE) MAKEOVERRIDES=

これにより、 -k-sなどの通常のコマンドライン パラメータが渡されますが、コマンドライン変数の定義は渡されません。

または、MFLAGS にコマンドライン変数の定義が含まれていないことを除いて、MAKEFLAGS と同じ歴史的なMFLAGSを使用ます

callb:
     cd subdir && $(MAKE) $(MFLAGS)

この 2 つのオプションの詳細については、こちらを参照してください: The GNU Make Manual

于 2009-06-03T18:06:31.023 に答える
0

ビルドシステムAがビルドシステムBを呼び出す時点で、' ${MAKE}'を直接使用しないでください。ビルドシステムBを呼び出すシェルスクリプトを呼び出します(おそらく環境をサニタイズした後)。

コマンドが''によって実行される動作を実現するにはmake -n、makefileのコマンドラインの前に' 'を付けます(行の前に' 'または' '+を付けるのと同様です)。@-

于 2009-06-03T18:37:14.940 に答える
0

おそらく、「unexport」ディレクティブを使用して、TARGET が B の makefile に伝播されるのを防ぐことができますか?

于 2009-06-01T15:53:45.063 に答える
0

A メイクファイルを変更して B メイクファイルを再帰的に呼び出すようにしたため、問題が発生したようです。代わりに、B makefile を再帰的に呼び出し、次に A makefile を再帰的に呼び出す新しいトップレベルの makefile を導入しないのはなぜですか? たとえば、combined.mk:

all:
    $(MAKE) -f Makefile.B
    $(MAKE) -f Makefile.A

そうすれば、B メイクファイルは A メイクファイルから何も継承しません。

于 2011-11-09T22:10:31.333 に答える