BundleUtilities¶
協助組裝獨立套件應用程式的函式。
一組 CMake 工具函式,可用於處理 Mac 上的 .app
套件以及任何作業系統上的類似套件的目錄。
此模組提供以下函式
fixup_bundle
copy_and_fixup_bundle
verify_app
get_bundle_main_executable
get_dotapp_dir
get_bundle_and_executable
get_bundle_all_executables
get_item_key
get_item_rpaths
clear_bundle_keys
set_bundle_key_values
get_bundle_keys
copy_resolved_item_into_bundle
copy_resolved_framework_into_bundle
fixup_bundle_item
verify_bundle_prerequisites
verify_bundle_symlinks
需要 CMake 2.6 或更高版本,因為它使用函式、break 和 PARENT_SCOPE
。也取決於 GetPrerequisites.cmake
。
請勿在組態時(從 CMakeLists.txt
)使用這些函式!相反地,從 install(CODE)
或 install(SCRIPT)
規則中呼叫它們。
fixup_bundle(<app> <libs> <dirs>)
就地修復 <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(<src> <dst> <libs> <dirs>)
在 <dst>
位置建立套件 <src>
的副本,然後就地在 <dst>
修復新複製的套件。
verify_app(<app>)
根據對應用程式執行分析工具,驗證應用程式 <app>
是否看起來有效。如果應用程式未通過驗證,則呼叫 message(FATAL_ERROR)
。
在 3.6 版本中新增:作為可選參數 (IGNORE_ITEM
),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如,IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe"
)。
get_bundle_main_executable(<bundle> <result_var>)
結果將是套件主要可執行檔的完整路徑名稱,如果無法確定,則會是帶有 error:
前綴的字串。
get_dotapp_dir(<exe> <dotapp_dir_var>)
給定可執行檔的完整路徑,傳回名稱以 .app
結尾的最近父目錄。如果沒有這樣的父目錄,則僅傳回包含可執行檔的目錄。
傳回的目錄可能存在也可能不存在。
get_bundle_and_executable(<app> <bundle_var> <executable_var> <valid_var>)
接受 .app
目錄名稱或巢狀於 .app
目錄內的可執行檔名稱,並傳回 <bundle_var>
中 .app
目錄的路徑,以及 <executable_var>
中其主要可執行檔的路徑。
get_bundle_all_executables(<bundle> <exes_var>)
遞迴掃描 <bundle>
套件中的所有 <exes_var>
可執行檔,並將它們累積到變數中。
get_item_key(<item> <key_var>)
給定 <item>
檔案名稱,產生 <key_var>
索引鍵,該索引鍵在考慮需要複製或修復以使套件獨立的函式庫集時應該是唯一的。這基本上是包含副檔名的檔案名稱,其中 .
由 _
取代
此索引鍵用作 CMake 變數的前綴,以便我們可以根據給定項目的索引鍵將一組變數與該項目關聯起來。
clear_bundle_keys(<keys_var>)
迴圈處理 <keys_var>
索引鍵列表,清除與每個索引鍵關聯的所有變數。迴圈後,清除索引鍵列表本身。
get_bundle_keys
的呼叫者在完成索引鍵列表時應呼叫 clear_bundle_keys
。
set_bundle_key_values(<keys_var> <context> <item> <exepath> <dirs>
<copyflag> [<rpaths>])
將 <keys_var>
索引鍵新增到給定項目的列表(如果需要)。如果已新增,也會設定與該索引鍵關聯的所有變數。
get_bundle_keys(<app> <libs> <dirs> <keys_var>)
迴圈處理 <app>
套件中(以及作為額外 <libs>
給出的)所有可執行檔和函式庫檔案,並累積代表它們的索引鍵列表。設定與每個索引鍵關聯的值,以便我們可以迴圈處理所有這些值,並將先決條件函式庫複製到套件中,然後進行適當的 install_name_tool
修復。
在 3.6 版本中新增:作為可選參數 (IGNORE_ITEM
),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如,IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe"
)。
copy_resolved_item_into_bundle(<resolved_item> <resolved_embedded_item>)
如果需要,將已解析的項目複製到套件中。如果 <resolved_item>
與 <resolved_embedded_item>
「相同」,則不需要複製。
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(<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(<bundle> <result_var> <info_var>)
驗證套件內所有檔案的所有先決條件的總和是否包含在套件內,或者是假定在任何地方都存在的 system
函式庫。
在 3.6 版本中新增:作為可選參數 (IGNORE_ITEM
),可以傳遞檔案名稱列表,這些檔案名稱將被忽略(例如,IGNORE_ITEM "vcredist_x86.exe;vcredist_x64.exe"
)。
verify_bundle_symlinks(<bundle> <result_var> <info_var>)
驗證在 <bundle>
套件中找到的任何符號連結是否指向也已在套件中的其他檔案...任何指向外部檔案的內容都會導致此函式驗證失敗。