1

私は現在、次のようなことを試みています-

projects = envsrc.MSVSProject(target = 'none' + env['MSVSPROJECTSUFFIX'],
srcs = Glob("src/*.cpp"),
incs = Glob("src/*.hpp"),
buildtarget = exe,
variant = 'Release')

しかし、srcs は文字列または文字列のリストでなければならないというエラーが表示されます。これに対する正しい方法は何ですか? src は、ヘッダーと cpp ファイルを含むルート ディレクトリ内のフォルダーであり、sconscript はルート ディレクトリにあります。

4

1 に答える 1

3

コメントで提案した印刷ステートメントが機能しなかった理由を確認しようとしたときに、問題が何であるかを理解しました。

まず第一に、Python で文字列のリスト内のすべての文字列を出力する効率的な方法は次のようになります。

', '.join(Sources)

引用符で囲まれた部分は、', '文字列のリスト内の要素間の区切りです。

次の SConstruct の抜粋で問題を認識しました。

sources = (Glob('src/dir1/*.cc')
+Glob('src/dir2/*.cc')
+Glob('src/dir3/*.cc'))

print sources
print ', '.join(sources)

次の出力が得られます。

scons: Reading SConscript files ...
[<SCons.Node.FS.File object at 0x122e4d0>, <SCons.Node.FS.File object at 0x122e710>, <SCons.Node.FS.File object at 0x122e950>]
TypeError: sequence item 0: expected string, File found:
  File "/home/notroot/projects/sandbox/SconsGlob/SConstruct", line 10:
    print ', '.join(sources)

そのとき、SCons Glob() 関数が文字列のリストではなく、ノード (ファイル) のリストを返すことを思い出しました。SCons のマニュアル ページ(「glob(」を検索)によると、使用方法は次のとおりです。

Glob(pattern, [ondisk, source, strings])

また、strings 引数は次のことを行います。

string 引数を True (または同等の値) に設定すると、一致したファイルまたはディレクトリを表すノードではなく、Glob() 関数が文字列を返すようになります...

MSVSProject() ビルダーは、ノードではなく文字列のリストを想定しています。したがって、次のようにすると、期待どおりに機能します。

sources = (Glob('src/dir1/*.cc', strings=True)
+Glob('src/dir2/*.cc', strings=True)
+Glob('src/dir3/*.cc', strings=True))

print ', '.join(sources)

次の出力が得られます。

scons: Reading SConscript files ...
src/dir1/main.cc, src/dir2/func2.cc, src/dir3/func3.cc
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
于 2013-03-11T13:59:57.613 に答える