web-dev-qa-db-ja.com

python / c ++-cmakeを使用して共有ライブラリをコンパイルし、distutilsを使用してインストールする

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

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

  • 事業
    • ビルド(python distutilsディレクトリ)
    • doc(モジュールドキュメント)
    • モジュール(メインモジュールディレクトリ)
      • コア(ブーストプロジェクト/ライブラリのディレクトリ
        • 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は共有ライブラリ拡張機能を自動的に追加してディレクトリを構築することになっていると思いましたか、それともどこかで間違っていましたか? (共有ライブラリはインポート可能なpythonモジュールはCapi(boost.python)上に構築されているので、正しく機能するはずですか?)

20
orentago

結局、私は答え ここ に従い、build_extコマンドを無効にしました。ビルドをクロスプラットフォームにしたいので、共有ライブラリはモジュールソースツリー内にあるので、モジュール共有ライブラリをインポートします。addusefile setup.pyから共有ライブラリへのパスを取得するプロパティ。

10
orentago

scikit-build は、distutils.core.Extensionを置き換え、cmakeを使用してソースをコンパイルするsetupのカスタム実装です。さまざまなサンプルプロジェクトを見つけることができます ここPybind11 を使用している場合、別の簡単な使用例があります ここ

1
mcguip