2013-08-21 7 views
15

Ich habe ein boost.python Projekt, das ich cmake mit kompilieren und machen. Es ist Teil eines Python-Moduls, und ich möchte in der Lage sein, dieses Modul mit Distutils zu installieren. Ich habe die Anweisungen befolgt here eine CMakeLists.txt-Datei zu erstellen, die zuerst die gemeinsame Bibliothek kompiliert, dann richtet setup.py so dass make mit installieren Sie die Python-Modul installieren. Während jedoch alle Python-Dateien von distutils erkannt und in das Build-Verzeichnis verschoben werden, ist die gemeinsame Bibliothek nicht, und ich weiß wirklich nicht warum.Python/C++ - Kompilieren gemeinsam genutzte Bibliothek mit cmake und Installation mit distutils

Mein Projekt-Verzeichnisstruktur:

  • Projekt
    • build (Python distutils Verzeichnis)
    • doc (Modul-Dokumentation)
    • Modul (Hauptmodulverzeichnis)
      • Kern (dir für die Boost-Projekt/Bibliothek
        • CMakeLists.txt - baut gemeinsam genutzte Bibliothek
      • other_py_files (mehrere Verzeichnisse von reinen Python-Dateien)
    • CMakeLists.txt
    • setup.py.in
    • setup.py (erzeugt durch Cmake)

Meine 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}'}, 
) 

Mein 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() 

Ich dachte distutils sollte automatisch gemeinsam genutzte Bibliothek Erweiterungen hinzufügen Verzeichnis zu bauen, oder habe ich bekam, dass irgendwo falsch? (Die shared library ist ein importierbares Python-Modul, das auf dem CAPI (boost.python) aufbaut, sollte also richtig funktionieren?)

+0

hier ein Link zu einem C/Python-Modul, das verwendet CMake - https://gitlab.com/ideasman42/blender-mathutils - distutils wird verwendet, nur Python Präfix zu extrahieren. * (obwohl es auch eine setutil.py-Datei gibt, die nicht für den CMake-Build verwendet wird) * – ideasman42

Antwort

9

Am Ende folgte ich der Antwort here und überging den Befehl build_ext. Wie ich die Build seine Cross-Plattform will, und da die gemeinsam genutzte Bibliothek im Innern des Moduls Quellbaumes liegt, importiere ich das Modul gemeinsam genutzte Bibliothek hinzufügen, um die Datei Eigenschaft verwenden, den Pfad zu der gemeinsamen genutzten Bibliothek von setup.py zu bekommen.

0

scikit-build ist eine benutzerdefinierte Implementierung von setup, die distutils.core.Extension ersetzt und Cmake verwendet, um die Quellen zu kompilieren. Eine Vielzahl von Beispielprojekten kann here gefunden werden. In dem Fall sind Sie Pybind11 verwenden, gibt es ein weiteres einfaches Beispiel für die Nutzung here.

Verwandte Themen