2013-02-09 11 views
8

Piszę bibliotekę C++, która może być używana zarówno w C++, jak i Pythonie na komputerach Mac i Linux. Dlatego zdecydowałem się użyć CMake i SWIG do mojego projektu.`make install` z CMake + SWIG + Python

Jak dobrze opisano w dokumentacji SWIG 2.0, połączenie SWIG i CMake działa również dobrze na moim Macu. http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_build_system

Ale mam pytanie dotyczące make install.

Po napisaniu cmake . i make pomyślnie wygenerowano _example.so. Ale make install nie działa, ponieważ automatycznie wygenerowany plik Makefile nie ma celu install. Chciałbym wiedzieć, jak mogę dodać cel install w Makefile. Chciałbym, aby _example.so został zainstalowany pod katalogiem site-packages w każdym systemie.

Byłbym bardzo wdzięczny, gdyby ktoś mógł mi powiedzieć, jak zmodyfikować przykład CMake napisany w powyższym linku.

Odpowiedz

7

Interfejs CMake do make install jest komendą CMake install(). W przykładzie, można dodać regułę instalacji tak:

install(
    TARGETS ${SWIG_MODULE_example_REAL_NAME} 
    # ... add other arguments to install() as necessary 
) 

Gdy istnieją install() komendy w CMakeList, CUpewnij wygeneruje install cel wpłacone jako make install.

+0

Wielkie dzięki. Dodam odpowiedź, aby pokazać całe polecenia. –

+0

Zastanawiasz się, jak dynamicznie wygenerować tę nazwę zmiennej ... Mimo moich oczekiwań wydaje się, że działa funkcja $ {SWIG_MODULE _ $ {PROJECT_NAME} _REAL_NAME} '! – Melebius

8
find_package(SWIG REQUIRED) 
find_package(PythonLibs REQUIRED) 

include(${SWIG_USE_FILE}) 
set(CMAKE_SWIG_FLAGS "") 
include_directories(${PYTHON_INCLUDE_DIRS}) 

set_source_files_properties(target.i PROPERTIES CPLUSPLUS ON) 
set_source_files_properties(target.i PROPERTIES SWIG_FLAGS "-includeall") 
swig_add_module(target python target.i ${SOURCES}) 
swig_link_libraries(target ${PYTHON_LIBRARIES}) 

execute_process(COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) 
install(TARGETS _target DESTINATION ${PYTHON_SITE_PACKAGES}) 
install(FILES ${CMAKE_BINARY_DIR}/src/target.py DESTINATION ${PYTHON_SITE_PACKAGES}) 
+0

Jak to działa, jeśli CMAKE_INSTALL_PREFIX jest ustawiony na katalog lokalny? PYTHON_SITE_PACKAGES wskaże folder systemowy i nie użyje prefiksu ... –

+0

Znalazłem odpowiedź w pliku libftdi python CMakeLists.txt. Nie rozumiem tego wystarczająco dobrze, aby odpowiedzieć na wszelkie aktualizacje, ale dla każdego zainteresowanego również sprawdź http://developer.intra2net.com/git/?p=libftdi;ablbl; ​​f = python/CMakeLists.txt; h = 93410544fac2a45eec51cb8dd344708b3bbdfe67; hb = HEAD –

+0

To zachowanie jest zgodne z oczekiwaniami w świecie Pythona. Biblioteka zostanie zainstalowana w środowisku, którego użyłaby naiwne wywołanie Pythona. To pozwala zainstalować w aktualnie aktywowanym virtualenv lub co masz. –

Powiązane problemy