ExternalData

管理儲存在原始碼樹狀結構之外的資料檔案

簡介

使用此模組來明確參考儲存在原始碼樹狀結構之外的資料檔案,並在建置時從任意本地和遠端內容定址的位置擷取它們。此模組提供的函式會將具有 DATA{<name>} 語法的引數識別為外部資料的參考,將它們替換為這些資料的本機副本的完整路徑,並建立建置規則來擷取和更新本機副本。

例如:

include(ExternalData)
set(ExternalData_URL_TEMPLATES "file:///local/%(algo)/%(hash)"
                               "file:////host/share/%(algo)/%(hash)"
                               "http://data.org/%(algo)/%(hash)")
ExternalData_Add_Test(MyData
  NAME MyTest
  COMMAND MyExe DATA{MyInput.png}
  )
ExternalData_Add_Target(MyData)

當測試 MyTest 執行時,DATA{MyInput.png} 引數將被磁碟上 MyInput.png 資料檔案的真實實例的完整路徑替換。如果原始碼樹狀結構包含類似 MyInput.png.md5 的內容連結,則 MyData 目標將在建置樹狀結構中建立一個真實的 MyInput.png

模組函式

ExternalData_Expand_Arguments

ExternalData_Expand_Arguments 函式會評估其引數中的 DATA{} 參考,並建構一個新的引數清單

ExternalData_Expand_Arguments(
  <target>   # Name of data management target
  <outVar>   # Output variable
  [args...]  # Input arguments, DATA{} allowed
  )

它會將引數中的每個 DATA{} 參考替換為 <target> 建置之後將存在的磁碟上真實資料檔案的完整路徑。

ExternalData_Add_Test

ExternalData_Add_Test 函式會包裝 CMake 的 add_test() 命令,但支援其引數中的 DATA{} 參考

ExternalData_Add_Test(
  <target>   # Name of data management target
  ...        # Arguments of add_test(), DATA{} allowed
  )

它會透過 ExternalData_Expand_Arguments 傳遞其引數,然後使用結果叫用 add_test() 命令。

在 3.31 版本中變更:如果 <target> 之後的引數定義了一個具有 CMake 目標的可執行檔的測試,則會保留該目標的 TEST_LAUNCHERCROSSCOMPILING_EMULATOR 屬性中的空值。請參閱原則 CMP0178

ExternalData_Add_Target

ExternalData_Add_Target 函式會建立自訂目標來管理外部儲存的資料檔案的本機實例

ExternalData_Add_Target(
  <target>                  # Name of data management target
  [SHOW_PROGRESS <ON|OFF>]  # Show progress during the download
  )

它會在目標中建立必要的自訂命令,以便為此模組提供的其他函式先前評估的每個 DATA{} 參考提供資料檔案。可以從 ExternalData_URL_TEMPLATES 變數中指定的 URL 範本之一擷取資料檔案,或可以在 ExternalData_OBJECT_STORES 變數中指定的其中一個路徑中本機找到。

在 3.20 版本中新增:可以傳遞 SHOW_PROGRESS 引數,以便在下載物件期間隱藏進度資訊。如果未提供,則對於 NinjaNinja Multi-Config 產生器,它預設為 OFF,否則為 ON

通常只需要一個目標來管理專案中的所有外部資料。在所有資料參考都已處理之後,在組態結束時呼叫此函式一次。

模組變數

以下變數會組態行為。應在呼叫此模組提供的任何函式之前設定它們。

ExternalData_BINARY_ROOT

可以將 ExternalData_BINARY_ROOT 變數設定為要儲存由展開的 DATA{} 參考命名的真實資料檔案的目錄。預設值為 CMAKE_BINARY_DIR。目錄版面配置會反映 ExternalData_SOURCE_ROOT 下的內容連結的版面配置。

ExternalData_CUSTOM_SCRIPT_<key>

在 3.2 版本中新增。

指定 .cmake 自訂擷取腳本的完整路徑,該腳本由 ExternalData_URL_TEMPLATES 清單中的項目中的 <key> 識別。請參閱自訂擷取腳本

可以將 ExternalData_LINK_CONTENT 變數設定為支援的雜湊演算法的名稱,以啟用自動將 DATA{} 語法參考的真實資料檔案轉換為內容連結。對於每個此類 <file>,都會建立名為 <file><ext> 的內容連結。原始檔案會重新命名為 .ExternalData_<algo>_<hash> 的形式,以便在未來傳輸到 URL 範本清單中的其中一個位置(透過此模組範圍之外的方式)。如果使用任何 URL 範本都找不到暫存物件,則為內容連結建立的資料擷取規則將會使用該暫存物件。

