CMake:将两个(或更多)定义传递给Swig
我对CMake与SWIG的集成有一个问题,不过我很确定我只是误用了列表/字符串。我有一组定义,需要传递给Swig,以排除一些可选的C++特性。例如,我有两个定义CMake:将两个(或更多)定义传递给Swig,cmake,swig,preprocessor,Cmake,Swig,Preprocessor,我对CMake与SWIG的集成有一个问题,不过我很确定我只是误用了列表/字符串。我有一组定义,需要传递给Swig,以排除一些可选的C++特性。例如,我有两个定义foo和bar,并希望将它们传递给Swig。为此,我使用了CMAKE\u SWIG\u FLAGS,它允许我在我的示例中设置一些与SWIG相关的选项,-Dfoo和-Dbar 由于foo和bar可能定义,也可能不定义(取决于实际构建系统),因此我需要在配置时计算它们。直到现在,我都试着使用一个简单的字符串。也就是说,如果某个条件成立,我将-
foo
和bar
,并希望将它们传递给Swig。为此,我使用了CMAKE\u SWIG\u FLAGS
,它允许我在我的示例中设置一些与SWIG相关的选项,-Dfoo
和-Dbar
由于foo
和bar
可能定义,也可能不定义(取决于实际构建系统),因此我需要在配置时计算它们。直到现在,我都试着使用一个简单的字符串。也就是说,如果某个条件成立,我将-Dfoo
添加到字符串中。如果另一个条件成立,我也会添加-Dbar
(依此类推)。假设字符串的名称是ADDITIONAL\u SWIG\u DEFINES
。例如,我们的想法是将附加的\u SWIG\u定义
传递给CMAKE\u SWIG\u标志
set(CMAKE_SWIG_FLAGS -package "somepackage" -O ${ADDITIONAL_SWIG_DEFINES})
如果未设置任何定义,附加开关定义
为空
不幸的是,如果两个定义都已添加到ADDITIONAL\u Swig\u DEFINES
,则Swig似乎忽略了第二个定义。因此,我试图通过以下方式直接传递:
set(CMAKE_SWIG_FLAGS -package "somepackage" -O -Dfoo -Dbar)
瞧,它按预期工作。所以我的问题是,如何动态地将我的定义添加到某种变量中,并将其正确地传递给Swig?如前所述,我认为这更多的是对CMake字符串的错误使用,而不是CMake与Swig的集成问题
编辑:附加开关定义
创建如下:
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\u SWIG\u FLAGS
显然是一个CMAKE列表,因此您应该将附加SWIG\u 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()
(我给出的两个代码块在语义上是等价的)。您能显示设置
加法\u SWIG\u定义的CMake代码吗?顺便说一句,您的问题同时使用了附加开关定义
和附加开关定义
。这是在你的真实代码中整理出来的吗?更新的问题。当然只有:额外的SWIG\u定义
,这是一个打字错误:)“CMAKE\u SWIG\u标志
显然是一个CMAKE列表”我不明白为什么它的文档记录得如此糟糕,以至于每个人都感到惊讶-但我很高兴这不仅仅是我自己!即使在这样的情况下,也没有什么会让你怀疑你应该把它作为一个列表。特别是因为试图将例如CMAKE\u CXX\u标志设置为列表不起作用。