3

プロジェクトのコンパイルに scons を使用しています。私のプロジェクトでは、ソース ファイルは別のディレクトリにあります。これらのプロジェクト ソース ファイルをコンパイルするには、すべてのディレクトリに sconscript ファイルが必要ですか?

すべてのディレクトリを単一の sconscript ファイルでコンパイルしようとしました。しかし、すべてのオブジェクト ファイルがソース ディレクトリにのみ追加されます。

私はこの機能を使用しています:

env.Library('libs',files_list)

files_list にファイル名のみが含まれている場合、Obj ファイルは @ variant ディレクトリを生成しています。

files_list にファイル パス名が含まれている場合、Obj ファイルは @ ソース ディレクトリを生成しています。

これを行う方法を教えてもらえますか?

4

2 に答える 2

2

最初の質問に答えるには: いいえ、そのディレクトリ内のファイルをコンパイルできるようにするために、すべての src サブディレクトリに SConscript を配置する必要はありません。1 つの SConstruct からすべてを実行できます。

そうは言っても、多くの場合、srcサブディレクトリにSConscriptを配置する方がクリーンで整理されていると考えられています。通常、この状況では、ルート SConstruct がプロジェクト全体に共通するものをセットアップし、src サブディレクトリへの呼び出しを調整します。次に、各 src サブディレクトリの SConstruct は、そのサブディレクトリの詳細に焦点を当てます。よりモジュール化されているため、私はこのアプローチを好みます。さらに、これにより、異なる環境で同じ src サブディレクトリ SConstruct を呼び出して、デバッグやリリースなど、同じコードの異なるバージョンをコンパイルすることができます。

これはすべて、SConstruct で環境を作成し、それを SConscript() 関数で sudirs に渡すことによって実行できます。次に例を示します。

Sコンストラクト

env = Environment()
env.Append(CPPPATH = '/some/dir/common/to/all')

SConscript('src/subdirA/SConscript',
           variant_dir = 'build/subdirA',
           duplicate = 0,
           exports = 'env')
SConscript('src/subdirB/SConscript',
           variant_dir = 'build/subdirB',
           duplicate = 0,
           exports = 'env')

src/subdirA/SConscript

Import('env')

# If you need to add specific things to the env, then you should clone it,
# else the changes will be seen in other subdirs: clonedEnv = env.Clone()
# No need to specify the path to the source files if all source files are in 
# the same dir as this SConscript.
env.Library(target='subdirA', source='fileA.cc')

src/subdirB/SConscript

Import('env')

# If you need to add specific things to the env, then you should clone it,
# else the changes will be seen in other subdirs: clonedEnv = env.Clone()
env.Library(target='subdirB', source='fileB.cc')

最後の質問に関しては、あなたが探しているものを本当に理解していませんが、上で説明したオプションを使用すると、結果のコンパイル済みターゲットは常に VariantDir に配置されます。

于 2013-03-14T17:28:38.877 に答える