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

How to avoid name clashes in cmake subprojects?

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

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

我的问题是 CMake 不理解 check 和 docs 目标是每个项目的本地目标,因此抱怨名称冲突。

所以我的问题是,有什么方法可以让 cmake 了解这些目标是每个项目的本地目标吗?

CMake 不允许重复的目标名称。 docs for policy CMP0002:

中提供了基本原理
  • Unique names may be referenced unambiguously both in CMake code and on make tool command lines.
  • Logical names are used by Xcode and VS IDE generators to produce meaningful project names for the targets.

您可以尝试将 CMP0002 设置为 OLD(通过 cmake_policy(SET CMP0002 OLD) 完成),这至少会消除 CMake 错误,但我建议不要那样做 - 当然不适用于 MSVC/Xcode.

除了手动编码唯一名称,我能看到的唯一选择是编写一个 CMake 函数,它为每个 "check" 目标生成一个唯一名称——例如,它可以附加目标名称,即正在检查,产生诸如 check_my_lib_onecheck_my_exe_one 等名称

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