2014-10-19 23 views
4

다음의 CMake 파일을 사용하여 Boost 라이브러리를 자동으로 다운로드하고 컴파일합니다. 컴파일러 용 프로젝트 파일을 생성 한 후 두 변종을 빌드하려면 cmake --build . --config Debugcmake --build . --config Release을 실행합니다. 그래서 두 번 빌드 프로세스를 부탁드립니다. 체크섬이 여전히 일치하는 경우 CMake가 아카이브를 다시 다운로드하지 못할만큼 똑똑하더라도 소스 디렉토리로 두 번 추출합니다. 압축은 큰 Boost 라이브러리에서 2 분 정도 소요되므로 CMake가 두 번째 빌드를 수행하는 것을 막고 싶습니다. 단지 variant=debug,release를 사용하는 것이 가능 것이 particually 예에서 추출 된 소스를 CMake의 ExternalProject_Add와 재사용하는 방법?

ExternalProject_Add(Boost 
    PREFIX   ${BOOST_PREFIX} 
    TMP_DIR   ${BOOST_PREFIX}/temp 
    STAMP_DIR   ${BOOST_PREFIX}/stamp 
    #--Download step-------------- 
    DOWNLOAD_DIR  ${BOOST_PREFIX}/download 
    URL    http://downloads.sourceforge.net/project/boost/boost/1.56.0/boost_1_56_0.tar.gz 
    URL_MD5   8c54705c424513fa2be0042696a3a162 
    #--Update/Patch step---------- 
    UPDATE_COMMAND "" 
    #--Configure step------------- 
    SOURCE_DIR  ${BOOST_PREFIX}/source 
    CONFIGURE_COMMAND ${BOOST_CONFIGURE_COMMAND} 
    #--Build step----------------- 
    BUILD_COMMAND  ${BOOST_BUILD_EXECUTABLE} install 
          --build-dir=${BOOST_PREFIX}/build 
          --prefix=${BOOST_PREFIX}/install 
          variant=${BOOST_VARIANT} 
          link=${BOOST_LINK} 
          threading=multi 
          address-model=32 
          toolset=${BOOST_TOOLSET} 
          runtime-link=${BOOST_RUNTIME_LINK} 
    BUILD_IN_SOURCE 1 
    #--Install step--------------- 
    INSTALL_COMMAND "" 
) 

,하지만이 방법을 구축 내 프로젝트에서 다른 외부 종속성이 있습니다. 어떻게 CMake가 새로운 아카이브를 다운로드 한 경우에만 아카이브를 추출하도록 할 수 있습니까?

+1

당신은 빈'DOWNLOAD_COMMAND' 2 위'ExternalProject_Add'를 생성하고 첫'ExternalProject_Add'에 종속성을 추가 할 수 있습니다. 두 프로젝트의 'SOURCE_DIR'은 동일해야합니다. [example] (https://github.com/ruslo/hunter/blob/master/cmake/schemes/url_sha1_release_debug.cmake.in)을 참조하십시오. –

+0

@ruslo 위대한 작품입니다. 답변으로 의견을 게시하여 수락 할 수있게 해주시겠습니까? – danijar

답변

4

두 프로젝트 (Foo-ReleaseFoo-Debug)를 만듭니다. 두 번째 프로젝트의 경우 DOWNLOAD_COMMAND을 비워두고 첫 번째 프로젝트에 의존하도록 만듭니다. 두 프로젝트 모두에 대해 SOURCE_DIR을 명시하십시오 (동일한 디렉토리를 가리 킵니다). 즉이 :

set(source_dir "${CMAKE_CURRENT_BINARY_DIR}/3rdParty/Foo/Source") 

ExternalProject_Add(
    Foo-Release 
    URL "..." 
    URL_HASH SHA1=... 
    SOURCE_DIR "${source_dir}" 
    ... 
) 

ExternalProject_Add(
    Foo-Debug 
    DOWNLOAD_COMMAND 
    "" 
    SOURCE_DIR "${source_dir}" 
    ... 
) 

add_dependencies(Foo-Debug Foo-Release)