2

環境の競合を避けるために、たとえばターゲットプレフィックスを渡すことによって、中間ビルダーへの呼び出しを変更することは可能ですか?

例として、次のように異なるコンパイラ マクロを使用する 2 つの異なるライブラリのソース ファイルを使用するとします。

env.Library('libraryA', 'source.c', CCFLAGS=['-DCONFIG_X'])
env.Library('libraryB', 'source.c', CCFLAGS=['-DCONFIG_Y'])

Library-Builder が Object-Builder を呼び出して、異なる CCFlags を使用して最初にソース ファイルをコンパイルするため、SCons は競合を検出します。

明らかな解決策は、次のように、コンパイルをリンクから分割することです。

objectA = env.Object('objectA', 'source.c', CCFLAGS=['-DCONFIG_X'])
objectB = env.Object('objectB', 'source.c', CCFLAGS=['-DCONFIG_y'])
env.Library('libraryA', objectA)
env.Library('libraryB', objectB)

ソースとして複数のファイルが使用されている場合に特に役立つ、よりエレガントな方法があるかどうか疑問に思っていました。

ありがとう!

4

2 に答える 2

5

これは、ビルド ターゲットをサブディレクトリに配置するSCons VariantDir()関数を使用して実現できます。

次に例を示します。

VariantDir('buildA', '.', duplicate=0)
VariantDir('buildB', '.', duplicate=0)

env.Library('libraryA', 'buildA/source.c', CCFLAGS=['-DCONFIG_X'])
env.Library('libraryB', 'buildB/source.c', CCFLAGS=['-DCONFIG_Y'])

source.cこれにより、 と の両方buildAでの異なるバージョンがビルドされbuildBます。実際のsource.cソース ファイルはこれらのビルド ディレクトリにはありませんが、あたかも存在するかのように参照することでSCons、出力を配置する場所がわかります。

VariantDir() 関数については、SCons のマニュアル ページに詳しい説明があります。

于 2013-09-25T17:42:30.660 に答える
3

VariantDir() は正しい一般的な答えですが、単純なケースでは、OBJPREFIX を使用して、特定のターゲットのオブジェクトをサブディレクトリに配置するか、単に一意にすることができます。

env.Library('libraryA', 'source.c', CCFLAGS=['-DCONFIG_X'], OBJPREFIX='libA-')
于 2013-10-08T20:23:06.453 に答える