ruta - python/c++-Compilando la biblioteca compartida con cmake e instalando con distutils
ndk r16b download (2)
Al final, seguí la respuesta here y anulé el comando build_ext. Como deseo que la compilación sea multiplataforma, y dado que la biblioteca compartida se encuentra dentro del árbol de origen del módulo, importo la adición de la biblioteca compartida del módulo.
Tengo un proyecto boost.python que compilo usando cmake y make. Es parte de un módulo de Python, y quiero poder instalar ese módulo utilizando distutils. He seguido las instrucciones here para crear un archivo CMakeLists.txt que primero compila la biblioteca compartida, luego configura setup.py para que realice la instalación con la instalación del módulo python. Sin embargo, aunque todos los archivos de Python son reconocidos por los nombres y se mueven al directorio de compilación, la biblioteca compartida no lo es, y realmente no sé por qué.
La estructura del directorio de mi proyecto:
- proyecto
- construir (directorio de python distutils)
- doc (documentación del módulo)
- módulo (directorio principal del módulo)
- core (dir para el proyecto de impulso / biblioteca
- CMakeLists.txt - construye una biblioteca compartida
- other_py_files (varios directorios de archivos de python puros)
- core (dir para el proyecto de impulso / biblioteca
- CMakeLists.txt
- setup.py.in
- setup.py (generado por cmake)
Mi archivo 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}''},
)
Mis 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()
Pensé que se suponía que distutils agregaría extensiones de biblioteca compartidas automáticamente al directorio de compilación, ¿o me he equivocado de eso en algún lugar? (La biblioteca compartida es un módulo de Python importable construido en la api de C (boost.python), por lo que debería funcionar, ¿no?)
scikit-build es una implementación personalizada de la setup
que reemplaza distutils.core.Extension
y usa cmake para compilar las fuentes. Una variedad de proyectos de muestra se pueden encontrar here . En el caso de que estés usando Pybind11 , hay otro ejemplo simple de uso here .