2016-08-18 316 views
7

在CMake的,你可以使用CMake的:轉換相對路徑絕對路徑,以構建目錄作爲當前目錄

get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE) 

然而,如../../other_program/路徑是基於源目錄轉換爲絕對路徑相對路徑(即CMakeLists.txt文件所在的目錄),而不是構建目錄(即調用cmake的目錄)。如果您將相對路徑作爲命令行選項,這可能會導致一些混淆。

有沒有辦法告訴get_filename_component它應該基於當前二進制目錄的相對路徑而不是當前源目錄?

回答

7

get_filename_component的文檔(突出是我)

get_filename_component(<VAR> <FileName> 
         <COMP> [BASE_DIR <BASE_DIR>] 
         [CACHE]) 

設置<VAR><FileName>的絕對路徑,其中<COMP>是一個:

ABSOLUTE =文件的完整路徑 REALPATH =到現有文件用符號鏈接的全路徑分解

如果提供的<FileName>是相對路徑,它是相對於給定的基本目錄<BASE_DIR>評價。如果未提供基礎目錄,則默認基礎目錄將爲CMAKE_CURRENT_SOURCE_DIR

路徑以正斜線返回並且沒有尾部斜線。如果指定了可選的CACHE參數,則會將結果變量添加到緩存中。

因此,你使用:

get_filename_component(buildDirRelFilePath "${myFile}" 
         REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") 

爲絕對路徑轉換爲文件轉換成一個相對路徑,您可以使用file command

file(RELATIVE_PATH <variable> <directory> <file>) 

計算從<directory><file>的相對路徑並將其存儲在<variable>

file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}") 
+0

是,這種解決方案非常適合CMake的版本3.4及更高版本。對於較早的CMake版本(低至2.6版本),mike.did的解決方案是處理它的最好方法。 –

3

您可以使用if(IS_ABSOLUTE path)檢查路徑是否絕對路徑,並且它不是預先設置所需的基礎目錄。例如,

if(NOT IS_ABSOLUTE ${p}) 
    set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}") 
endif() 
3
get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR 
         "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}" 
         ABSOLUTE) 
+0

此語法不存在 – korbes

+0

https://cmake.org/cmake/help/v3.0/command/get_filename_component.html https://cmake.org/cmake/help/v3。0/variable/CMAKE_CURRENT_LIST_DIR.html ABSOLUTE_PATH - 目標變量; RELATIVE_PATH - 帶有部分路徑的源變量 – tvorez

+0

我的不好。請編輯問題以使變量清晰,以便我可以刪除我的downvote。 – korbes