2017-03-09 10 views
1

내 Mercurial 저장소 repo1의 사용자 정의 대상은 foo입니다. 결코 그것이하는 것을 신경 쓰지 마라. 또 다른 저장소 repo2가 있는데 repo1의 subrepo로 사용하고 싶습니다. repo2는 repo1과 비슷한 방식으로 개발되었으며, 비슷한 목표를 가지고있는 foo이라는 커스텀 타겟을 가지고있다. (물론 repo2 디렉토리 일 뿐이다.)Mercurial 리포지토리와 하위 리포지토리 간의 대상 이름 충돌을 처리하는 방법은 무엇입니까?

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 

가 난 그냥 저장소 이름을 가진 사용자 정의 대상 이름을 접두사 수도있을 것 같군요,하지만 그건 원액처럼 보인다 : 나는 CMakeLists.txtadd_subdirectory(relative/path/to/repo2)와 repo1위한 CMake를 실행하려고하면

, 내가 얻을 이 문제에; 그리고 저는 사실상 make foo이 repo1과 repo2에서 개념적으로 같은 일을합니다. 내가 여기서 할 수있는 더 똑똑한 것이 있습니까?

+0

'나는 종류의 'foo는을'사실과 같은 않습니다 같은 일, 개념, repo1과 repo2에서 모두 가능합니다. '그리고'make foo'의 어떤 동작이 예상됩니까? repo1과 repo2에서'foo '를 빌드 하시겠습니까? 아니면 단지'foo'를 repo1에 빌드 하시겠습니까? 마지막 경우를 원하면'add_subdirectory' 대신'ExternalProject_Add'를 사용하십시오. – Tsyvarev

+0

@Tsyvarev : 실제로 어떤 옵션인지는 신경 쓰지 않습니다. (경우에 따라서는'foo'가'cloc' 또는'ctags'를 실행하는 것과 같은 것일 수도 있습니다). 그러나이 질문을 읽는 다른 사람들은 선호도가있을 수 있습니다. 답변에 대한 제안을 할 수 있습니까? – einpoklum

답변

1

접근 방식은

make foo 
  1. 건물의 목표 만 현재 프로젝트에 대한 기대에 따라 달라집니다. 즉, project1의 디렉토리에서 실행되는 make foo이 프로젝트의 대상을 빌드해야합니다. project2와 동일합니다.

    그런 경우 바인드 프로젝트에 add_subdirectory 대신 ExternalProject_Add을 사용하십시오.

  2. 에 대한 빌드 대상은 모두입니다.

    일반적으로 이러한 대상은 make uninstall 또는 make test과 같은 "프로젝트 차원의 작업"입니다. 이 경우

    는 프로젝트에 대상을 추가하기 전에, 당신은 적절한 조치를 대상의 존재 여부를 확인하고 수행해야 :

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

    단계 "생성"과 "추가"대상 유형에 따라 달라집니다. 당신이을 대상으로 당 프로젝트 를 작성하고 "공유"대상 add_dependencies를 통해 첨부 할 수 있으며, 일반적인 경우에 대한

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

    :

    예, 고전 uninstall 대상이 자동으로 읽기를 통해 install_manifest.txt 파일을 모든 하위 프로젝트를 처리 :

    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