5

私は CMake でツリー外ビルドを使用しています。proto ファイルから *_pb2.py ファイルを生成する CMake カスタム コマンドがあります。proto-files は のような未知の数のサブディレクトリ (パッケージ名前空間) に存在する可能性がある$SRC/package1/package2/file.protoため、ビルド ディレクトリには のようなものが含まれます$BLD/package1/package2/file_pb2.py

自動生成された *_pb2.py ファイルから暗黙的にパッケージを作成したいので、すべてのサブフォルダー ( 、 など) に __init__.py ファイルを自動的に生成して$BLD/package1インストール$BLD/package1/package2したいと考えています。

どうやってやるの?

PS私はCMakeからマクロを試しました:ディレクトリのすべてのサブディレクトリの名前を取得するには? GLOBGLOB_RECURSEに変更しました)が、ファイルを含むサブディレクトリのみを返します。package1上記の例からサブディレクトリを取得できません。

4

2 に答える 2

6

*NIX OS (Mac を含む) で作業している場合は、次のようなシェルの find コマンドを使用できます。

ROOT="./"
for DIR in $(find $ROOT -type d); do
    touch $DIR/__init__.py
done

またはpythonスクリプトを使用:

from os.path import isdir, walk, join

root = "/path/to/project"
finit = '__init__.py'
def visitor(arg, dirname, fnames):
    fnames = [fname for fname in fnames if isdir(fname)]
    # here you could do some additional checks ...
    print "adding %s to : %s" %(finit, dirname)
    with open(join(dirname, finit), 'w') as file_: file_.write('')

walk(root, visitor, None)
于 2012-07-12T09:53:55.583 に答える
2

以下は、変数で必要なディレクトリのリストを提供する必要がありますAllPaths

# Get paths to all .py files (relative to build dir)
file(GLOB_RECURSE SubDirs RELATIVE ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}/*.py")
# Clear the variable AllPaths ready to take the list of results
set(AllPaths)
foreach(SubDir ${SubDirs})
  # Strip the filename from the path
  get_filename_component(SubDir ${SubDir} PATH)
  # Change the path to a semi-colon separated list
  string(REPLACE "/" ";" PathParts ${SubDir})
  # Incrementally rebuild path, appending each partial path to list of results
  set(RebuiltPath ${CMAKE_BINARY_DIR})
  foreach(PathPart ${PathParts})
    set(RebuiltPath "${RebuiltPath}/${PathPart}")
    set(AllPaths ${AllPaths} ${RebuiltPath})
  endforeach()
endforeach()
# Remove duplicates
list(REMOVE_DUPLICATES AllPaths)
于 2012-07-12T10:18:01.633 に答える