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 \
答案 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选项,但这需要进一步测试。
使用CMake版本3.8.0,出现了适用于"Automatically scan dependencies of SWIG files for Makefile generators"的修复程序makefile
generators。
"Issue #4147: [MODULES][UseSWIG] Use swig to compute dependencies"讨论了如何解决这个问题的一般性讨论(包括我的建议)。门票仍然开放(重新开放),所以请随时在那里添加您的支持,建议或测试结果。