使用CMake,如何在头文件更改时重建Swig包装器



我有一个C++库(称为myfibo(,我想使用CMake和Swig制作一个python绑定模块(称为myfibopy(。

第一个构建非常完美。但是,如果我重命名一个公开的C++函数,python模块就不会再构建了,因为Swig包装器(python_Wrapp.cxx(不会重新生成。

我已经尝试过使用这里解释的SWIG_USE_LIBRARY_INCLUDE_DIRECTORIES,但没有成功。

我做错了什么?

以下是再现错误的玩具示例:

目录树

.
├── CMakeLists.txt
├── myfibo
│   ├── CMakeLists.txt
│   ├── fibo.cpp
│   └── include
│       └── fibo.hpp
└── myfibopy
├── CMakeLists.txt
└── fibo.i

fibo.hpp

#pragma once
void fib(int n);

fibo.cpp

#include "fibo.hpp"
#include <iostream>
void fib(int n)
{
int a = 0;
int b = 1;
while (a < n)
{
std::cout << a << " ";
a = b;
b = a+b;
}
std::cout << std::endl;
}

fibo.i

%module myfibopy
%include fibo.hpp
%{
#include "fibo.hpp"
%}

/CMakeLists.txt

project(myfibopy)      
cmake_minimum_required(VERSION 3.15) 
add_subdirectory(myfibo)
add_subdirectory(myfibopy)

myfibo/CMakeLists.txt

add_library(myfibo SHARED fibo.cpp)
target_include_directories(myfibo
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>   # unused 
)

myfibopy/CMakeLists.txt

find_package(PythonLibs 3 REQUIRED)
include_directories(${PYTHON_INCLUDE_PATH})
find_package(SWIG 4.0 REQUIRED)
include(${SWIG_USE_FILE})
set(SRC fibo.i)
set_source_files_properties(${SRC} PROPERTIES CPLUSPLUS ON)
swig_add_library(myfibopy LANGUAGE python SOURCES ${SRC})
target_link_libraries(myfibopy PUBLIC myfibo)
# See https://gitlab.kitware.com/cmake/cmake/-/issues/18003
set_target_properties(myfibopy PROPERTIES SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)

首次编译

> cmake -Bbuild -H.
[...]
> cmake --build build
[...]

完美。现在,build目录已经存在,我可以玩myfibopy模块了。

在fibo.hpp和fibo.cpp 中将fib重命名为fib2之后

> cmake --build build
Consolidate compiler generated dependencies of target myfibo
[ 20%] Building CXX object myfibo/CMakeFiles/myfibo.dir/fibo.cpp.o
[ 40%] Linking CXX shared library libmyfibo.so
[ 40%] Built target myfibo
[ 60%] Built target myfibopy_swig_compilation
Consolidate compiler generated dependencies of target myfibopy
[ 80%] Building CXX object myfibopy/CMakeFiles/myfibopy.dir/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx.o
./build/myfibopy/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx: In function ‘PyObject* _wrap_fib(PyObject*, PyObject*)’:
./build/myfibopy/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx:2968:3: error: ‘fib’ was not declared in this scope
fib(arg1);
^~~
./build/myfibopy/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx:2968:3: note: suggested alternative: ‘fib2’
fib(arg1);
^~~
fib2
myfibopy/CMakeFiles/myfibopy.dir/build.make:75: recipe for target 'myfibopy/CMakeFiles/myfibopy.dir/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx.o' failed
make[2]: *** [myfibopy/CMakeFiles/myfibopy.dir/CMakeFiles/myfibopy.dir/fiboPYTHON_wrap.cxx.o] Error 1
CMakeFiles/Makefile2:170: recipe for target 'myfibopy/CMakeFiles/myfibopy.dir/all' failed
make[1]: *** [myfibopy/CMakeFiles/myfibopy.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2

你尝试过吗:

USE_SWIG_DEPENDENCIES
3.20版本新增
如果设置为TRUE,则swig工具本身会生成隐式依赖关系。此属性仅对Makefile、Ninja、Xcode和Visual Studio(Visual Studio 11 2012及更高版本(生成器有意义。默认值为FALSE
3.21版本新增:增加了对Xcode生成器的支持
3.22版本新增:添加了对Visual Studio生成器的支持。

USE_TARGET_INCLUDE_DIRECTORIES
版本3.13中新增。
如果设置为TRUE,目标属性INCLUDE_DIRECTORIES的内容将转发到SWIG编译器。如果设置为FALSE,将忽略目标属性INCLUDE_DIRECTORIES。如果未设置,将考虑目标属性SWIG_USE_TARGET_INCLUDE_DIRECTORIES

src:https://cmake.org/cmake/help/git-stage/module/UseSWIG.html

最新更新