2017-03-09 13 views
1

私のMercurialリポジトリrepo1にはfooという名前のカスタムターゲットがあります。それが何を気にしないでください。私は別のリポジトリrepo2も持っています。これはrepo1のサブポとして使いたいものです。 repo2はrepo1と同様の方法で開発され、同様のことをやっているfooという名前のカスタムターゲットもあります(もちろんrepo2ディレクトリの場合)。Mercurialリポジトリとサブリポジトリの間のターゲット名の競合を処理する方法は?

私はCMakeLists.txtadd_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の両方で同じことをするという事実のようなものです。私はここでもっとスマートなことができますか?

+0

'I種類の 'FOOを作る' 概念的に、同じことをしているという事実のように、 repo1とrepo2の両方で使用することができます。 ' - あなたが期待している' 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と同じです。

    この場合、バインドプロジェクトを併用する場合は、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

関連する問題