2013-02-09 50 views
8

我正在编写一个C++库,可以在Mac和Linux上使用C++和Python。所以我决定为我的项目使用CMake和SWIG。`使用CMake + SWIG + Python进行make install'

正如SWIG 2.0文档中所述,SWIG和CMake的组合在我的Mac上也能正常工作。 http://www.swig.org/Doc2.0/SWIGDocumentation.html#Introduction_build_system

但我有一个关于make install的问题。

打字后cmake .make_example.so已成功生成。但make install不起作用,因为自动生成的Makefile没有install目标。我想知道如何在Makefile中添加install目标。我希望_example.so安装在每个系统的site-packages目录下。

如果有人能告诉我如何修改上面链接中写的CMake示例,我将非常感激。

回答

7

make install的CMake接口是CMake命令install()。在你的榜样,你可以添加一个安装规则是这样的:

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

一旦有一个CMakeList任何install()命令,CMake的会产生install目标可赎回为make install

+0

非常感谢。我将添加一个答案来显示整个命令。 – 2013-02-10 10:12:25

+0

想知道如何动态生成该变量名称......尽管我期待,'$ {SWIG_MODULE _ $ {PROJECT_NAME} _REAL_NAME}似乎可以工作! – Melebius 2016-09-20 10:40:34

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

如果将CMAKE_INSTALL_PREFIX设置为本地目录,这将如何工作? PYTHON_SITE_PACKAGES将指向一个系统文件夹,不使用前缀... – 2013-10-18 00:25:49

+0

我在libftdi python CMakeLists.txt文件中找到了答案。我不明白这一点足以回应任何更新,但对于任何人也有兴趣检查http://developer.intra2net.com/git/?p=libftdi;a=blob;f=python/CMakeLists.txt; h = 93410544fac2a45eec51cb8dd344708b3bbdfe67; hb = HEAD – 2013-10-18 01:21:37

+0

此行为与Python世界中的预期一致。该库被安装到一个天真的调用python的环境中。这可以让你安装到当前激活的virtualenv或你有什么。 – 2016-07-11 18:44:48