CMake:将两个(或更多)定义传递给 Swig
CMake: Passing two (or more) defines to Swig
我对 CMake 对 SWIG 的集成有疑问,不过,我很确定我只是误用了 lists/strings。我有一组定义需要传递给 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})
如果设置了定义的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()
(我给出的两个代码块在语义上是等价的)
我对 CMake 对 SWIG 的集成有疑问,不过,我很确定我只是误用了 lists/strings。我有一组定义需要传递给 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})
如果设置了定义的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()
(我给出的两个代码块在语义上是等价的)