CPack

為二進位安裝程式和原始碼套件配置產生器。

簡介

CPack 模組會產生組態檔 CPackConfig.cmakeCPackSourceConfig.cmake。它們旨在用於後續執行的 cpack 程式中,在其中引導安裝程式或/和原始碼套件的產生。

根據 CMake 產生器,CPack 模組也可能會新增兩個新的建置目標,packagepackage_source。請參閱下方打包目標章節以取得詳細資訊。

產生的二進位安裝程式將包含所有透過 CMake 的 install() 命令(以及已棄用的命令 install_files()install_programs()install_targets())安裝的所有檔案。install() 命令的 DESTINATION 選項必須是相對路徑;否則 CPack 會忽略已安裝的檔案。

某些種類的二進位安裝程式可以設定為允許使用者選擇個別應用程式組件進行安裝。請參閱 CPackComponent 模組以取得更多詳細資訊。

原始碼套件(透過 CPackSourceConfig.cmake 配置並由 CPack Archive Generator 產生)將包含專案目錄中的所有原始碼檔案,但 CPACK_SOURCE_IGNORE_FILES 中指定的檔案除外。

CPack 產生器

CPACK_GENERATOR 變數在不同的情境中有不同的意義。在 CMakeLists.txt 檔案中,CPACK_GENERATOR產生器列表:當執行 cpack 時,若沒有其他引數,它將迭代該列表,並為每個產生器產生一個套件。在 CPACK_PROJECT_CONFIG_FILE 中,CPACK_GENERATOR 是一個命名單一產生器的字串。如果您需要每個 cpack 產生器的邏輯來控制其他 cpack 設定,那麼您需要 CPACK_PROJECT_CONFIG_FILE。如果設定了 CPACK_PROJECT_CONFIG_FILE,則會自動在每個產生器的基礎上包含它。它只需要包含覆寫設定。

以下是其運作方式

  • cpack 執行

  • 它包含 CPackConfig.cmake

  • 它迭代由 -G 命令列選項給定的產生器,或者如果沒有指定此選項,則迭代由 CPACK_GENERATOR 變數在 CPackConfig.cmake 輸入檔中設定的產生器列表。

  • 對於每個產生器,然後

這是關鍵:對於 CPackConfig.cmakeCPACK_GENERATOR 中列出的每個產生器,cpack 將在內部重設 CPACK_GENERATOR當前正在使用的那一個,然後包含 CPACK_PROJECT_CONFIG_FILE

如需可用產生器的列表,請參閱 cpack-generators(7)

目標 package 和 package_source

如果 CMake 是使用 Makefile、Ninja 或 Xcode 產生器執行的,則 include(CPack) 會產生目標 package。這使得從 CMake、Make 或 Ninja 建置二進位安裝程式成為可能:您可以呼叫 cmake --build . --target packagemake packageninja package,而不是 cpack。VS 產生器會建立大寫目標 PACKAGE

如果 CMake 是使用 Makefile 或 Ninja 產生器執行的,則 include(CPack) 也會產生目標 package_source。若要建置原始碼套件,您可以呼叫 cmake --build . --target package_sourcemake package_sourceninja package_source,而不是 cpack -G TGZ --config CPackSourceConfig.cmake

所有 CPack 產生器共有的變數

在您的 CMakeLists.txt 檔案中包含此 CPack 模組之前,可以設定各種變數來自訂結果的安裝程式。最常用的變數是

CPACK_PACKAGE_NAME

套件(或應用程式)的名稱。如果未指定,則預設為專案名稱。

CPACK_PACKAGE_VENDOR

套件供應商的名稱。(例如,「Kitware」)。預設值為「Humanity」。

CPACK_PACKAGE_DIRECTORY

CPack 執行打包的目錄。如果未設定,則預設(在內部)為建置目錄。此變數可以在 CPack 組態檔或從 cpack 命令列選項 -B 中定義。如果設定,命令列選項會覆寫在組態檔中找到的值。

CPACK_PACKAGE_VERSION_MAJOR

套件主要版本。這個變數將始終被設定,但其預設值取決於是否在頂層 CMakeLists.txt 檔案中的 project() 命令中給出了版本詳細資訊。如果給出了版本詳細資訊,則預設值將為 CMAKE_PROJECT_VERSION_MAJOR。如果沒有給出版本詳細資訊,則將假設預設版本為 0.1.1,導致 CPACK_PACKAGE_VERSION_MAJOR 的預設值為 0。

CPACK_PACKAGE_VERSION_MINOR

