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