不过,我对 CMake 与 SWIG 的集成有疑问,我很确定我只是误用了列表/字符串。我有一组需要传递给 Swig 的定义,以便排除一些可选的 c++ 功能。例如,我有两个定义 foo
和 bar
并希望将它们传递给 Swig。为此,我使用 CMAKE_SWIG_FLAGS
,它允许我在示例中设置一些 Swig 相关选项、-Dfoo
和 -Dbar
。
由于 foo
和 bar
可能会也可能不会定义(取决于实际的构建系统),我需要在配置时计算它们。到目前为止,我尝试使用简单的字符串。也就是说,如果某些条件成立,我会将 -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/