2017-09-13 68 views
0

我有一個項目,應該安裝在${CMAKE_INSTALL_PREFIX}(由用戶提供)。修改子目錄CMAKE_INSTALL_PREFIX

我包括一個子項目add_subdirectory(subproject)。該子項目將內容安裝到${CMAKE_INSTALL_PREFIX},但我寧願將其安裝到${CMAKE_INSTALL_PREFIX}/subproject。我怎樣才能不觸及子項目?

我已經試過這樣:但它沒有任何效果:

set(_INSTALL_PREFIX_BACKUP ${CMAKE_INSTALL_PREFIX}) 
set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/subproject) 
add_subdirectory(subproject) 
set(CMAKE_INSTALL_PREFIX ${_INSTALL_PREFIX_BACKUP}) 

我也試過這樣:

include(ExternalProject) 
ExternalProject_Add(subproject 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/subproject 
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}/subproject" 
    INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/subproject" 
) 
+0

不知道有關Windows,但在Linux上安裝主,子項目進入**同一目錄**(使用相同* CMAKE_INSTALL_PREFIX *)是可以的。而且,將子項目安裝到子目錄中對於用戶而言是不尋常的。您可以將* CMAKE_INSTALL_PREFIX *視爲不是每個項目目錄,而是**每個環境**。一個環境可能包含許多已安裝的項目,這些項目會相互干擾。這又是關於Linux的。至於你的嘗試,使用'ExternalProject'應該工作。 – Tsyvarev

回答

0

這是我想出的解決方案。在子項目:

if (SUBPROJECT_INSTALL_PREFIX) 
    set(_SUBPROJECT_INSTALL_PREFIX ${SUBPROJECT_INSTALL_PREFIX}/) 
else() 
    set(_SUBPROJECT_INSTALL_PREFIX .) 
endif() 

install(TARGETS ${PROJECT_NAME} 
     RUNTIME DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/bin 
     ARCHIVE DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/lib/static 
     LIBRARY DESTINATION ${_SUBPROJECT_INSTALL_PREFIX}/lib) 

在超級項目,然後我用:

set(SUBPROJECT_INSTALL_PREFIX "path/to/subproject" CACHE STRING "Path in project") 
add_subdirectory(subproject) 
1

這是所有關於install()功能。

在你的子項目的CMakeLists.txt你需要下面一行:

install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION subproject) 

根據您的用例,你可以調整LIBRARYRUNTIME
subproject這裏是路徑。這是相對於${CMAKE_INSTALL_PREFIX}

此處有documentation供參考。

+0

這裏的訣竅是我希望我的子項目對超級項目不可知。該子項目正在用於多個超級項目,並將安裝在每個超級項目的不同位置。我想我最好的選擇是在子項目的緩存中添加一個字符串選項來設置安裝前綴。 – Stewart