2013-08-21 8 views
15

Mam projekt boost.python, który kompiluję używając cmake i make. Jest to część modułu python i chcę móc go zainstalować przy użyciu distutils. Postępowałem zgodnie z instrukcjami here, aby utworzyć plik CMakeLists.txt, który najpierw kompiluje bibliotekę współużytkowaną, a następnie konfiguruje plik setup.py, aby dokonać instalacji z instalacją modułu python. Jednak, mimo że wszystkie pliki Pythona są rozpoznawane przez distutils i przenoszone do katalogu budowania, biblioteka współużytkowana nie jest i naprawdę nie wiem dlaczego.python/C++ - Kompilowanie biblioteki współdzielonej z cmake i instalowanie z distutils

Moja struktura katalogów projektu:

  • projekt
    • build (katalog distutils python)
    • doc (dokumentacja modułu)
    • moduł
    • (główny katalog moduł)
      • rdzeń (dir dla projektu doładowania/biblioteki
        • CMakeLists.txt - buduje bibliotek współdzielonych
      • other_py_files (kilka katalogów czystych plików Python)
    • CMakeLists.txt
    • setup.py.in
    • setup.py (generowane przez cmake)

Mój plik 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}'}, 
) 

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

Myślałem distutils miała dodać rozszerzenia biblioteki współdzielone automatycznie do budowania katalogu, czy ja mam to gdzieś źle? (Biblioteka współdzielona to importowany moduł python zbudowany na C api (boost.python), więc powinien działać poprawnie?)

+0

Oto link do modułu C/Python, który używa CMake - https://gitlab.com/ideasman42/blender-mathutils - distutils jest używany tylko do wyodrębniania prefiksu Python. * (chociaż istnieje również distutils setup.py, który nie jest używany do kompilacji CMake) * – ideasman42

Odpowiedz

9

W końcu podążyłem za odpowiedzią here i przejąłem polecenie build_ext. Ponieważ chcę, aby kompilacja była platformą krzyżową, a ponieważ biblioteka współdzielona znajduje się w drzewie źródłowym modułu, importuję bibliotekę współużytkowaną z modułem dodaj, należy użyć właściwości plik, aby uzyskać ścieżkę do biblioteki współużytkowanej z pliku setup.py.

0

scikit-build to niestandardowa implementacja setup, która zastępuje distutils.core.Extension i używa cmake do kompilowania źródeł. Różne przykłady projektów można znaleźć here. W przypadku, gdy używasz Pybind11, jest inny prosty przykład użycia here.

Powiązane problemy