套件次要版本。預設值根據是否在頂層 CMakeLists.txt 檔案中的 project() 命令中給出了版本詳細資訊來確定。如果給出了版本詳細資訊,則預設值將為 CMAKE_PROJECT_VERSION_MINOR,但如果沒有指定次要版本組件,則 CPACK_PACKAGE_VERSION_MINOR 將保持未設定。如果根本沒有給出專案版本,則將假設預設版本為 0.1.1,導致 CPACK_PACKAGE_VERSION_MINOR 的預設值為 1。

CPACK_PACKAGE_VERSION_PATCH

套件修補版本。預設值根據是否在頂層 CMakeLists.txt 檔案中的 project() 命令中給出了版本詳細資訊來確定。如果給出了版本詳細資訊,則預設值將為 CMAKE_PROJECT_VERSION_PATCH,但如果沒有指定修補版本組件,則 CPACK_PACKAGE_VERSION_PATCH 將保持未設定。如果根本沒有給出專案版本,則將假設預設版本為 0.1.1,導致 CPACK_PACKAGE_VERSION_PATCH 的預設值為 1。

CPACK_PACKAGE_DESCRIPTION

專案的描述,用於諸如 CPack 產生的 Windows 安裝程式的簡介畫面等位置。如果未設定,則此變數的值會從 CPACK_PACKAGE_DESCRIPTION_FILE 命名的檔案中填充。

CPACK_PACKAGE_DESCRIPTION_FILE

一個文字檔,用於在未明確設定 CPACK_PACKAGE_DESCRIPTION 時描述專案。CPACK_PACKAGE_DESCRIPTION_FILE 的預設值指向內建範本檔 Templates/CPack.GenericDescription.txt

CPACK_PACKAGE_DESCRIPTION_SUMMARY

專案的簡短描述(僅幾個字)。如果設定了 CMAKE_PROJECT_DESCRIPTION 變數,則將其用作預設值,否則預設值將是由 CMake 基於 CMAKE_PROJECT_NAME 產生的字串。

CPACK_PACKAGE_HOMEPAGE_URL

專案首頁 URL。預設值取自 CMAKE_PROJECT_HOMEPAGE_URL 變數,該變數由頂層 project() 命令設定,否則如果沒有向 project() 提供 URL,則預設值將為空。

CPACK_PACKAGE_FILE_NAME

要產生的套件檔案名稱,不包括副檔名。例如,cmake-2.6.1-Linux-i686。預設值為

${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}
CPACK_PACKAGE_INSTALL_DIRECTORY

目標系統上的安裝目錄。某些 CPack 產生器(如 NSIS)可能會使用它來建立安裝目錄,例如安裝前綴下方的「CMake 2.5」。所有已安裝的元素都將放置在這個目錄中。

CPACK_PACKAGE_ICON

一個品牌形象圖片,將顯示在安裝程式內部(由 GUI 安裝程式使用)。

CPACK_PACKAGE_CHECKSUM

版本 3.7 新增。

一個演算法,將用於產生一個包含套件校驗和的額外檔案。輸出檔案名稱將為

${CPACK_PACKAGE_FILE_NAME}.${CPACK_PACKAGE_CHECKSUM}

支援的演算法是 string(<HASH>) 命令列出的那些。

CPACK_PROJECT_CONFIG_FILE

CPack 時間專案 CPack 組態檔。此檔案在 cpack 時間被包含,每個產生器一次,在 CPack 將 CPACK_GENERATOR 設定為實際使用的產生器之後。它允許在 cpack 時間為每個產生器設定 CPACK_* 變數。

CPACK_RESOURCE_FILE_LICENSE

要嵌入到安裝程式中的許可證。它通常會由產生的安裝程式向使用者顯示(通常帶有一個明確的「接受」按鈕,對於圖形安裝程式),在安裝之前。此許可證檔案不會被添加到已安裝的檔案中,但被某些 CPack 產生器(如 NSIS)使用。如果您想使用 UTF-8 字元,則檔案需要以 UTF-8 BOM 編碼。如果您想與您的專案一起安裝許可證檔案(可能與此檔案相同),您必須在您的 CMakeLists.txt 中新增適當的 CMake install() 命令。

CPACK_RESOURCE_FILE_README

要嵌入到安裝程式中的 ReadMe 檔案。它通常在安裝期間詳細描述專案的目的。並非所有 CPack 產生器都使用這個檔案。

CPACK_RESOURCE_FILE_WELCOME

要嵌入到安裝程式中的歡迎檔案。它歡迎使用者使用這個安裝程式。通常用於 Windows 和 Mac OS X 上的圖形安裝程式。

CPACK_MONOLITHIC_INSTALL

停用基於組件的安裝機制。當設定時,組件規格被忽略,並且所有已安裝的項目都被放入單個「MONOLITHIC」套件中。某些 CPack 產生器預設執行單體打包,並且可能被要求通過將 CPACK_<GENNAME>_COMPONENT_INSTALL 設定為 TRUE 來執行組件打包。

