python - /c++ - shared library Kompilieren mit cmake und Installation mit distutils
Habe ich einen Schub.python-Projekt, das ich kompilieren mit cmake und make. Es ist Teil eines python-Modul, und ich möchte in der Lage sein zu installieren das Modul mit distutils. Ich habe die Anweisungen befolgt hier zu erstellen CMakeLists.txt Datei, die kompiliert zuerst die shared library, dann stellt setup.py damit machen Sie die Installation mit installieren Sie das python-Modul. Jedoch, während alle python-Dateien erkannt werden distutils und zog in das build-Verzeichnis, das gemeinsame Bibliothek ist nicht, und ich weiß wirklich nicht, warum.
Mein Projekt-Verzeichnis-Struktur:
- Projekt
- bauen (python-distutils-Verzeichnis)
- doc (Modul-Dokumentation)
- - Modul (main-Modul-Verzeichnis)
- core (dir für den boost-Projekt/Bibliothek
- CMakeLists.txt - gemeinsame Bibliothek
- other_py_files (mehrere Verzeichnisse von reinen python-Dateien)
- core (dir für den boost-Projekt/Bibliothek
- CMakeLists.txt
- setup.py.in
- setup.py (erstellt von cmake)
Meinem setup.py.in Datei:
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}'},
)
Meine 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()
Dachte ich distutils sollte hinzufügen, shared-library-Erweiterungen automatisch zu bauen-Verzeichnis, oder habe ich das irgendwo falsch? (Die "shared library" ist eine Importierbare python-Modul baut auf der C-api (boost.python), also sollte es funktionieren oder?)
- Hier ist ein link zu einem C/Python-Modul, das verwendet CMake - gitlab.com/ideasman42/blender-mathutils - distutils wird nur verwendet, um zu extrahieren Python-Präfix. (obwohl es ist eine distutils setup.py auch das ist nicht verwendet für das CMake -)
- Beachten Sie, dass Sie sollten geben Sie den
WORKING_DIRECTORY
beim AufrufCOMMAND ${PYTHON} ${SETUP_PY} build
. Es sollte darauf hinweisen, wo Ihresetup.py
- Datei ist. Wenn es nicht angegeben ist, erhalten Sie möglicherweise ein leeres Paket.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich am Ende folgte die Antwort hier und überschrieb die build_ext Befehl. Wie will ich das bauen, cross-Plattform, und da die shared-Bibliothek liegt in der Modul-source-tree, ich Importiere das Modul gemeinsam genutzten Bibliothek hinzuzufügen, verwenden Sie die Datei - Eigenschaft, um den Pfad für die shared library aus setup.py.
scikit-bauen ist eine benutzerdefinierte Implementierung
setup
ersetztdistutils.core.Extension
und verwendet cmake zum kompilieren der Quellen. Eine Vielzahl von Beispiel-Projekte finden Sie hier. In dem Fall bist du mit Pybind11, es gibt ein weiteres einfaches Beispiel für die Verwendung hier.