0

我可以使用 CMake 成功构建一个 SWIG 模块,例如给出一个简单的 example.i:

%module example

和一个空的 example.cxx 以下内容足以编译一个空的但可以正常工作的 Python 模块:

cmake_minimum_required(VERSION 2.8)

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 "-Wall")

SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-builtin")

SWIG_ADD_MODULE(example python example.i example.cxx)
SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})

如果我想在构建期间调用 SWIG 时将更多选项传递给 SWIG,显而易见的解决方案是更改 CMakeLists.txt:

SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-py3 -builtin -extranative")

但这不起作用,构建现在失败了:

[ 33%] Swig source
swig error : Unrecognized option -py3 -builtin -extranative
Use 'swig -help' for available options.
make[2]: *** [examplePYTHON_wrap.cxx] Error 1
make[1]: *** [CMakeFiles/_example.dir/all] Error 2
make: *** [all] Error 2

运行构建,VERBOSE=99我们可以看到原因:

/usr/bin/swig2.0 -python -py3\ -builtin\ -extranative -Wall -outdir ...

它“有帮助”地逃离了空间。我怎样才能阻止 CMake 这样做?

我尝试了几个想法来解决它:

  • 将论点分开

    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-py3", "-builtin", "-extranative")
    

    但这只是忽略了第二个和第三个:

    /usr/bin/swig2.0 -python -py3 -Wall -outdir ....
    
  • 使用SEPARATE_ARGUMENTS宏:

    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS SEPARATE_ARGUMENTS("-py3 -builtin -extranative"))
    

    但是,CMake 失败了:

    set_source_files_properties called with incorrect number of arguments.
    

正确传递多个选项的方法是什么?

4

2 回答 2

5

尝试使用set_property函数而不是set_source_files_properties. 这个允许属性值是一个 CMake 列表:

set_property(SOURCE example.i PROPERTY SWIG_FLAGS "-py3" "-builtin" "-extranative")
于 2013-06-11T14:54:41.773 回答
0

当您用分号分隔标志时,它将SET_SOURCE_FILES_PROPERTIES接受它们(在 cmake 2.8.11 上测试):

SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-py3;-builtin;-extranative;")
于 2015-01-22T19:35:19.567 回答