7

私は数日間sconsを使用していて、少し混乱しました。指定されたルートから再帰的にソースを構築するための組み込みツールがないのはなぜですか?説明させてください:私はそのようなソースの性質を持っています:

src
    Core
       folder1
       folder2
           subfolder2_1
    Std
       folder1

..等々。この木はかなり深くなる可能性があります。

今、私はそのような構造でこれを構築します:

sources = Glob('./builds/Std/*/*.cpp')
sources = sources + Glob('./builds/Std/*.cpp')
sources = sources + Glob('./builds/Std/*/*/*.cpp')
sources = sources + Glob('./builds/Std/*/*/*/*.cpp')

そして、これは可能な限り完璧ではないように見えます。当然のことながら、Pythonコードを書くことはできますが、これを行うためのより適切な方法はありますか?

4

4 に答える 4

10

Torstenがすでに述べたように、SConsには「内部」再帰Glob()はありません。あなたは自分で何かを書く必要があります。私の解決策は次のとおりです。

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
  for filename in fnmatch.filter(filenames, '*.c'):
    matches.append(Glob(os.path.join(root, filename)[len(root)+1:]))

特にVariantDir()を使用する場合は、ここでGlob()が必要であることを強調したいと思います(Pythonのglob.glob()ではありません)。また、VariantDir()を使用する場合は、絶対パスを相対パスに変換することを忘れないでください(この例では、[len(root)+1:]を使用してこれを実現しています)。

于 2012-06-15T17:50:08.077 に答える
6

もちろん。あなたはdirsを歩くためにPythonラッパーを書く必要があります。あなたはstackoverflowで多くのレシピを見つけることができます。これが現在のディレクトリのサブディレクトリのリストを返す私の単純な関数です(そして'。'-ドットで始まる非表示のディレクトリを無視します)

def getSubdirs(abs_path_dir) :  
    lst = [ name for name in os.listdir(abs_path_dir) if os.path.isdir(os.path.join(abs_path_dir, name)) and name[0] != '.' ]
    lst.sort()
    return lst

たとえば、foo、bar、iceを含むモジュールをdirしました。

corePath = 'abs/path/to/modules'
modules = getSubdirs(corePath)
# modules = [bar, foo, ice]
for module in modules :
  sources += Glob(os.path.join(corePath, module, '*.cpp'))

getSubdirs関数を改善して、サブディレクトリに再帰を追加し、より深く歩くことができます。

于 2012-05-17T08:29:52.160 に答える
2

Glob()SCons関数には、再帰的に実行する機能がありません。

次のように、list.extend()関数を使用するようにPythonコードを変更すると、はるかに効率的です。

sources = Glob('./builds/Std/*/*.cpp')
sources.extend(Glob('./builds/Std/*.cpp'))
sources.extend(Glob('./builds/Std/*/*/*.cpp'))
sources.extend(Glob('./builds/Std/*/*/*/*.cpp'))

自分のように再帰的にしようとする代わりに、各サブディレクトリにSConscriptスクリプトを配置し、ルートSConstructでSConscript()関数を使用してそれぞれを呼び出すのが一般的です。これはSCons階層ビルドと呼ばれます。

于 2012-05-15T11:43:18.230 に答える
1

私はこれを使用します:

srcdir = './'
sources = [s for s in glob2.glob(srcdir + '**/*.cpp') if "/." not in s]
于 2019-10-23T17:30:43.040 に答える