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 命令列選項所指定的產生器,或者,如果未指定此選項,則會迭代 CPackConfig.cmake 輸入檔案中設定的 CPACK_GENERATOR 變數所指定的產生器清單。

  • foreach 產生器,然後

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

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

目標 package 和 package_source

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

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

所有 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() 命令設定,否則如果沒有提供 URL 給 project(),則預設值將為空。

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_GENERATOR 為正在使用的實際產生器後,在每個產生器執行一次 CPack 時包含。它允許在 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 路徑。