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¶
verify_bundle_symlinks(<bundle> <result_var> <info_var>)
驗證在
<bundle>
套件中找到的任何符號連結都指向也已在套件中的其他檔案... 任何指向外部檔案的連結都會導致此函式驗證失敗。