CMake:将两个(或更多)定义传递给 Swig

标签 cmake swig preprocessor

不过,我对 CMake 与 SWIG 的集成有疑问,我很确定我只是误用了列表/字符串。我有一组需要传递给 Swig 的定义,以便排除一些可选的 c++ 功能。例如,我有两个定义 foobar 并希望将它们传递给 Swig。为此,我使用 CMAKE_SWIG_FLAGS,它允许我在示例中设置一些 Swig 相关选项、-Dfoo-Dbar

由于 foobar 可能会也可能不会定义(取决于实际的构建系统),我需要在配置时计算它们。到目前为止,我尝试使用简单的字符串。也就是说,如果某些条件成立,我会将 -Dfoo 添加到字符串中。如果另一个条件成立,我也会添加 -Dbar (依此类推)。假设字符串的名称是 ADDITIONAL_SWIG_DEFINES。这个想法是将 ADDITIONAL_SWIG_DEFINES 传递给 CMAKE_SWIG_FLAGS,例如,

set(CMAKE_SWIG_FLAGS -package "somepackage" -O ${ADDITIONAL_SWIG_DEFINES})

如果未设置任何定义,则 ADDITIONAL_SWIG_DEFINES 为空。

不幸的是,如果第二个定义都已添加到 ADDITIONAL_SWIG_DEFINES 中,Swig 似乎会忽略它们。因此,我尝试直接传递它们:

set(CMAKE_SWIG_FLAGS -package "somepackage" -O -Dfoo -Dbar)

瞧,它按预期工作了。所以我的问题是,如何动态地将我的定义添加到某种变量并将其正确传递给 Swig?正如已经提到的,我认为这更多的是 CMake 字符串的误用,而不是 CMake 与 Swig 集成的真正问题。

编辑:ADDITIONAL_SWIG_DEFINES 创建如下:

if(DOUBLE_PRECISION)
  set(ADDITIONAL_SWIG_DEFINES "${ADDITIONAL_SWIG_DEFINES} -DDOUBLE_PRECISION")
endif()
if(DISABLE_CXX11_FEATURES)
  set(ADDITIONAL_SWIG_DEFINES "${ADDITIONAL_SWIG_DEFINES} -DDISABLE_CXX11_FEATURES")
endif()
string(STRIP "${ADDITIONAL_SWIG_DEFINES}" ADDITIONAL_SWIG_DEFINES)

最佳答案

CMAKE_SWIG_FLAGS 显然是一个 CMake 列表,因此您也应该将 ADDITIONAL_SWIG_DEFINES 视为一个列表。但您将其视为单个字符串。基本上,您定义了一个名为 foo -Dbar 的宏。

删除引号:

if(DOUBLE_PRECISION)
  set(ADDITIONAL_SWIG_DEFINES ${ADDITIONAL_SWIG_DEFINES} -DDOUBLE_PRECISION)
endif()
if(DISABLE_CXX11_FEATURES)
  set(ADDITIONAL_SWIG_DEFINES ${ADDITIONAL_SWIG_DEFINES} -DDISABLE_CXX11_FEATURES)
endif()

(请注意,对 string(STRIP) 的调用也被删除)。

为了更明显,您还可以使用 list() 语法:

if(DOUBLE_PRECISION)
  list(APPEND ADDITIONAL_SWIG_DEFINES -DDOUBLE_PRECISION)
endif()
if(DISABLE_CXX11_FEATURES)
  list(APPEND ADDITIONAL_SWIG_DEFINES -DDISABLE_CXX11_FEATURES)
endif()

(我给出的两个代码块在语义上是等效的)。

关于CMake:将两个(或更多)定义传递给 Swig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100583/

相关文章:

linux - Linux 上源代码构建的 clang-3.7 找不到 Block_copy

linux - GoogleTest CMake 无法识别 TEST_F : Like it's not recognizing GTest something

c++ - MinGW 中预处理器 g++ 的奇怪行为

visual-c++ - Visual Studio : how to check used C++ platform toolset programmatically

python - OneHotEncoder 类别参数

c++ - 如何使用 Homebrew 软件、cMake 和 cLion 将库添加到 C++ 项目

c++ - 无法使用 KDevelop 设置 vcpkg CMAKE_TOOLCHAIN_FILE

python - 如何使用 %pythonappend 和 %pythonprepend 访问 SWIG 中的参数和返回值?

c++ - 多个 C++ .lib 项目到 .dll 项目,Lua 崩溃!

c++ - 错误 C2062 : type int unexpected