3

編集完全に書き直された例、問題は同じです。

私はSConsctructファイルを持っています:

env = Environment()

def write_main( out ):
    out.write("""
              #include <iostream>

              int main(int argc, char **argv)
              {{
                std::cout << "[{0}]" << std::endl;
                return 0;
              }}

              \n""".format(ARGUMENTS.get('print', 'nothing'))
            )

def generate_main(env, target, source):
    with open( env.GetBuildPath( target[0] ), 'w') as out:
        write_main( out )

main_builder = env.Builder( action = generate_main )
main_cpp = main_builder( env, env.GetBuildPath('main.cpp'), [] )

prog = env.Program( target='main', source=main_cpp )

今私が実行した場合:

$ scons print=one && ./main 
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
generate_main(["main.cpp"], [])
g++ -o main.o -c main.cpp
g++ -o main main.o
scons: done building targets.
[one]

$ scons print=two && ./main
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
[one]

$ rm main.cpp
$ scons print=two && ./main
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
generate_main(["main.cpp"], [])
g++ -o main.o -c main.cpp
g++ -o main main.o
scons: done building targets.
[two]

したがって、中間のビルドが正しくないことがはっきりとわかります。これはどのように解決できますか?

:本体を移動するwrite_maingenerate_main(関数が1つしかないため)、正しく再構築されます。

:

私が考えることができる1つの解決策は、すべての関数にtargetオブジェクトを提供して、Depends明示的に呼び出すことができるようにすることです。その例では、次のような呼び出しを意味します。

Depends( target, env.Variable( ARGUMENTS.get('print', 'nothing') ) )

write_mainでそれについての知識を必要とせずに、の現在の署名を維持できるようにする他のアプローチはありますgenerate_mainか?

また、コードの一部に対して特定の構文の強調表示を強制するにはどうすればよいでしょうか? (上記のシェル出力では、奇妙な/間違った色になります)

4

2 に答える 2

3

基本的な問題は、SCons がmain.cpp分析時に生成されたファイルの内容を認識していないことです。したがって、依存関係が変更されていないため、2回目の実行では再構築されません。必要なのは、env.Builder( action = generate_main )ビルダーを入力引数に依存させることです。そのようにして、入力引数が変更されると、main.cpp. これを取得するにはいくつかの方法があります。私が考えることができる1つの方法は、ビルダーがビルド時にenvを考慮に入れるため、引数をenvに追加することです。次のようになります。

env.inputArguments = ARGUMENTS.get('print', 'nothing')

あなたの真上に置かれたmain_builder = env.Builder( action = generate_main )

よろしくお願いします

于 2012-12-06T07:20:56.610 に答える
3

Depends () 関数を使用して、SCons で明示的な依存関係を作成できます。

于 2012-11-29T19:50:10.933 に答える