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

时间:2015-06-05 13:25:20

标签: cmake

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

我唯一看不到手工编码唯一名称的选项就是编写一个CMake函数,它为每个“check”目标生成一个唯一的名称 - 例如它可以附加正在检查的目标的名称,产生check_my_lib_onecheck_my_exe_one等名称

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