3

Mac、Linux、およびWindowsのビルドシステムにSCons+swtoolkitを使用しています。すべての外部ライブラリの依存関係を含むsvnリポジトリがあり、そのパスは環境変数EXTERNAL_SDKSにあります。

各ターゲットSConscriptで、ターゲットがリンクされているEXTERNAL_SDKSパスの下にあるライブラリを検索し、ターゲット自体がビルドされてそこに配置されるときに、ビルド出力フォルダーにコピーするメソッドを見つけたいと思います。

swtoolkitの追加コンポーネントを使用してこれを行う方法の1つを見つけましたが、sconscriptsの解析が1トン遅くなります(Macでは15秒以上、Windowsでは1分以上!!)。

誰かがこれを行う効率的な方法を知っていますか?

4

1 に答える 1

2

swtoolkitを作成したGoogleの開発者であるRandallSpanglerを介して答えを見つけました。したがって、この回答はSConsでのswtoolkitの使用に固有のものです。

以前は、依存関係についてターゲットをスキャンし、その依存関係スキャンからコピーする外部ライブラリを決定していました。これが深刻な減速の原因でした。

swtoolkitには、他のターゲットの依存関係として使用できるようにターゲットを登録するenv.Publish()メソッドがあります。外部ライブラリが公開されると、ターゲットのビルド時にswtoolkit内で使用されるReplicatePublished()呼び出しを介して、ビルド出力フォルダーに自動的にコピーされます。

彼は次のサンプルコードを提供しました。

thirdparty_libs = []
for dir in env.SubstList2('$THIRDPARTY_LIB_DIRS'):
  thirdparty_libs += env.Glob(dir + '/lib*.dylib')
  thirdparty_libs += env.Glob(dir + '/lib*.a')

import os
for lib in thirdparty_libs:
  name_parts = os.path.splitext(lib.name)
  if name_parts[1] == '.dylib':
    # TODO: Need to publish 'libfoo.dylib' or 'libfoo.a' as both
    # 'libfoo' and 'foo'.  Need to clean up sconscripts to remove 'lib' prefix
    # from all libs for mac, linux.
    lib_basename = name_parts[0]
    env.Publish(lib_basename, 'run', lib)
    env.Publish(lib_basename[3:], 'run', lib)

ニーズに合わせてこれを変更し、外部ライブラリの使用を構成するスクリプトに配置しました。たとえば、BoostSettingsモジュールでは、これによりすべてのBoostライブラリが検索されて公開されます。それらの1つがターゲットで必要な場合は、ビルド出力フォルダーに自動的にコピーされます。

于 2010-03-17T18:42:40.443 に答える