有没有办法让CMake利用`swig -MM`生成的依赖?

时间:2015-06-23 15:52:08

标签: python c++ cmake dependencies swig

SWIG使用接口(.i)文件以所需的目标语言(Python,Java,C#等)从C / C ++生成包装代码,该文件指定要包装的输入代码,如{{3}中所述}。 CMake可用于调用swig以便从.i接口生成目标代码,如SWIG tutorial中所述。

但是,使用此方法时,CMake仅为接口文件本身生成依赖关系,但不会为其包含的源文件生成依赖关系。一个可以SWIG documentation,但SWIG可以使用-MM选项自动生成依赖项,我希望CMake可以使用这些依赖项。

有一个manually add dependencies使用了由swig -MM生成的依赖项,但由于生成的源在调用swig时不存在而导致commit to CMake生成的依赖项。此时问题似乎仍未得到解决。

所以我将问题提交给了出色的StackOverflow社区: 当接口文件时,当前的CMake是否有办法利用swig -MM 生成的依赖关系(a)不包括生成的代码(例如config.h),(b)包括生成的代码?

这是一个可用于实验的小例子(it was later reverted)。

// swig_example.h
int foo(int n);
//*** comment this declaration after compiling once to witness dependency failure ***/
int another_function();
// swig_example.cpp
#include "swig_example.h"
int another_function() {return -1;}
int foo(int n) 
{
    if (n <= 1) return 1;
    else return another_function();
}
// swig_example: example.i
%module example
%{
#include "swig_example.h"
%}
%include "swig_example.h"
# swig_example: CMakeLists.txt
FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})
FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET(CMAKE_SWIG_FLAGS "")

SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)

#add manual dependencies (must be called before SWIG_ADD_MODULE)
#SET(SWIG_MODULE_example_EXTRA_DEPS ${CMAKE_SOURCE_DIR}/swig_example.h)

SWIG_ADD_MODULE(example python example.i swig_example.cpp)
SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})

编译一次,然后评论another_function的声明并尝试再次编译。由于swig接口未重新生成,因此尝试编译examplePYTHON_wrap.cxx时会发生错误。

examplePYTHON_wrap.cxx:3220:17: error: use of undeclared identifier 'another_function'
  result = (int)another_function();

取消注释CMakeLists.txt的添加手动依赖项行,将正确重新生成界面。但是,我希望这可以使用从swig -MM生成的依赖项来工作,而不需要手动指定依赖项。

$ swig -python -MM -c++ ../example.i
../example_wrap.cxx: \
  ../example.i \
  ../swig_example.h \

1 个答案:

答案 0 :(得分:2)

将我的评论转化为答案

我不认为 - 如果你想自动这样做,例如想要使用swig -MM - 这可以在不更改UseSWIG.cmake代码的情况下完成。

当我查看为什么您之前关联的尝试被还原时 - 即关于"0012307: regression in 2.8.5 rc2: UseSWIG.cmake broken"的讨论 - 我不相信SWIG_GET_WRAPPER_DEPENDENCIES()实际上已被打破,它只是引入了一个新限制:“这只需要“在调用SWIG_ADD_MODULE()之前”存在swig模块的所有标题。

所以我建议添加-ignoremissing SWIG选项,但这需要进一步测试。

更新(2017年4月)

使用CMake版本3.8.0,出现了适用于"Automatically scan dependencies of SWIG files for Makefile generators"的修复程序makefile generators

参考

"Issue #4147: [MODULES][UseSWIG] Use swig to compute dependencies"讨论了如何解决这个问题的一般性讨论(包括我的建议)。门票仍然开放(重新开放),所以请随时在那里添加您的支持,建议或测试结果。