使用CMake + SWIG + Python 的 `make install`

9 投票
2 回答
6017 浏览
提问于 2025-04-17 15:19

我正在写一个C++库,这个库可以在Mac和Linux上同时被C++和Python使用。所以我决定在我的项目中使用CMake和SWIG。

正如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示例,我将非常感激。

2 个回答

10
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})

这段代码是用来处理一些数据的。它的主要目的是从一个地方获取信息,然后对这些信息进行一些操作,最后把结果输出。具体来说,它可能会从数据库中提取数据,进行计算或者格式化,然后把处理后的数据展示出来。

在编程中,我们常常需要用到这样的代码块,因为它帮助我们自动化一些重复的任务,节省时间和精力。通过这样的方式,我们可以更专注于其他更重要的事情,而不必手动去处理每一条数据。

总的来说,这段代码就是一个工具,帮助我们更高效地工作。

8

CMake中与make install相关的指令是install()。在你的例子中,你可以像这样添加一个安装规则:

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

一旦在CMakeList中有了任何install()命令,CMake就会生成一个可以通过make install调用的install目标。

撰写回答