如何避免 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_one
、check_my_exe_one
等名称
此函数还可用于收集所有已注册 check_<Target>
实例的列表,并将它们添加到名为 check
的单个目标中,该目标将调用每个下属 check_<Target>
,因此 运行 make check
全部运行。
所以我设置了一个元项目,这意味着我有一个包含多个子目录的目录(根目录),每个子目录都是一个 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_one
、check_my_exe_one
等名称
此函数还可用于收集所有已注册 check_<Target>
实例的列表,并将它们添加到名为 check
的单个目标中,该目标将调用每个下属 check_<Target>
,因此 运行 make check
全部运行。