CMake SWIG 依赖于外部项目的标头

问题描述

我有一个项目“A”依赖于另一个项目“B”。

  • ProjectB 安装一些头文件,例如 B1.h、B2.h。
  • ProjectA 尝试使用 SWIG 创建 B1.h 和 B2.h 的 Python 包装器。

ProjectA 使用:

  • ExternalProject_Add(ProjectB ...) 将 ProjectB 编译并安装到二进制目录中。
  • Swig_Add_Library(ProjectB ...) 创建 Python 包装器;此命令创建目标 _ProjectB

我想确保在运行 SWIG 之前 安装了 B1.h、B2.h,因此我添加了以下命令: add_dependencies(_ProjectB ProjectA)

在 Windows 上,这工作正常。

但是在 Linux 上,add_dependencies 命令没有被考虑在内,这给出了:

.../ProjectA.i: 111: Error: Unable to find 'B1.h'
.../ProjectA.i: 112: Error: Unable to find 'B2.h'

我确信提供给 SWIG 的包含目录是正确的:确实,当我第二次运行 make 时,这是有效的,因为第一次调用 make 已成功安装了 ProjectB。

我使用 CMake 3.13.5。

任何帮助都会很棒!

解决方法

我找到了一个解决方法:在 Linux 上,我使用:add_dependencies(ProjectB_swig_compilation ProjectA)

但是,目标 ProjectB_swig_compilation 在 Windows 上不存在(我不明白为什么,因为我在 Linux 和 Windows 上使用相同版本的 CMake)。

最终,这是我在 CMakeLists.txt 中所做的:

if (WIN32 AND NOT MINGW)
   add_dependencies(_ProjectB ProjectA)
else ()
   add_dependencies(ProjectB_swig_compilation ProjectA)
endif ()