gpt4 book ai didi

cmake - 如何处理 Mercurial 存储库和子存储库之间的目标名称冲突?

转载 作者:行者123 更新时间:2023-12-04 17:53:13 25 4
gpt4 key购买 nike

我的 Mercurial 存储库 repo1 有一个名为 foo 的自定义目标;别管它做了什么。我还有另一个存储库 repo2,我想将其用作 repo1 的子存储库。 repo2 的开发方式与 repo1 类似,并且还有一个名为 foo 的自定义目标,做同样的事情(当然只是针对 repo2 目录)。

如果我尝试在 CMakeLists.txt 中使用 add_subdirectory(relative/path/to/repo2) 为 repo1 运行 CMake,我得到:

CMake Error at CMakeLists.txt:123 (add_custom_target):
add_custom_target cannot create target "foo" because another target with
the same name already exists. The existing target is a custom target
created in source directory

我想我可以将存储库名称作为自定义目标名称的前缀,但这似乎是解决此问题的粗略方法;我有点喜欢 make foo 在概念上在 repo1 和 repo2 中做同样的事情。那么我可以在这里做些更聪明的事情吗?

最佳答案

方法取决于您的期望

make foo
  1. 仅为当前项目构建目标。也就是说,从项目 1 的目录运行时,make foo 应该为此项目构建目标。项目 2 相同。

    在这种情况下,使用 ExternalProject_Add 而不是 add_subdirectory 将项目绑定(bind)在一起。

  2. 两个项目制定目标。

    通常此类目标是“项目范围内的操作”,例如 make uninstallmake test

    在这种情况下,在将目标添加到项目之前,您需要检查目标是否存在并采取适当的措施:

    if(NOT TARGET foo)
    <create target foo>
    endif()
    <append-new-actions-to-foo>

    “创建”和“附加”步骤取决于目标类型。

    例如,经典的 uninstall 目标通过读取 install_manifest.txt 文件自动处理所有子项目:

    if(NOT TARGET uninstall)
    add_custom_target(uninstall ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
    endif()

    对于一般情况,您可以创建每个项目的目标并通过add_dependencies 将它们附加到“共享”目标:

    if(NOT TARGET foo)
    add_custom_target(foo)
    endif()
    add_custom_target(foo_${CMAKE_PROJECT_NAME} <do-something>)
    add_dependencies(foo foo_${CMAKE_PROJECT_NAME})

关于cmake - 如何处理 Mercurial 存储库和子存储库之间的目标名称冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42692785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com