2009-06-01 5 views
6

私は2つのビルドシステムを一緒に接着しようとしています。どちらも再帰的です(makefileの規則は、プロジェクトのコンポーネントを構築するためにmakeが他のmakefileを呼び出すために使用します)。再帰的ビルドでコマンドライン変数の代入を無視するにはどうすればよいですか?

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

Aの最上位メイクファイルは、 'make TARGET = whatever'を呼び出します。つまり、ビルドのすべての再帰呼び出しビットは、Bからのビルドシステムを含む読み取り専用変数としてTARGETの値を継承します。再帰的ビルドの一部として呼び出されます。

'B'(これは別のプロジェクトから来ている)のビルドシステムでは発生したくないのですが、makefileは独自の目的のためにTARGETを使用しているため、TARGETに間違った値がありビルドに失敗します読み取り専用です。

私はこれに対して2つの解決方法しか見ることができません。どちらもパレットテーブルではありません。

1)ビルドシステムの下位レベルとの衝突を避けるために、TARGETを設定するAのメイクファイル内の他のもの、およびそれを使用するAのメイクファイルにTARGETの名前を変更します。

2)TARGET変数が設定されているBのメークファイルのどこでも、 'override'ディレクティブを使用して、読み取り専用ステータスを上書きします。

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

ちなみに、私はGNU Make v3.80を使用しています。

+0

BのメイクファイルでTARGETを設定したくない場合は、なぜAのメイクファイルにTARGET =何を渡していますか? – JesperE

+0

Aのトップレベルのメイクファイルは、A(それを必要とする)の第2レベルのメークファイルにTARGET =何も渡し、Aの第2レベルのメイクファイルはBのメイクファイルを呼び出します。これはTARGETを読み取り専用変数として第2レベルのmake。 –

答えて

0

"unexport"ディレクティブを使用して、TARGETがBのmakefileに伝播しないようにすることができますか?

+0

残念ながら、unexportディレクティブは、エクスポートを使用してエクスポートされた変数がエクスポートされるのを防ぐだけです。コマンドラインで現在のmakeプロセスに渡される変数または親makeのコマンドラインから継承される変数には影響しません。 makeコマンドラインで値を設定すると、すべての子作成者に対して読み取り不能に読み込み不能になるように見えます。 –

+0

私はアイデアがありません。 – JesperE

3

あなたはこれが-k-sではなく、コマンドラインの変数の定義のような通常のコマンドラインパラメータを下に渡し

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

A.第二レベルのメイクファイルに何もMAKEOVERRIDESを設定することができます。

またはコマンドライン変数の定義が含まれていません MFLAGS 除いて、あなたはMAKEFLAGSと同じである歴史的MFLAGSを使用しています。この二つのオプションについて

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

詳細はここで読むことができます:ビルドシステムAはシステムBを構築呼び出す時点でThe GNU Make Manual

0

、直接「${MAKE}」を使用しないでください。ビルドシステムBを起動するシェルスクリプトを起動します(おそらく、環境をサニタイズした後に)。

コマンドが「make -n」によって実行される動作を達成するために、(「@」または「-」の行を付けると同様)「+」でメイクファイルでコマンドラインを付けます。

0

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

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

このようにして、BメイクファイルはAメイクファイルから何も継承しません。

関連する問題