8

SCons に自分のディレクトリにいくつかのソース ファイルを生成してもらい、src/それらを他のソース ファイルと同じように自分のビルド ディレクトリにビルドしたいと考えていますbuild/variantX

これは私の SCons ファイルです:

import SCons

def my_builder(env, target, source):
    # do stuff
    pass

env = Environment()
env.VariantDir('build/variant1/', 'src', duplicate=0)
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
env.Program('bin/test', [
    'build/variant1/foobar.cc',
    'build/variant1/test.cc',
    ])

これは、次のメッセージでエラーになります。

ソースsrc/foobar.ccが見つかりません。ターゲットに必要ですbuild/variant1/foobar.o

私が実際にビルドするコマンドを提供していることを考えると、これは正しいとは思いませんsrc/foobar.cc

ここで、いくつかの回避策を試しました。

  • build/variant1/foobar.ccin Program をに置き換えるとsrc/foobar.cc、機能しますが、明らかにではなくでfoobar.o作成されますsrc/build/variant1

  • src/foobar.ccin Command をに置き換えると機能しますが、コードを;build/variant1/foobar.ccで生成したいと思います。src/(また、インクルード ディレクトリ内の相対パスなどは、次の場合を除き機能しないためduplicate=1)

  • の場合duplicate=1、同様のエラー メッセージが表示されますが、今回はバリアント ディレクトリに言及しています。

    ソースbuild/variant1/foobar.ccが見つかりません。ターゲットに必要ですbuild/variant1/foobar.o

これを回避する方法はありますか?それは SCons の制限/バグですか、それとも私の側に根本的な誤解がありますか?

4

3 に答える 3

3

次のように Command() と Program() 呼び出しの間に明示的な依存関係を作成することをお勧めします。

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
target2 = env.Program('bin/test', [
                      'build/variant1/foobar.cc',
                      'build/variant1/test.cc',
                      ])
Depends(target2, target1)
# This should work too
# Depends(target2, "src/foobar.cc")

または、次のように、Command() のターゲットを Program() のソースの一部として指定することもできます。

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
env.Program('bin/test', [
            target1,
            'build/variant1/test.cc',
            ])

私はこれをテストしていないので、VariantDir() の呼び出しと組み合わせてどのように機能するかわかりません

SCons を使用したソース コードの生成に関する追加情報を次に示します。

于 2013-05-14T14:46:16.153 に答える