在 3.3 版本中新增。

在某些平台上,可以使用符號連結在 ExternalData_BINARY_ROOT 下提供由展開的 DATA{} 參考命名的真實資料檔案。可以設定 ExternalData_NO_SYMLINKS 變數來停用符號連結的使用,並改為啟用複本的使用。

ExternalData_OBJECT_STORES

可以將 ExternalData_OBJECT_STORES 變數設定為使用 <dir>/%(algo)/%(hash) 版面配置來儲存物件的本機目錄清單。將首先搜尋這些目錄以尋找需要的物件。如果任何儲存區中都沒有該物件,則會使用 URL 範本遠端擷取該物件,並將其新增至列出的第一個本機儲存區。如果未指定任何儲存區,則預設值為建置樹狀結構內的某個位置。

ExternalData_SERIES_PARSE
ExternalData_SERIES_PARSE_PREFIX
ExternalData_SERIES_PARSE_NUMBER
ExternalData_SERIES_PARSE_SUFFIX
ExternalData_SERIES_MATCH

請參閱參考檔案序列

ExternalData_SOURCE_ROOT

ExternalData_SOURCE_ROOT 變數可以設定為包含任何由 DATA{} 參照所命名路徑的最高層級來源目錄。預設值為 CMAKE_SOURCE_DIRExternalData_SOURCE_ROOTCMAKE_SOURCE_DIR 必須參考單一來源發行版內的目錄 (例如,它們會一起出現在一個 tarball 中)。

ExternalData_TIMEOUT_ABSOLUTE

ExternalData_TIMEOUT_ABSOLUTE 變數設定下載絕對逾時時間,單位為秒,預設值為 300 秒。設定為 0 以停用強制執行。

ExternalData_TIMEOUT_INACTIVITY

ExternalData_TIMEOUT_INACTIVITY 變數設定下載閒置逾時時間,單位為秒,預設值為 60 秒。設定為 0 以停用強制執行。

ExternalData_URL_ALGO_<algo>_<key>

在 3.3 版本中新增。

指定一個自訂 URL 組件,以取代 %(algo:<key>) 形式的 URL 範本預留位置,其中 <key> 是有效的 C 識別符,當擷取透過雜湊演算法 <algo> 參照的物件時。如果未定義,則任何 <key> 的預設 URL 組件僅為 <algo>

ExternalData_URL_TEMPLATES

ExternalData_URL_TEMPLATES 可以設定為提供 URL 範本的清單,其中在每個範本中使用預留位置 %(algo)%(hash)。資料擷取規則會依序嘗試每個 URL 範本,方法是將雜湊演算法名稱替換為 %(algo),並將雜湊值替換為 %(hash)。或者,可以使用帶有 ExternalData_URL_ALGO_<algo>_<key> 變數的 %(algo:<key>),以便在遠端 URL 中獲得更大的彈性。

參考檔案

參考單一檔案

DATA{} 語法是字面的,且 <name> 是來源樹狀結構內的完整或相對路徑。來源樹狀結構必須包含位於 <name> 的實際資料檔案,或位於 <name><ext> 的「內容連結」,其中包含使用與 <ext> 對應的雜湊演算法所產生的實際檔案雜湊。例如,引數 DATA{img.png} 可以由目前來源目錄中的實際 img.png 檔案或包含其 MD5 總和的 img.png.md5 檔案來滿足。

在 3.8 版中新增:支援具有不同雜湊演算法的相同名稱的多個內容連結 (例如 img.png.sha256img.png.sha1),只要它們都對應到相同的實際檔案即可。這允許從由不同雜湊演算法建立索引的來源擷取物件。

參考檔案序列

可以告知 DATA{} 語法使用 DATA{<name>,:} 形式擷取檔案序列,其中 : 是字面的。如果來源樹狀結構包含一組像序列一樣命名的檔案或內容連結,則對其中一個成員的參照會新增規則來擷取所有這些檔案。雖然會擷取序列的所有成員,但只有最初由 DATA{} 引數命名的檔案才會取代它。預設配置會辨識以 #.ext_#.ext.#.ext-#.ext 結尾的檔案序列名稱,其中 # 是一連串的十進位數字,且 .ext 是任何單一擴展名。使用剖析 <name> 結尾的 <number><suffix> 部分的正規表示式來設定它

