python/c++ Compiler la bibliothèque partagée avec cmake et de l'installation avec des distutils
J'ai un coup de boost.projet de python que j'ai compiler à l'aide de cmake et de faire. Il fait partie d'un module python, et je veux être en mesure d'installer ce module à l'aide de distutils. J'ai suivi les instructions ici pour créer un CMakeLists.txt fichier qui aborde d'abord la bibliothèque partagée, puis setup.py alors que faire de l'installer avec installer le module python. Cependant, alors que tous les fichiers python sont reconnus par distutils et déplacé vers le répertoire de construction, la bibliothèque partagée n'est-ce pas, et je ne sais vraiment pas pourquoi.
Mon projet de structure de répertoire:
- projet
- construire (python distutils répertoire)
- doc (documentation du module)
- module (module principal répertoire)
- de base (dir pour le coup de pouce de projet/bibliothèque
- CMakeLists.txt - construit la bibliothèque partagée
- other_py_files (plusieurs répertoires de pure fichiers python)
- de base (dir pour le coup de pouce de projet/bibliothèque
- CMakeLists.txt
- de l'installation.py.dans
- setup.py (généré par cmake)
Mon installation.py.dans le fichier:
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}'},
)
Mon 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()
J'ai pensé distutils était censé ajouter de la bibliothèque partagée extensions automatiquement au répertoire de construction, ou j'ai obtenu que mal quelque part? (La bibliothèque partagée est une importables module python construit sur l'api C (boost.python), donc ça devrait marcher non?)
- Voici un lien vers un C/module Python qui utilise CMake - gitlab.com/ideasman42/blender-mathutils - distutils est juste utilisé pour extraire Python préfixe. (bien qu'il y est un distutils setup.py aussi, ce n'est pas utilisée pour la compilation CMake)
- Notez que vous devez spécifier le
WORKING_DIRECTORY
lorsque vous appelezCOMMAND ${PYTHON} ${SETUP_PY} build
. Il devrait pointer vers l'endroit où votresetup.py
fichier est. Si il n'est pas spécifié, vous pouvez obtenir un paquet vide.
Vous devez vous connecter pour publier un commentaire.
À la fin, j'ai suivi la réponse ici et emportait la build_ext de commande. Comme je veux le construire à la croix-plate-forme, et depuis la bibliothèque partagée se trouve à l'intérieur du module de source de l'arbre, j'ai importer le module bibliothèque partagée ajouter l'utilisation de la fichier propriété afin d'obtenir le chemin d'accès à la bibliothèque partagée de setup.py.
scikit-construire est une coutume de la mise en oeuvre de
setup
qui remplacedistutils.core.Extension
et utilise cmake pour compiler les sources. Une variété de projets de l'échantillon peut être trouvé ici. Dans le cas où vous utilisez Pybind11, il y a un autre exemple simple de l'utilisation de la ici.