2013-02-09 27 views
8

Sto scrivendo una libreria C++ che può essere utilizzata sia da C++ che da Python su Mac e Linux. Quindi ho deciso di utilizzare CMake e SWIG per il mio progetto.`make install` con CMake + SWIG + Python

Come ben descritto nella documentazione SWIG 2.0, anche la combinazione di SWIG e CMake funziona correttamente sul mio Mac. http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_build_system

Ma ho una domanda su make install.

Dopo la digitazione di cmake . e make, _example.so è stato generato correttamente. Ma make install non funziona, perché il Makefile generato automaticamente non ha target install. Mi piacerebbe sapere come posso aggiungere il target install nel Makefile. Vorrei installare _example.so nella directory site-packages su ciascun sistema.

Apprezzerei molto se qualcuno potesse dirmi come modificare l'esempio di CMake scritto nel link precedente.

risposta

7

L'interfaccia CMake su make install è il comando CMake install(). Nel tuo esempio, è possibile aggiungere una regola di installazione in questo modo:

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

Una volta che ci sono tutti i comandi install() in un CMakeList, CMake genererà un install bersaglio richiamabile come make install.

+0

Grazie mille. Aggiungerò una risposta per mostrare l'intero comando. –

+0

Mi sono chiesto come generare dinamicamente quel nome di variabile ... Nonostante la mia aspettativa, '$ {SWIG_MODULE _ $ {PROJECT_NAME} _REAL_NAME}' sembra funzionare! – 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

Come funziona se CMAKE_INSTALL_PREFIX è impostato su una directory locale? PYTHON_SITE_PACKAGES punta a una cartella di sistema e non usa il prefisso ... –

+0

Ho trovato la risposta nel file CMakeLists.txt di libftdi python. Non lo capisco abbastanza bene da rispondere con eventuali aggiornamenti, ma per chiunque sia interessato dai un'occhiata a http://developer.intra2net.com/git/?p=libftdi;a=blob;f=python/CMakeLists.txt; h = 93410544fac2a45eec51cb8dd344708b3bbdfe67; hb = HEAD –

+0

Questo comportamento è come previsto nel mondo Python. La libreria viene installata nell'ambiente che verrà utilizzata da una chiamata ingenua a python. Ciò ti consente di installare nel virtualenv attualmente attivato o cosa hai. –