在CMake中使用SWIG构建封装模块
cmake支持SWIG的使用,因此在这里总结下在CMAKE中使用swig的方法,以KMCLib为例子。
由于CMake与SWIG的相互支持,使得在cmake脚本中直接定义封装模块的构建成为可能,KMCLib中也是使用这种方式直接使用swig进行自动封装。也就是在生成的Makefile中包含了使用swig命令封装库文件。
在这里我主要参考了swig文档中关于cmake的部分和cmake文档中使用swig的部分。
还是上例子吧
简单的例子
1 | # This is a CMake example for Python |
每条语句分析:
1 | FIND_PACKAGE(SWIG REQUIRED) |
寻找swig有没有安装在本机上,如果没有,由于指定了REQUIRED
参数,cmake会产生一个fatal error然后停止构建。
1 | INCLUDE(${SWIG_USE_FILE}) |
载入预定义的cmake模块
1 | FIND_PACKAGE(PythonLibs) |
查看python是否安装并生成几个变量确定python的头文件以及库文件在哪里。变量列表:
PYTHONLIBS_FOUND
- have the Python libs been foundPYTHON_LIBRARIES
- path to the python libraryPYTHON_INCLUDE_PATH
- path to where Python.h is found (deprecated)PYTHON_INCLUDE_DIRS
- path to where Python.h is foundPYTHON_DEBUG_LIBRARIES
- path to the debug library (deprecated)PYTHONLIBS_VERSION_STRING
- version of the Python libs found (since CMake 2.8.8)1 | INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) |
将python的include路径加入编译的include路径中。
1 | INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) |
将当前路径加入到编译的include路径中。
1 | SET(CMAKE_SWIG_FLAGS "") |
CMAKE_SWIG_FLAGS
可以用来设置给所有要调用swig的地方的参数,例如-python
, -c++
等
1 | SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON) |
如果某个swig生成的原代码需要某种参数就要通过这个macro进行设置,上面的第一个应该就相当于在swig的参数中添加-c++
以生成cxx
文件。
1 | SWIG_ADD_MODULE(example python example.i example.cxx) |
这个cmake函数是定义swig生成的最终模块的名称和封装的语言
1 | SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES}) |
将库与swig模块一起链接。上文已说明PYTHON_LIBRARY
变量存放的是python库的路径。
KMCLib中CMakeLists.txt中的swig
1 | # Make sure the swig package is loaded. |
按照上面的介绍,这里的cmake也不难理解了。