2016-08-17 12 views
7

のは、私はこれらの依存関係を持つ次のプロジェクトを設定しているとしましょう:回避余分ExternalProjectダウンロード

MainProject 
├─ Dependency_1 
│ └─ Dependency_2 
└─ Dependency_2 

これらの依存関係はExternalProjectMainProjectDependency_1で処理されます。

Dependency_2は2回ダウンロードされます:Dependency_1はコピーをダウンロードし、MainProjectはコピーをダウンロードします。

これは効率的なビルドプロセスのためのものではありません。両方のプロジェクトでDependency_2を一度ダウンロードできる方法はありますか?


この質問はduplicate of this oneであることが示唆されています。この質問は私のものとは多少異なり、ExternalProjectを使ってこれらのライブラリをホストシステムにインストールすることはできません。私はCMakeの唯一の解決策が好きで、その質問には必要ではありません。メインCMakeLists.txtから

+1

おそらく、このプロジェクトは便利です:https://github.com/ruslo/hunter – usr1234567

+1

あなたの質問はおそらくhttp://stackoverflow.com/questions/38059659/nested-external-with-with-witharedの複製です依存関係 – usr1234567

+0

@ usr1234567私はCMakeのみのソリューションを希望します。また、その質問はすでにインストールされているライブラリを言及して、私の質問の依存関係は、ホストシステムにインストールされていると仮定すべきではありません。 – syb0rg

答えて

1

は、例えば、外部のプロジェクトをダウンロードして構築するための共通のルートパスを含む環境変数を設定します。

set (ENV EXTERNAL_PROJ_DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/externalProjects") 

は、ダウンロードのルートフォルダとして使用してのビルドされるように依存関係。あなたはメインプロジェクトでそれを設定(および使用)し、最初の依存関係(2番目の依存関係にも依存する)内からこの値を読み取ることができます。実際にそれを見

あなたのコメントにリンクされたプロジェクトに適用され、あなたはクロノスIN EXTERNAL_PROJ_DOWNLOAD_DIRを設定します、そしてあなたが持つことになります両方クロノスとトリチウムのプロジェクトでPortAudioにリンクする:

find_package(PortAudio) 
if (${PORTAUDIO_FOUND}) 
    include_directories(${PORTAUDIO_INCLUDE_DIRS}) 
else() 
    ExternalProject_Add(
     PortAudio 
     GIT_REPOSITORY  "https://github.com/syb0rg/PortAudio2.git" 
     SOURCE_DIR   "$ENV{EXTERNAL_PROJ_DOWNLOAD_DIR}/PortAudio" 
     UPDATE_COMMAND  "" 
     INSTALL_COMMAND  "" 
     BUILD_IN_SOURCE  ON 
     LOG_DOWNLOAD  ON 
     LOG_UPDATE   ON 
     LOG_CONFIGURE  ON 
     LOG_BUILD   ON 
     LOG_TEST   ON 
     LOG_INSTALL   ON 
    ) 
    ExternalProject_Get_Property(PortAudio SOURCE_DIR) 
    ExternalProject_Get_Property(PortAudio BINARY_DIR) 
    set(PORTAUDIO_SOURCE_DIR ${SOURCE_DIR}) 
    set(PORTAUDIO_BINARY_DIR ${BINARY_DIR}) 
    set(PORTAUDIO_LIBRARIES ${PORTAUDIO_SOURCE_DIR}/libportaudio_static.a) 
    set(DEPENDENCIES ${DEPENDENCIES} PortAudio) 
    include_directories(${PORTAUDIO_SOURCE_DIR}/include) 
endif() 
SET(LIBS ${LIBS} ${PORTAUDIO_LIBRARIES}) 

あなた可能性アウトソースビルドを有効にする場合は、set (ENV EXTERNAL_PROJ_BINARY_DIR "${CMAKE_BINARY_DIR}/externalProjects")も使用してください。私はクロノスから設定したキャッシュ変数はトリチウムに見えるだろう場合、私は知らないので、環境変数を使用することをお勧め

...

setenvのためのマニュアルを参照してください。