CPACK_GENERATOR

要使用的 CPack 產生器列表。如果未指定,CPack 將建立一組遵循命名模式 CPACK_BINARY_<GENNAME> (例如 CPACK_BINARY_NSIS)的選項,允許使用者啟用/停用個別產生器。如果在 cpack 命令列中給出 -G 選項,它將覆寫這個變數和任何 CPACK_BINARY_<GENNAME> 選項。

CPACK_OUTPUT_CONFIG_FILE

CPack 二進位組態檔的名稱。此檔案是由 CPack 模組為二進位安裝程式產生的 CPack 組態。預設為 CPackConfig.cmake

CPACK_PACKAGE_EXECUTABLES

列出每個可執行檔和相關聯的文字標籤,用於建立「開始」選單捷徑。例如,將其設定為列表 ccmake;CMake 將建立一個名為「CMake」的捷徑,該捷徑將執行已安裝的可執行檔 ccmake。並非所有 CPack 產生器都使用它(至少 NSIS、Inno Setup 和 WIX 這樣做)。

CPACK_STRIP_FILES

要剝離的檔案列表。從 CMake 2.6.0 開始,CPACK_STRIP_FILES 將是一個布林變數,它啟用剝離所有檔案(檔案列表在 CMake 中評估為 TRUE,因此這個變更是相容的)。

CPACK_VERBATIM_VARIABLES

版本 3.4 新增。

如果設定為 TRUE,則以 CPACK_ 為前綴的變數值將在寫入組態檔之前被逸出,以便 cpack 程式接收它們時與指定的方式完全相同。如果不這樣做,像引號和反斜線這樣的字元可能會導致解析錯誤或更改 cpack 程式接收的值。預設為 FALSE 以實現向後相容性。

CPACK_THREADS

版本 3.20 新增。

在執行平行化操作(例如壓縮安裝程式套件)時要使用的執行緒數量。

某些 CPack 產生器(如 Debian 或 Archive)使用的壓縮方法可能會利用多個 CPU 核心來加速壓縮。CPACK_THREADS 可以設定為指定將使用多少執行緒進行壓縮。

正整數可用於指定確切的所需執行緒計數。

當給定負整數時,CPack 將使用絕對值作為上限,但可能會根據可用的硬體並發性選擇較低的值。

給定 0 時,CPack 將嘗試使用所有可用的 CPU 核心。

預設情況下,CPACK_THREADS 設定為 1

以下壓縮方法可能會利用多個核心

xz

如果 CMake 是使用支援平行壓縮的 liblzma 建置的,則支援。

版本 3.21 新增: cmake.org 上提供的官方 CMake 二進位檔現在隨附支援平行壓縮的 liblzma。舊版本則沒有。

zstd

版本 3.24 新增。

如果 CMake 是使用 libarchive 3.6 或更高版本建置的,則支援。cmake.org 上提供的官方 CMake 二進位檔支援它。

其他壓縮方法忽略這個值,並且僅使用一個執行緒。

原始碼套件產生器的變數

以下 CPack 變數特定於原始碼套件,並且不會影響二進位套件

CPACK_SOURCE_PACKAGE_FILE_NAME

原始碼套件的名稱。例如 cmake-2.6.1

CPACK_SOURCE_STRIP_FILES

原始碼樹中將被剝離的檔案列表。從 CMake 2.6.0 開始,CPACK_SOURCE_STRIP_FILES 將是一個布林變數,它啟用剝離所有檔案(檔案列表在 CMake 中評估為 TRUE,因此這個變更是相容的)。

CPACK_SOURCE_GENERATOR

用於原始碼套件的產生器列表。與 CPACK_GENERATOR 一樣,如果未指定,則 CPack 將建立一組選項(例如 CPACK_SOURCE_ZIP),允許使用者選擇將產生哪些套件。

CPACK_SOURCE_OUTPUT_CONFIG_FILE

CPack 原始碼組態檔的名稱。此檔案是由 CPack 模組為原始碼安裝程式產生的 CPack 組態。預設為 CPackSourceConfig.cmake

CPACK_SOURCE_IGNORE_FILES

原始碼樹中在建置原始碼套件時不會被打包的檔案模式。這是一個正規表示式模式列表(必須正確逸出),例如,/CVS/;/\\.svn/;\\.swp$;\\.#;/#;.*~;cscope.*

進階使用的變數

以下變數用於 CPack 的進階使用

CPACK_CMAKE_GENERATOR

如果專案是 CMake 專案,應該使用哪個 CMake 產生器。預設為 CMAKE_GENERATOR 的值。很少使用者會想要更改這個設定。

CPACK_INSTALL_CMAKE_PROJECTS