ExternalData_SERIES_PARSE = regex of the form (<number>)(<suffix>)$

對於更複雜的情況,請設定

ExternalData_SERIES_PARSE = regex with at least two () groups
ExternalData_SERIES_PARSE_PREFIX = <prefix> regex group number, if any
ExternalData_SERIES_PARSE_NUMBER = <number> regex group number
ExternalData_SERIES_PARSE_SUFFIX = <suffix> regex group number

使用符合名為 <prefix><number><suffix> 的序列成員的 <number> 部分的正規表示式來設定序列號碼比對

ExternalData_SERIES_MATCH = regex matching <number> in all series members

請注意,序列的 <suffix> 不包含雜湊演算法擴展名。

參考關聯檔案

DATA{} 語法也可以比對與已命名檔案相關聯且包含在相同目錄中的檔案。可以使用 DATA{<name>,<opt1>,<opt2>,...} 語法,透過選項指定關聯檔案。每個選項可以依名稱指定一個檔案,或使用語法 REGEX:<regex> 指定一個正規表示式來比對檔名。例如,引數

DATA{MyData/MyInput.mhd,MyInput.img}                   # File pair
DATA{MyData/MyFrames00.png,REGEX:MyFrames[0-9]+\\.png} # Series

將會在命令列上傳遞 MyInput.mhaMyFrames00.png,但確保關聯檔案位於它們旁邊。

參考目錄

DATA{} 語法可以使用尾端斜線和關聯檔案清單來參考目錄。形式 DATA{<name>/,<opt1>,<opt2>,...} 會新增規則來擷取目錄中符合其中一個關聯檔案選項的任何檔案。例如,引數 DATA{MyDataDir/,REGEX:.*} 將會在命令列上傳遞 MyDataDir 目錄的完整路徑,並確保該目錄包含與 MyDataDir 來源目錄中的每個檔案或內容連結對應的檔案。

在 3.3 版中新增:為了比對子目錄中的關聯檔案,請指定 RECURSE: 選項,例如 DATA{MyDataDir/,RECURSE:,REGEX:.*}

雜湊演算法

支援下列雜湊演算法

%(algo)     <ext>     Description
-------     -----     -----------
MD5         .md5      Message-Digest Algorithm 5, RFC 1321
SHA1        .sha1     US Secure Hash Algorithm 1, RFC 3174
SHA224      .sha224   US Secure Hash Algorithms, RFC 4634
SHA256      .sha256   US Secure Hash Algorithms, RFC 4634
SHA384      .sha384   US Secure Hash Algorithms, RFC 4634
SHA512      .sha512   US Secure Hash Algorithms, RFC 4634
SHA3_224    .sha3-224 Keccak SHA-3
SHA3_256    .sha3-256 Keccak SHA-3
SHA3_384    .sha3-384 Keccak SHA-3
SHA3_512    .sha3-512 Keccak SHA-3

在 3.8 版中新增:新增了 SHA3_* 雜湊演算法。

請注意,雜湊僅用於唯一資料識別和下載驗證。

自訂擷取指令碼

在 3.2 版本中新增。

當必須從 ExternalData_URL_TEMPLATES 變數中指定的其中一個 URL 範本擷取資料檔案時,通常會使用 file(DOWNLOAD) 命令進行下載。可以使用 ExternalDataCustomScript://<key>/<loc> 形式的 URL 範本來指定自訂擷取指令碼的使用。 <key> 必須是 C 識別符,且 <loc> 必須包含 %(algo)%(hash) 預留位置。必須將與金鑰對應的變數 ExternalData_CUSTOM_SCRIPT_<key> 設定為 .cmake 指令碼檔案的完整路徑。該指令碼將包含在內以執行實際擷取,並提供下列變數

ExternalData_CUSTOM_LOCATION

當載入自訂擷取指令碼時,此變數會設定為 URL 的位置部分,其中將包含取代的雜湊演算法名稱和內容雜湊值。

ExternalData_CUSTOM_FILE

當載入自訂的抓取腳本時,此變數會設定為一個檔案的完整路徑,腳本必須將抓取的內容儲存在該檔案中。檔案名稱未指定,不應以任何方式解釋。

自訂的抓取腳本預期會將抓取的內容儲存在檔案中,或設定一個變數

ExternalData_CUSTOM_ERROR

當自訂的抓取腳本未能抓取所請求的內容時,它必須將此變數設定為一個簡短的單行訊息,描述失敗的原因。