最初の質問に答えるには: いいえ、そのディレクトリ内のファイルをコンパイルできるようにするために、すべての 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 に配置されます。