CPack¶
為二進位安裝程式和原始碼套件配置產生器。
簡介¶
CPack 模組會產生組態檔 CPackConfig.cmake
和 CPackSourceConfig.cmake
。它們旨在用於後續執行的 cpack
程式中,在其中引導安裝程式或/和原始碼套件的產生。
根據 CMake 產生器,CPack 模組也可能會新增兩個新的建置目標,package
和 package_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
輸入檔中設定的產生器列表。對於每個產生器,然後
將
CPACK_GENERATOR
設定為當前正在迭代的那一個為該產生器產生套件
這是關鍵:對於 CPackConfig.cmake
中 CPACK_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 package
或 make package
或 ninja package
,而不是 cpack
。VS 產生器會建立大寫目標 PACKAGE
。
如果 CMake 是使用 Makefile 或 Ninja 產生器執行的,則 include(CPack)
也會產生目標 package_source
。若要建置原始碼套件,您可以呼叫 cmake --build . --target package_source
、 make package_source
或 ninja 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
中新增適當的 CMakeinstall()
命令。
- 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 上將為win32
或win64
。
- CPACK_PACKAGE_VERSION¶
套件完整版本,內部使用。預設情況下,這是從
CPACK_PACKAGE_VERSION_MAJOR
、CPACK_PACKAGE_VERSION_MINOR
和CPACK_PACKAGE_VERSION_PATCH
建置的。
- CPACK_TOPLEVEL_TAG¶
已安裝檔案的目錄。
- CPACK_INSTALL_COMMANDS¶
安裝組件的額外命令。環境變數
CMAKE_INSTALL_PREFIX
在執行期間被設定為臨時安裝目錄。
- CPACK_INSTALL_SCRIPTS¶
版本 3.16 新增。
CPack 在其本機暫存安裝期間執行的額外 CMake 腳本。它們在安裝要封裝的檔案之前執行。這些腳本不會由獨立安裝調用(例如:
make install
)。對於每個腳本,將會設定以下變數:CMAKE_CURRENT_SOURCE_DIR
、CMAKE_CURRENT_BINARY_DIR
和CMAKE_INSTALL_PREFIX
(設定為暫存安裝目錄)。單數形式CMAKE_INSTALL_SCRIPT
基於歷史原因作為替代變數受到支援,但如果設定了CMAKE_INSTALL_SCRIPTS
,則其值將被忽略,並會發出警告。另請參閱
CPACK_PRE_BUILD_SCRIPTS
和CPACK_POST_BUILD_SCRIPTS
,它們可用於指定在封裝過程中稍後執行的腳本。
- CPACK_PRE_BUILD_SCRIPTS¶
在 3.19 版本中新增。
在 CPack 將要封裝的檔案安裝到暫存目錄後,以及從這些檔案產生套件之前,要執行的 CMake 腳本列表。另請參閱
CPACK_INSTALL_SCRIPTS
和CPACK_POST_BUILD_SCRIPTS
。
- CPACK_POST_BUILD_SCRIPTS¶
在 3.19 版本中新增。
在 CPack 產生最終套件並將它們複製回建置目錄之前,要執行的 CMake 腳本列表。另請參閱
CPACK_INSTALL_SCRIPTS
、CPACK_PRE_BUILD_SCRIPTS
和CPACK_PACKAGE_FILES
。
- CPACK_PACKAGE_FILES¶
在 3.19 版本中新增。
暫存目錄中建立的套件檔案列表,每個檔案都以完整絕對路徑提供。此變數由 CPack 在調用
CPACK_POST_BUILD_SCRIPTS
中列出的後建置腳本之前填入。這是後建置腳本了解要操作的套件檔案集的首選方式。專案不應嘗試自行設定此變數。
- CPACK_INSTALLED_DIRECTORIES¶
要安裝的額外目錄。
- CPACK_PACKAGE_INSTALL_REGISTRY_KEY¶
安裝此專案時使用的登錄檔機碼。這僅適用於 Windows 安裝程式。預設值基於安裝目錄。
- CPACK_CREATE_DESKTOP_LINKS¶
要建立的桌面連結列表。每個桌面連結都需要由
CPACK_PACKAGE_EXECUTABLES
建立的對應開始選單快捷方式。
- CPACK_BINARY_<GENNAME>¶
CPack 為二進位產生器產生的選項。
CPack.cmake
模組產生(當CPACK_GENERATOR
未設定時)一組 CMake 選項(請參閱 CMakeoption()
命令),然後可以使用這些選項來選擇在建置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
路徑。