Python/С++ - Компиляция разделяемой библиотеки с cmake и установка с distutils - программирование
Подтвердить что ты не робот

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

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

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

  • Проект
    • build (каталог python distutils)
    • doc (документация по модулю)
    • модуль (каталог основного модуля)
      • core (dir для проекта/библиотеки 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}'},
)

My 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), поэтому он должен работать правильно?)

4b9b3361

Ответ 1

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

Ответ 2

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