BundleUtilities

協助組裝獨立套件應用程式的函式。

CMake 實用工具函式集合,用於處理 Mac 上的 .app 套件和任何作業系統上類似套件的目錄。

注意

請勿在設定時間(從 CMakeLists.txt)使用這些函式。相反地,從 install(CODE)install(SCRIPT) 呼叫它們。

函式

此模組提供以下函式

fixup_bundle
fixup_bundle(<app> <libs> <dirs> [IGNORE_ITEM <file>...])

就地修復 <app> 套件,使其成為獨立套件,這樣就可以拖放複製到另一台機器上,並在那台機器上執行,只要所有系統函式庫都相容即可。

如果您將外掛程式作為 libs 參數傳遞給 fixup_bundle,您應該在呼叫 fixup_bundle 之前安裝它們或將它們複製到套件中。<libs> 參數是一個必須修復的函式庫列表,但無法透過 otool 輸出分析(即 plugins)來確定。

收集套件中所有可執行檔和函式庫的所有金鑰,然後,對於每個金鑰,將每個先決條件複製到套件中。然後根據每個金鑰的先決條件列表修復每個金鑰。

然後清除所有金鑰,並在最終套件上呼叫 verify_app,以確保它確實是獨立的。

版本 3.6 新增: 作為可選參數 (IGNORE_ITEM),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

copy_and_fixup_bundle
copy_and_fixup_bundle(<src> <dst> <libs> <dirs>)

在位置 <dst> 建立套件 <src> 的副本,然後就地在 <dst> 修復新的複製套件。

verify_app
verify_app(<app> [IGNORE_ITEM <file>...])

根據對應用程式執行分析工具,驗證應用程式 <app> 似乎有效。如果應用程式未通過驗證,則呼叫 message(FATAL_ERROR)

版本 3.6 新增: 作為可選參數 (IGNORE_ITEM),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

get_bundle_main_executable
get_bundle_main_executable(<bundle> <result_var>)

結果將是套件主可執行檔的完整路徑名稱,如果無法確定,則為 error: 前綴字串。

get_dotapp_dir
get_dotapp_dir(<exe> <dotapp_dir_var>)

給定可執行檔的完整路徑,傳回名稱以 .app 結尾的最近父目錄。如果沒有這樣的父目錄,則只需傳回包含可執行檔的目錄。

傳回的目錄可能存在也可能不存在。

get_bundle_and_executable
get_bundle_and_executable(<app> <bundle_var> <executable_var> <valid_var>)

接受 .app 目錄名稱或巢狀於 .app 目錄內的可執行檔名稱,並在 <bundle_var> 中傳回 .app 目錄的路徑,在 <executable_var> 中傳回其主可執行檔的路徑。

get_bundle_all_executables
get_bundle_all_executables(<bundle> <exes_var>)

遞迴掃描 <bundle> 套件中的所有 <exes_var> 可執行檔,並將它們累積到變數中。

get_item_key
get_item_key(<item> <key_var>)

給定 <item> 檔案名稱,產生 <key_var> 金鑰,該金鑰應是唯一的,考慮到需要複製或修復以使套件獨立的函式庫集合。這基本上是檔案名稱(包括副檔名),其中 ._ 取代

此金鑰用作 CMake 變數的前綴,以便我們可以根據給定項目的金鑰將一組變數與之關聯。

get_item_rpaths
get_item_rpaths(<item> <rpaths_var>)

取得 <item> 檔案名稱的 RPATH,並將它們儲存到具有提供的名稱 <rpaths_var> 的變數中。

clear_bundle_keys
clear_bundle_keys(<keys_var>)

迴圈遍歷金鑰的 <keys_var> 列表,清除與每個金鑰關聯的所有變數。迴圈結束後,清除金鑰列表本身。

get_bundle_keys 的呼叫者在完成金鑰列表後應呼叫 clear_bundle_keys

set_bundle_key_values
set_bundle_key_values(<keys_var> <context> <item> <exepath> <dirs>
                      <copyflag> [<rpaths>])

<keys_var> 金鑰新增到給定項目的列表(如果需要)。如果新增,也設定與該金鑰關聯的所有變數。

get_bundle_keys
get_bundle_keys(<app> <libs> <dirs> <keys_var> [IGNORE_ITEM <file>...])

迴圈遍歷 <app> 套件內(以及作為額外 <libs> 給定)的所有可執行檔和函式庫檔案,並累積代表它們的金鑰列表。設定與每個金鑰關聯的值,以便我們可以遍歷所有金鑰,並將先決條件函式庫複製到套件中,然後執行適當的 install_name_tool 修復。

版本 3.6 新增: 作為可選參數 (IGNORE_ITEM),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

copy_resolved_item_into_bundle
copy_resolved_item_into_bundle(<resolved_item> <resolved_embedded_item>)

如有必要,將已解析的項目複製到套件中。如果 <resolved_item><resolved_embedded_item>「相同」,則不需要複製。

copy_resolved_framework_into_bundle
copy_resolved_framework_into_bundle(<resolved_item> <resolved_embedded_item>)

如有必要,將已解析的框架複製到套件中。如果 <resolved_item><resolved_embedded_item>「相同」,則不需要複製。

預設情況下,未設定 BU_COPY_FULL_FRAMEWORK_CONTENTS。如果您希望將完整框架嵌入到您的套件中,請在呼叫 fixup_bundle 之前將 BU_COPY_FULL_FRAMEWORK_CONTENTS 設定為 ON。預設情況下,COPY_RESOLVED_FRAMEWORK_INTO_BUNDLE 會複製框架 dylib 本身以及框架 Resources 目錄。

fixup_bundle_item
fixup_bundle_item(<resolved_embedded_item> <exepath> <dirs>)

取得 <resolved_embedded_item> 的直接/非系統先決條件。對於每個先決條件,將其引用方式更改為該先決條件的 _EMBEDDED_ITEM 金鑰變數的值。(最有可能更改為 @executable_path 樣式的引用。)

此函式要求 <resolved_embedded_item> 已經 inside 在套件中。換句話說,如果您將外掛程式作為 libs 參數傳遞給 fixup_bundle,您應該在呼叫 fixup_bundle 之前安裝它們或將它們複製到套件中。 libs 參數是一個必須修復的函式庫列表,但無法透過 otool 輸出分析來確定。(即 plugins

此外,將要修復的項目的 ID 更改為其自身的 _EMBEDDED_ITEM 值。

將變更累積在局部變數中,並在函式結尾一次性呼叫 install_name_tool,其中包含所有變更。

如果設定了 BU_CHMOD_BUNDLE_ITEMS 變數,則在 install_name_tool 嘗試更改套件項目之前,會將其標記為可寫入。

verify_bundle_prerequisites
verify_bundle_prerequisites(<bundle> <result_var> <info_var>
                            [IGNORE_ITEM <file>...])

驗證套件內所有檔案的所有先決條件的總和都包含在套件內,或是 system 函式庫,推定為在任何地方都存在。

版本 3.6 新增: 作為可選參數 (IGNORE_ITEM),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如 IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe")。

verify_bundle_symlinks(<bundle> <result_var> <info_var>)

驗證在 <bundle> 套件中找到的任何符號連結都指向也已在套件中的其他檔案... 任何指向外部檔案的連結都會導致此函式驗證失敗。