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

CMake: Passing two (or more) defines to Swig

我对 CMake 对 SWIG 的集成有疑问,不过,我很确定我只是误用了 lists/strings。我有一组定义需要传递给 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})

如果设置了定义的none,则ADDITIONAL_SWIG_DEFINES为空。

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

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()

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