python / C++ - компиляция общей библиотеки с cmake и установка с дистрибутивами
у меня есть импульс.проект python, который я компилирую с помощью cmake и make. Это часть модуля python, и я хочу иметь возможность установить этот модуль с помощью distutils. Я следовал инструкциям здесь для создания CMakeLists.txt-файл, который сначала компилирует общую библиотеку, а затем настраивает setup.py так что сделайте install с установкой модуля python. Однако, хотя все файлы python распознаются distutils и перемещаются в каталог сборки, общая библиотека не является, и я действительно не знаю, почему.
структура каталогов моего проекта:
- build (каталог дистрибутивов python)
- doc (документация модуля)
- модуль (основной модуль )
- core (dir для проекта/библиотеки boost
- CMakeLists.txt-создает общую библиотеку
- other_py_files (несколько каталогов чистого python файлы)
- core (dir для проекта/библиотеки boost
- CMakeLists.txt
- настройка.пай.в
- setup.py (генерируется cmake)
моя настройка.пай.в файле:
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.питон), так это должно сработать правильно?)
2 ответов
В конце концов я последовал за ответ!--1-->здесь и переопределил команду build_ext. Поскольку я хочу, чтобы сборка была кросс-платформенной, и поскольку общая библиотека находится внутри дерева источника модуля, я импортирую модульную общую библиотеку add use свойство для получения пути к общей библиотеке из setup.py.
scikit-build - это пользовательская реализация setup
заменяет distutils.core.Extension
и использует CMake для компиляции источников. Различные примеры проектов можно найти здесь. В случае, если вы используете Pybind11, есть еще один простой пример использования здесь.