5

私は最近、中規模の C++ プロジェクト用のマルチプラットフォーム ビルド フレームワークを実装するために scons を手に入れました。ビルドは、すべての最後に呼び出す必要がある一連の単体テストを生成します。どうやってそのようなことを達成するのですか?

たとえば、私のトップレベルのsconstructでは、

subdirs=['list', 'of', 'my', 'subprojects']
for subdir in subdirs:
    SConscript(dirs=subdir, exports='env', name='sconscript',
       variant_dir=subdir+os.sep+'build'+os.sep+mode, duplicate=0)

ただし、各サブディレクトリには単体テストがありますが、その中にビルドされた dll と実行可能ファイルの間に依存関係があるため、すべてのサブディレクトリがビルドおよびインストールされるまでテストの実行を保持したいと考えています (つまり、env.Install を使用します)。 )。

ビルドされたテストを反復処理して実行するには、どこにループを記述すればよいですか? このループの直後に配置しようとしましたが、scons では実行順序を制御できないため、必要な前に実行されてしまいます。

scons初心者を助けてください。:)

ありがとう、

4

4 に答える 4

5

SCons は、Make と同様に、ビルドの問題を解決するために宣言型の方法を使用します。SCons にその仕事のやり方を教えたくありません。すべての依存関係を文書化してから、SCons にすべてをビルドする方法を解決させたいと考えています。

何かが他の何かの前に実行されている場合は、依存関係を作成して接続する必要があります。

dmy touch ファイルを作成する場合は、次のようなカスタム ビルダーを作成できます。

import time

def action(target, source, env):
    os.system('echo here I am running other build')
    dmy_fh = open('dmy_file','w')
    dmy_fh.write( 'Dummy dependency file created at %4d.%02d.%02d %02dh%02dm%02ds\n'%time.localtime()[0:6])
    dmy_fh.close()

bldr = Builder(action=action)
env.Append( BUILDERS = {'SubBuild' : bldr } )

env.SubBuild(srcs,tgts)

scons は md5 ハッシュを使用するため、タイムスタンプをダミー ファイルに入れることは非常に重要です。空のファイルがある場合、md5 は常に同じであり、後続のビルド ステップを実行しないことを決定する場合があります。基本的なコマンドでさまざまな微調整を生成する必要がある場合は、関数ファクトリを使用してテンプレートを変更できます。例えば

def gen_a_echo_cmd_func(echo_str):
    def cmd_func(target,source,env):
        cmd = 'echo %s'%echo_str
        print cmd
        os.system(cmd)
    return cmd_fun

bldr = Builder(action = gen_a_echo_cmd_func('hi'))
env.Append(BUILDERS = {'Hi': bldr})
env.Hi(srcs,tgts)

bldr = Builder(action = gen_a_echo_cmd_func('bye'))
env.Append(BUILDERS = {'Bye': bldr})
env.Bye(srcs,tgts)

scons ビルド フローに自動的に挿入したいもの (たとえば、他のすべてが実行された後にすべてのビルド ログ ファイルを圧縮するもの) がある場合は、私の質問 hereを参照してください。

于 2009-12-10T19:29:27.153 に答える
3

解決策はこれと同じくらい簡単なはずです。

Test builders の結果が Install builder の結果に依存するようにする

擬似的に:

test = Test(dlls)
result = Install(dlls)
Depends(test,result)

最良の方法は、テスト ビルダーが実際に dll の依存関係を解決することですが、そうしない理由はさまざまです。

于 2010-01-11T10:10:39.507 に答える
0

依存関係に関しては、すべてのテストアクションがすべてのプログラム構築アクションに依存することが必要です。これを行う方法は、ダミーターゲットを作成してすべてのサブディレクトリのsconscriptファイルにエクスポートし、sconscriptファイルでDepends、メインターゲットにダミーターゲットを作成し、ダミーターゲットにテストターゲットDependsを配置することです。

ダミーターゲットの設定方法を理解するのに少し問題がありますが、これは基本的に機能します。

(トップレベルのSConstruct内)

dummy = env.Command('.all_built', 'SConstruct', 'echo Targets built. > $TARGET')
Export('dummy')

(各サブディレクトリのSConscript内)

Import('dummy')
for target in target_list:
  Depends(dummy, targe)
for test in test_list:
  Depends(test, dummy)

さらなる改良が可能であると確信していますが、おそらくこれで始められるでしょう。

編集:この主題についてこのページを指摘する価値もあります。

于 2009-12-10T18:22:15.063 に答える
0

それぞれSConscriptが依存関係を構築する値を返すようにするだけです。

SConscript ファイル:

test = debug_environment.Program('myTest', src_files)
Return('test')

SConstruct ファイル:

dep1 = SConscript([...])
dep2 = SConscript([...])
Depends(dep1, dep2)

dep1ビルドが完了した後にビルドが完了するようになりましたdep2

于 2012-05-24T15:58:17.433 に答える