2016-03-11 41 views
2

安裝的ExternalProject我有一個下面的代碼我CMakeLists.txt通過CMake

FIND_PACKAGE(sphinxbase) 
if (${SPHINXBASE_FOUND}) 
    INCLUDE_DIRECTORIES(${SPHINXBASE_INCLUDE_DIR}/sphinxbase/) 
else() 
    ExternalProject_Add(
     sphinxbase 
     GIT_REPOSITORY  "https://github.com/cmusphinx/sphinxbase.git" 
     GIT_TAG    "e34b1c632392276101ed16e8a05862e43f038a7c" 
     SOURCE_DIR   ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase 
     CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase/autogen.sh 
     BUILD_COMMAND  ${MAKE} 
     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(sphinxbase SOURCE_DIR) 
    ExternalProject_Get_Property(sphinxbase BINARY_DIR) 
    SET(SPHINXBASE_SOURCE_DIR ${SOURCE_DIR}) 
    SET(SPHINXBASE_BINARY_DIR ${BINARY_DIR}) 
    SET(SPHINXBASE_LIBRARIES ${SPHINXBASE_BINARY_DIR}/src/libsphinxbase/.libs/libsphinxbase.a) 
    INCLUDE_DIRECTORIES(${SPHINXBASE_SOURCE_DIR}/include) 
endif() 
SET(DEPENDENCIES ${DEPENDENCIES} sphinxbase) 
SET(LIBS ${LIBS} ${SPHINXBASE_LIBRARIES}) 

此外,我試圖安裝在目標,我將如何去安裝這個ExternalProject?現在,我試圖做這樣的:

install(TARGETS ${LIBS} 
     LIBRARY DESTINATION lib 
     ARCHIVE DESTINATION lib 
     OPTIONAL 
     ) 

install(TARGETS ${PROJECT_NAME} 
     RUNTIME DESTINATION bin 
     ) 

但我發現了我拋出以下錯誤:

CMake Error at CMakeLists.txt:197 (install): 
    install TARGETS given target 
    "/Users/syb0rg/Dropbox/Development/Khronos/Khronos/lib/sphinxbase/src/libsphinxbase/.libs/libsphinxbase.a" 
    which does not exist in this directory. 

有什麼建議?

回答

1

命令流程install(TARGETS)安裝目標,其與add_executableadd_library命令創建。對於安裝混凝土文件,您需要使用命令流程install(FILES)

而是從子項目的構建目錄中安裝選定的文件,你可以安裝子項目的是。對於您可以使用

make DESTDIR=<...> install 

命令的ExeternalProject_AddINSTALL選項。此命令將安裝整個子項目到指定爲DESTDIR參數的make目錄中(有關此參數的更多信息,請參閱here)。

然後你可以使用install(DIRECTORY)命令可以一次安裝所有子項目的文件:

# It is better to use binary directory for download or build 3d-party project 
set(sphinxbase_SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib/sphinxbase) 
# This will be used as DESTDIR on subproject's `make install`. 
set(sphinxbase_DESTDIR ${CMAKE_CURRENT_BINARY_DIR}/lib/sphinxbase_install) 

ExternalProject_Add(
    sphinxbase 
    GIT_REPOSITORY  "https://github.com/cmusphinx/sphinxbase.git" 
    GIT_TAG    "e34b1c632392276101ed16e8a05862e43f038a7c" 
    SOURCE_DIR   ${sphinxbase_SOURCE_DIR} 
    # Specify installation prefix for configure.sh (autogen.sh). 
    CONFIGURE_COMMAND ./autogen.sh --prefix=${CMAKE_INSTALL_PREFIX} 
    BUILD_COMMAND  ${MAKE} 
    UPDATE_COMMAND  "" 
    # Fake installation: copy installed files into DESTDIR. 
    INSTALL_COMMAND  make DESTDIR=${sphinxbase_DESTDIR} install 
    ... 
) 
# Actually install subproject. 
install(DIRECTORY ${sphinxbase_DESTDIR}/ DESTINATION "/") 

注意,那根目錄作爲DESTINATION。這是因爲sphinxbase_DESTDIR目錄下的文件已經根據CMAKE_INSTALL_PREFIX找到,該文件在--prefix選項中被傳遞到configure.sh(在給定情況下爲autogen.sh)。

如果你知道,子項目僅安裝在安裝前綴(由--prefix給出)的文件,可以使主體工程安裝更包裝友好

install(DIRECTORY ${sphinxbase_DESTDIR}/${CMAKE_INSTALL_PREFIX}/ DESTINATION ".") 

因爲現在相對路徑是用於DESTINATION選項,該項目將正確支持包裝。例如,make DESTDIR=<...> install也適用於主項目。


注意,即使ExternalProject_Add用於構建CMake的子項目,在此subroject創建的目標不是由主體工程看出。