Python / Компиляция разделяемой библиотеки с помощью cmake и установка с помощью distutils

У меня есть проект boost.python, который я компилирую с помощью cmake и make. Это часть модуля python, и я хочу иметь возможность установить этот модуль с помощью distutils. Я следовал инструкциям Вот создать файл CMakeLists.txt, который сначала компилирует общую библиотеку, а затем настраивает setup.py, чтобы выполнить установку с установкой модуля python. Однако, хотя все файлы python распознаются distutils и перемещаются в каталог сборки, общая библиотека не распознается, и я действительно не знаю, почему.

Структура каталогов моего проекта:

  • проект
    • build (каталог дистрибутивов Python)
    • документация (документация к модулю)
    • модуль (основной каталог модулей)
      • ядро (каталог для буст-проекта / библиотеки
        • 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, построенный на C api (boost.python), поэтому он должен работать правильно?)

16

Решение

В конце концов я последовал за ответом Вот и переопределить команду build_ext. Поскольку я хочу, чтобы сборка была кроссплатформенной, и поскольку разделяемая библиотека находится внутри дерева исходного кода модуля, я импортирую разделяемую библиотеку модуля с использованием файл свойство, чтобы получить путь к общей библиотеке из setup.py.

9

Другие решения

scikit-сборки это пользовательская реализация setup это заменяет distutils.core.Extension и использует cmake для компиляции источников. Разнообразие примеров проектов можно найти Вот. В случае, если вы используете Pybind11, есть еще один простой пример использования Вот.

0

По вопросам рекламы [email protected]