22

cmake と make を使用してコンパイルする boost.python プロジェクトがあります。これは Python モジュールの一部であり、distutils を使用してそのモジュールをインストールできるようにしたいと考えています。ここの指示に従って、最初に共有ライブラリをコンパイルする CMakeLists.txt ファイルを作成し、次に setup.py をセットアップして、Python モジュールをインストールしてインストールするようにしました。ただし、すべての python ファイルは distutils によって認識され、ビルド ディレクトリに移動されますが、共有ライブラリはそうではなく、その理由は本当にわかりません。

私のプロジェクトのディレクトリ構造:

  • 事業
    • ビルド (python distutils ディレクトリ)
    • doc (モジュールのドキュメント)
    • module (メインモジュールディレクトリ)
      • core (boost プロジェクト/ライブラリのディレクトリ
        • CMakeLists.txt - 共有ライブラリを構築します
      • other_py_files (純粋な python ファイルのいくつかのディレクトリ)
    • CMakeLists.txt
    • setup.py.in
    • setup.py (cmake で生成)

私の setup.py.in ファイル:

from distutils.core import setup
setup(
    name='module',
    version='${PACKAGE_VERSION}',
    packages=['module', 'module.core', 'module.other_py_files'],
    package_dir={'': '${CMAKE_CURRENT_SOURCE_DIR}'},
)

私のCMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (module)

add_subdirectory(module/core)

find_program(PYTHON "python")

if (PYTHON)
  set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
  set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
  set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/pyQCD/__init__.py")
  set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/build/timestamp")

  configure_file(${SETUP_PY_IN} ${SETUP_PY})

  add_custom_command(OUTPUT ${OUTPUT}
    COMMAND ${PYTHON} ${SETUP_PY} build
    COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}
    DEPENDS ${DEPS})

  add_custom_target(target ALL DEPENDS ${OUTPUT})

  install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")

endif()

distutils は共有ライブラリの拡張機能をビルドディレクトリに自動的に追加するはずだと思っていましたが、どこかで間違っているのでしょうか? (共有ライブラリは、C API (boost.python) 上に構築されたインポート可能な python モジュールなので、正しく動作するはずです?)

4

2 に答える 2

9

最後に、ここでの回答に従い、build_ext コマンドをオーバーライドしました。ビルドをクロス プラットフォームにしたいので、共有ライブラリはモジュール ソース ツリー内にあるため、モジュール共有ライブラリをインポートし、fileプロパティを使用して setup.py から共有ライブラリへのパスを取得します。

于 2013-08-21T16:06:50.977 に答える