編集完全に書き直された例、問題は同じです。
私は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_main
とgenerate_main
(関数が1つしかないため)、正しく再構築されます。
注:
私が考えることができる1つの解決策は、すべての関数にtarget
オブジェクトを提供して、Depends
明示的に呼び出すことができるようにすることです。その例では、次のような呼び出しを意味します。
Depends( target, env.Variable( ARGUMENTS.get('print', 'nothing') ) )
write_main
でそれについての知識を必要とせずに、の現在の署名を維持できるようにする他のアプローチはありますgenerate_main
か?
また、コードの一部に対して特定の構文の強調表示を強制するにはどうすればよいでしょうか? (上記のシェル出力では、奇妙な/間違った色になります)