Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:将两个(或更多)定义传递给Swig_Cmake_Swig_Preprocessor - Fatal编程技术网

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

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可能定义,也可能不定义(取决于实际构建系统),因此我需要在配置时计算它们。直到现在,我都试着使用一个简单的字符串。也就是说,如果某个条件成立,我将-

我对CMake与SWIG的集成有一个问题,不过我很确定我只是误用了列表/字符串。我有一组定义,需要传递给Swig,以排除一些可选的C++特性。例如,我有两个定义
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标志设置为列表不起作用。