如何避免cmake子项目中的名称冲突?

Abs*_*Sky 7 cmake

所以我设置了一个元项目,这意味着我有一个包含多个子目录的目录(根目录),每个子目录都是一个cmake项目(带有一个有效的cmakelists).根目录中的cmakelists使用cmake add_subdirectory命令导入子项目.

每个子项目定义它自己的目标(库和可执行文件)以及执行该项目的测试套件的目标"check"和运行doxygen的"docs".

我的问题是,CMake不理解检查和文档目标是每个项目的本地目标,因此抱怨名称冲突.

所以我的问题是,有没有办法让cmake明白这些目标是每个项目的本地目标?

Fra*_*ser 2

CMake 不允许重复的目标名称。政策文档CMP0002中提供了基本原理:

  • 可以在 CMake 代码和 make 工具命令行中明确引用唯一名称。
  • Xcode 和 VS IDE 生成器使用逻辑名称为目标生成有意义的项目名称。

您可以尝试设置CMP0002OLD(通过完成cmake_policy(SET CMP0002 OLD)),这至少可以消除 CMake 错误,但我建议不要这样做 - 它肯定不适用于 MSVC/Xcode。

我能看到缺少手动编码唯一名称的唯一选择是编写一个 CMake 函数,该函数为每个“检查”目标生成一个唯一名称 - 例如,它可以附加正在检查的目标的名称,产生如下名称check_my_lib_onecheck_my_exe_one, ETC。

此函数还可以用于收集所有已注册check_<Target>实例的列表,并将它们添加到名为的单个目标中,check该目标将调用每个从属实例check_<Target>,因此运行make check会运行所有实例。