2017-03-09 94 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

相關問題