2017-03-09 56 views
1

我的Mercurial存储库repo1有一个名为foo的自定义目标;不要介意它的作用。我还有另一个仓库repo2,我想用它作为repo1的subrepo。 repo2是以与repo1相似的方式开发的,并且还有一个名为foo的自定义目标,它执行的是相同的事情(但仅适用于repo2目录)。如何处理Mercurial存储库和子库之间的目标名称冲突?

如果我尝试与add_subdirectory(relative/path/to/repo2)CMakeLists.txt运行cmake为repo1,我得到:

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中做同样的事情。那么有什么更聪明的我可以在这里做?

+0

'我挺喜欢的事实,“让富”做同样的事情,在概念上,无论是在repo1还是repo2中。“ - 您希望repo1中的”make foo“有什么行为?在repo1和repo2中构建'foo'?或者只在repo1中构建'foo'?如果你想要最后一种情况,而不是'add_subdirectory'使用'ExternalProject_Add'。 – Tsyvarev

+0

@Tsyvarev:我不介意它实际上是哪个选项,(实际上,在某些情况下,这可能是相同的事情,例如,如果'foo'类似运行'cloc'或'ctags')。但是阅读这个问题的其他人可能会有偏好。你能把你的建议变成答案吗? – einpoklum

回答

1

方法取决于你所期望的从

make foo 
  1. 建设目标只为当前项目。也就是说,从project1目录运行,make foo应为此项目构建目标。 project2也一样。

    在这种情况下,使用ExternalProject_Add而不是add_subdirectory来绑定项目。

  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}) 
    
+0

我很喜欢你的第二个选项。第一个选项可以使用链接或更多的解释,但这足以让我接受。 – einpoklum

相关问题