指定要安裝哪個專案的四個值列表。這四個值是:建置目錄、專案名稱、專案組件、目錄。如果省略,CPack 將建置一個安裝所有內容的安裝程式。

CPACK_SYSTEM_NAME

系統名稱,預設為 CMAKE_SYSTEM_NAME 的值,但在 Windows 上將為 win32win64

CPACK_PACKAGE_VERSION

套件完整版本,內部使用。預設情況下,這是從 CPACK_PACKAGE_VERSION_MAJORCPACK_PACKAGE_VERSION_MINORCPACK_PACKAGE_VERSION_PATCH 建置的。

CPACK_TOPLEVEL_TAG

已安裝檔案的目錄。

CPACK_INSTALL_COMMANDS

安裝組件的額外命令。環境變數 CMAKE_INSTALL_PREFIX 在執行期間被設定為臨時安裝目錄。

CPACK_INSTALL_SCRIPTS

版本 3.16 新增。

CPack 在其本機暫存安裝期間執行的額外 CMake 腳本。它們在安裝要封裝的檔案之前執行。這些腳本不會由獨立安裝調用(例如:make install)。對於每個腳本,將會設定以下變數: CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIRCMAKE_INSTALL_PREFIX(設定為暫存安裝目錄)。單數形式 CMAKE_INSTALL_SCRIPT 基於歷史原因作為替代變數受到支援,但如果設定了 CMAKE_INSTALL_SCRIPTS,則其值將被忽略,並會發出警告。

另請參閱 CPACK_PRE_BUILD_SCRIPTSCPACK_POST_BUILD_SCRIPTS,它們可用於指定在封裝過程中稍後執行的腳本。

CPACK_PRE_BUILD_SCRIPTS

在 3.19 版本中新增。

在 CPack 將要封裝的檔案安裝到暫存目錄後,以及從這些檔案產生套件之前,要執行的 CMake 腳本列表。另請參閱 CPACK_INSTALL_SCRIPTSCPACK_POST_BUILD_SCRIPTS

CPACK_POST_BUILD_SCRIPTS

在 3.19 版本中新增。

在 CPack 產生最終套件並將它們複製回建置目錄之前,要執行的 CMake 腳本列表。另請參閱 CPACK_INSTALL_SCRIPTSCPACK_PRE_BUILD_SCRIPTSCPACK_PACKAGE_FILES

CPACK_PACKAGE_FILES

在 3.19 版本中新增。

暫存目錄中建立的套件檔案列表,每個檔案都以完整絕對路徑提供。此變數由 CPack 在調用 CPACK_POST_BUILD_SCRIPTS 中列出的後建置腳本之前填入。這是後建置腳本了解要操作的套件檔案集的首選方式。專案不應嘗試自行設定此變數。

CPACK_INSTALLED_DIRECTORIES

要安裝的額外目錄。

CPACK_PACKAGE_INSTALL_REGISTRY_KEY

安裝此專案時使用的登錄檔機碼。這僅適用於 Windows 安裝程式。預設值基於安裝目錄。

要建立的桌面連結列表。每個桌面連結都需要由 CPACK_PACKAGE_EXECUTABLES 建立的對應開始選單快捷方式。

CPACK_BINARY_<GENNAME>

CPack 為二進位產生器產生的選項。CPack.cmake 模組產生(當 CPACK_GENERATOR 未設定時)一組 CMake 選項(請參閱 CMake option() 命令),然後可以使用這些選項來選擇在建置 package 目標或在不使用 -G 選項的情況下執行 cpack 時要使用的 CPack 產生器。

CPACK_READELF_EXECUTABLE

在 3.25 版本中新增。

指定 CPack 使用的 readelf 可執行檔路徑。預設值將取自 CMAKE_READELF 變數(如果已設定),該變數可能會在啟用語言時由 CMake 填入。如果未設定 CMAKE_READELF,CPack 將在需要時使用 find_program() 來確定 readelf 路徑。

CPACK_OBJCOPY_EXECUTABLE

在 3.25 版本中新增。

指定 CPack 使用的 objcopy 可執行檔路徑。預設值將取自 CMAKE_OBJCOPY 變數(如果已設定),該變數可能會在啟用語言時由 CMake 填入。如果未設定 CMAKE_OBJCOPY,CPack 將在需要時使用 find_program() 來確定 objcopy 路徑。

CPACK_OBJDUMP_EXECUTABLE

在 3.25 版本中新增。

指定 CPack 使用的 objdump 可執行檔路徑。預設值將取自 CMAKE_OBJDUMP 變數,該變數可能會在啟用語言時由 CMake 填入。如果未設定 CMAKE_OBJDUMP,CPack 將在需要時使用 find_program() 來確定 objdump 路徑。