 完全指南:命令選項(xiàng)、工作流程與源碼級(jí)解析)
構(gòu)建工具開發(fā)工具CLI【免費(fèi)下載鏈接】CMakeMirror of CMake upstream repository項(xiàng)目地址https://gitcode.com/gh_mirrors/cm/CMake點(diǎn)擊查看免費(fèi)下載導(dǎo)讀cpack 是 CMake 自帶的打包程序負(fù)責(zé)把已經(jīng)構(gòu)建好的項(xiàng)目產(chǎn)物生成多種格式的安裝程序與源碼包。本文基于 cpack(1) 手冊 展開完整講解 cpack 的每一條命令行選項(xiàng)-G、-C、-D、-P、-R、-B、preset 系列等結(jié)合倉庫內(nèi) cpack 主程序源碼 說明各選項(xiàng)在底層的真實(shí)處理邏輯并給出從include(CPack)到最終產(chǎn)出安裝包的完整實(shí)戰(zhàn)流程。讀完本文你將掌握 cpack 的調(diào)用方式、配置文件的驅(qū)動(dòng)機(jī)制、generator 的選取規(guī)則以及 package preset 的進(jìn)階用法。一、cpack 是什么CMake 的打包驅(qū)動(dòng)器cpack 是 CMake 生態(tài)中的獨(dú)立可執(zhí)行程序用于生成二進(jìn)制安裝程序與源碼包支持多種格式。其命令行概要Synopsis非常簡單cpack [options]與cmake相比cpack 只負(fù)責(zé)打包這一件事它不負(fù)責(zé)編譯只負(fù)責(zé)把已經(jīng)安裝到臨時(shí)目錄中的文件收集起來交給對(duì)應(yīng)的打包后端處理。在 cpack 主程序源碼 中程序自身的定位描述就是cpack - Packaging driver provided by CMake.從源碼結(jié)構(gòu)看cpack 的頂層邏輯可以概括為三步見 cpack.cxx解析命令行參數(shù)參數(shù)表定義在 cpack.cxx 的 arguments 數(shù)組讀取并執(zhí)行 CPack 配置文件默認(rèn)是當(dāng)前目錄下的CPackConfig.cmake遍歷CPACK_GENERATOR指定的 generator 列表逐個(gè)實(shí)例化生成器并調(diào)用DoPackage()產(chǎn)出包對(duì)應(yīng)代碼段。1.1 Generator打包格式的后端對(duì)于每一種安裝包格式cpack 都有一個(gè)專門的后端稱之為generator生成器。一個(gè) generator 負(fù)責(zé)生成打包工具所需的輸入文件并調(diào)用具體的打包工具如 NSIS、RPM、dpkg-deb 等完成封裝。需要特別注意這里的package generator與 cmake 命令的makefile generator如 Unix Makefiles、Ninja完全是兩回事不要混淆。前者決定產(chǎn)出什么格式的安裝包后者決定用什么構(gòu)建系統(tǒng)來編譯。倉庫中支持的全部 generator 清單見 cpack-generators(7) 手冊包括歸檔類archive含 TGZ、ZIP 等變體Debian / RedHat 系列deb、rpm、freebsd、cygwinmacOSdmg、bundle、productbuild、packagemakerWindowsnsis、wix、innosetup、nuget移動(dòng)端apkAndroid通用 AppImageappimage外部擴(kuò)展點(diǎn)external詳見 external generator 文檔運(yùn)行cpack --help會(huì)打印當(dāng)前目標(biāo)平臺(tái)上可用的 generator 列表該列表在源碼中由 makeGeneratorDocs 函數(shù) 從cmCPackGeneratorFactory動(dòng)態(tài)收集生成。1.2 配置文件驅(qū)動(dòng)機(jī)制cpack 由一份用 CMake 語言編寫的配置文件驅(qū)動(dòng)。默認(rèn)情況下它讀取當(dāng)前工作目錄下的CPackConfig.cmake也可以使用--config選項(xiàng)指定其他文件。在標(biāo)準(zhǔn) CMake 工作流中只要項(xiàng)目的CMakeLists.txt中include(CPack)cmake 配置階段就會(huì)自動(dòng)生成CPackConfig.cmake與CPackSourceConfig.cmake兩份文件見 CPack 模塊文檔文件實(shí)際寫入位置在 CPack.cmake 源碼末尾include(CPack)這兩份文件分別用于CPackConfig.cmake驅(qū)動(dòng)二進(jìn)制安裝包的生成CPackSourceConfig.cmake驅(qū)動(dòng)源碼包的生成配合cpack -G TGZ --config CPackSourceConfig.cmake使用。cpack 的配置讀取邏輯在源碼中有明確體現(xiàn)cpack.cxx 對(duì)應(yīng)代碼若未顯式指定--config程序會(huì)把配置文件路徑拼接為當(dāng)前工作目錄/CPackConfig.cmake如果該文件存在則通過ReadListFile執(zhí)行若顯式指定了路徑但文件不存在則直接報(bào)錯(cuò)退出。1.3 關(guān)于配置文件中的必填項(xiàng)在執(zhí)行DoPackage()之前cpack 會(huì)對(duì)配置做一系列完整性校驗(yàn)cpack.cxx 中的校驗(yàn)邏輯CPACK_PACKAGE_NAME必須已定義否則報(bào)CPack project name not specified版本信息必須齊全要么定義CPACK_PACKAGE_VERSION要么同時(shí)定義CPACK_PACKAGE_VERSION_MAJOR、CPACK_PACKAGE_VERSION_MINOR、CPACK_PACKAGE_VERSION_PATCH必須通過CPACK_INSTALL_CMAKE_PROJECTS、CPACK_INSTALL_COMMANDS、CPACK_INSTALL_SCRIPT或CPACK_INSTALLED_DIRECTORIES之一告訴 cpack 從哪里收集要打包的文件否則報(bào)Please specify build tree of the project...。若版本只給了 MAJOR/MINOR/PATCH 三段cpack 會(huì)在源碼中自動(dòng)拼接出CPACK_PACKAGE_VERSION見 cpack.cxx 的版本合成代碼。二、選項(xiàng)總覽與逐項(xiàng)詳解cpack 的選項(xiàng)分為兩類打包控制選項(xiàng)決定打包行為與幫助/版本選項(xiàng)用于查閱文檔。下表先給出打包控制選項(xiàng)的完整清單選項(xiàng)作用對(duì)應(yīng) CMake 變量-G generators指定要使用的 generator 列表CPACK_GENERATOR-C configurations指定要打包的構(gòu)建配置如 Debug/ReleaseCPACK_BUILD_CONFIG-D varvalue覆蓋/定義任意 CPack 變量任意變量--config configFile指定配置文件—默認(rèn)CPackConfig.cmake-V, --verbose詳細(xì)輸出—--debug調(diào)試輸出面向 cpack 自身開發(fā)者—--trace/--trace-expand底層腳本跟蹤模式—-P packageName覆蓋包名CPACK_PACKAGE_NAME-R packageVersion覆蓋版本號(hào)CPACK_PACKAGE_VERSION-B packageDirectory指定打包工作目錄CPACK_PACKAGE_DIRECTORY--vendor vendorName覆蓋廠商名CPACK_PACKAGE_VENDOR--preset preset使用 package preset—--presets-file file從指定文件讀取 presets—--list-presets[defined]列出可用 package presets—該選項(xiàng)清單與 cpack 主程序源碼中的 cmDocumentationOptions 數(shù)組 一一對(duì)應(yīng)。下面逐項(xiàng)深入。2.1-G generators選擇打包格式generators是一個(gè)分號(hào)分隔的 generator 名稱列表。cpack 會(huì)按順序遍歷該列表根據(jù)CPackConfig.cmake中的配置為每個(gè) generator 分別產(chǎn)出一個(gè)安裝包。# 同時(shí)產(chǎn)出 TGZ 歸檔和 DEB 包 cpack -G TGZ;DEB如果命令行沒有給出-G則回退使用CPackConfig.cmake中CPACK_GENERATOR變量指定的列表。從源碼看命令行-G的值最終通過AddDefinition(CPACK_GENERATOR, ...)覆蓋配置值cpack.cxx 對(duì)應(yīng)代碼。一個(gè)重要的執(zhí)行細(xì)節(jié)源自 CPack 模塊文檔在CMakeLists.txt中CPACK_GENERATOR是一個(gè)列表但在CPACK_PROJECT_CONFIG_FILE中它被重置為當(dāng)前正在打包的那一個(gè) generator 名稱的字符串。cpack 的迭代流程是執(zhí)行CPackConfig.cmake讀取-G或CPACK_GENERATOR得到 generator 列表對(duì)每個(gè) generator將CPACK_GENERATOR重置為當(dāng)前這一個(gè)的名稱若配置了CPACK_PROJECT_CONFIG_FILE則按生成器逐次 include 它可用于編寫僅針對(duì)某個(gè) generator的特化邏輯調(diào)用該 generator 的DoPackage()產(chǎn)出包。# 單生成器用法示例只打一個(gè) DEB cpack -G DEB2.2-C configurations指定要打包的構(gòu)建配置configurations同樣是分號(hào)分隔的列表例如Debug、Release。當(dāng)項(xiàng)目使用多配置生成器multi-configuration generator如 Xcode 或 Visual Studio 系列時(shí)構(gòu)建目錄里會(huì)同時(shí)存在多個(gè)配置的輸出。此時(shí)必須用-C告訴 cpack 把哪個(gè)配置的產(chǎn)物打進(jìn)包里# Visual Studio 多配置構(gòu)建后只打包 Release 產(chǎn)物 cpack -C Release # 同時(shí)打包 Debug 與 Release cpack -C Debug;Release注意-C只負(fù)責(zé)選取哪些配置的產(chǎn)物用戶有責(zé)任確保這些配置在此之前已經(jīng)構(gòu)建完成手冊原文明確提示The user is responsible for ensuring that the configuration(s) listed have already been built before invoking cpack。底層實(shí)現(xiàn)中該選項(xiàng)被寫入CPACK_BUILD_CONFIG變量cpack.cxx 對(duì)應(yīng)代碼供配置文件與生成器讀取。2.3-D varvalue直接定義 CPack 變量-D可以在命令行直接設(shè)置任意 CPack 變量且會(huì)覆蓋配置文件中同名變量的值cpack -D CPACK_PACKAGE_CONTACTdevexample.com -G TGZ自 CMake 4.0 起還支持不帶空格的單參數(shù)形式-Dvarvaluecpack -DCPACK_PACKAGE_CONTACTdevexample.com -G TGZ在源碼中-D的解析邏輯非常直白cpack.cxx 的 -D 解析代碼它會(huì)在參數(shù)中查找第一個(gè)把左側(cè)作為鍵、右側(cè)作為值存入definitions映射若找不到則直接報(bào)錯(cuò)提示必須以KEYVALUE形式書寫。所有-D收集完畢后會(huì)在配置文件執(zhí)行之后統(tǒng)一通過AddDefinition寫回對(duì)應(yīng)代碼因此能覆蓋配置文件中設(shè)定的同名變量。2.4--config configFile指定配置文件默認(rèn)情況下 cpack 使用當(dāng)前目錄下的CPackConfig.cmake。當(dāng)需要打源碼包、或想復(fù)用另一套打包配置時(shí)可用--config顯式指定# 使用 CMake 生成的源碼包配置 cpack -G TGZ --config CPackSourceConfig.cmakeCPackSourceConfig.cmake正是由include(CPack)生成的第二份配置文件見 CPack 模塊文檔。2.5-V, --verbose詳細(xì)輸出開啟詳細(xì)輸出便于展示打包工具如 NSIS、rpmbuild 等執(zhí)行時(shí)的更多細(xì)節(jié)適合項(xiàng)目開發(fā)者排查打包問題cpack -V源碼中-V與--verbose共用同一個(gè)回調(diào)效果是設(shè)置日志對(duì)象的 verbose 標(biāo)志并打印Enable Verbosecpack.cxx 對(duì)應(yīng)代碼。cpack 的日志系統(tǒng)還定義了統(tǒng)一的前綴日志前綴設(shè)置CPack Error:、CPack Warning:、CPack:、CPack Verbose:方便在終端中快速定位不同級(jí)別的輸出。2.6--debug調(diào)試模式--debug提供更底層的調(diào)試輸出手冊明確指出它主要面向 cpack 自身的開發(fā)者普通項(xiàng)目開發(fā)者一般用不到。其底層行為是打開日志對(duì)象的 debug 開關(guān)cpack.cxx 對(duì)應(yīng)代碼例如-D解析時(shí)會(huì)打印Set CPack variable: key to value這類調(diào)試信息cpack.cxx 的調(diào)試日志。2.7--trace/--trace-expand腳本跟蹤這兩個(gè)選項(xiàng)把 cpack 執(zhí)行配置文件時(shí)底層運(yùn)行的 CMake 腳本置于跟蹤模式--trace普通跟蹤--trace-expand展開式跟蹤會(huì)同時(shí)打印變量展開后的結(jié)果對(duì)排查配置腳本中的變量求值問題非常有用。源碼中二者都會(huì)調(diào)用state-SetTrace(true)后者額外設(shè)置SetTraceExpand(true)cpack.cxx 對(duì)應(yīng)代碼并且該狀態(tài)會(huì)傳遞給實(shí)例化的 generatorcpack.cxx 中的傳遞邏輯。2.8-P packageName覆蓋包名覆蓋/定義CPACK_PACKAGE_NAME變量配置文件中對(duì)該變量的任何設(shè)置都會(huì)被忽略cpack -P myapp -G TGZ底層通過AddDefinition(CPACK_PACKAGE_NAME, ...)覆蓋cpack.cxx 對(duì)應(yīng)代碼。2.9-R packageVersion覆蓋版本號(hào)覆蓋/定義CPACK_PACKAGE_VERSION。它會(huì)覆蓋配置文件中的設(shè)置也會(huì)覆蓋由CPACK_PACKAGE_VERSION_MAJOR/MINOR/PATCH自動(dòng)拼接出的版本號(hào)cpack -R 1.2.3 -G TGZ底層同樣以AddDefinition覆蓋實(shí)現(xiàn)cpack.cxx 對(duì)應(yīng)代碼。2.10-B packageDirectory指定打包輸出目錄覆蓋/定義CPACK_PACKAGE_DIRECTORY控制 cpack 進(jìn)行打包工作的目錄。最終安裝包默認(rèn)產(chǎn)出在該目錄下同時(shí) cpack 會(huì)在此目錄內(nèi)創(chuàng)建_CPack_Packages子目錄作為打包過程的工作區(qū)cpack -B /tmp/pkgout -G TGZ # 產(chǎn)出/tmp/pkgout/myapp-1.2.3-Linux.tar.gz # 工作區(qū)/tmp/pkgout/_CPack_Packages/值得注意的優(yōu)先級(jí)規(guī)則來自 CPack 模塊文檔 與 cpack.cxx 源碼命令行-B優(yōu)先級(jí)最高其次看配置文件中是否設(shè)置CPACK_PACKAGE_DIRECTORY源碼會(huì)調(diào)用CollapseFullPath把它轉(zhuǎn)為絕對(duì)路徑兩者都未設(shè)置時(shí)默認(rèn)使用當(dāng)前工作目錄。2.11--vendor vendorName覆蓋廠商名覆蓋/定義CPACK_PACKAGE_VENDORcpack --vendor Example Corp -G TGZ底層通過AddDefinition(CPACK_PACKAGE_VENDOR, ...)實(shí)現(xiàn)cpack.cxx 對(duì)應(yīng)代碼。三、package preset用 JSON 聲明打包參數(shù)從 CMake 3.23 引入packagePresets開始參見 cmake-presets(7) 手冊中的版本記錄cpack 也支持通過 preset 聲明打包選項(xiàng)將配置、構(gòu)建、測試、打包統(tǒng)一到一份 JSON 文件中。3.1--preset preset/--presetpreset按名稱使用某個(gè) package preset。項(xiàng)目二進(jìn)制目錄會(huì)從該 preset 的configurePreset鍵對(duì)應(yīng)的 configure preset自動(dòng)推斷因此打包會(huì)在與配置/構(gòu)建相同的binaryDir下執(zhí)行cpack --preset package-release版本行為變更CMake 4.4如果同時(shí)指定了--presets-file則CMakePresets.json與CMakeUserPresets.json都不再要求必須存在否則它們必須存在于源碼樹頂層。舊版本中這是嚴(yán)格強(qiáng)制的要求。3.2--presets-file file/--presets-filefileCMake 4.4 新增從指定的文件讀取 presets路徑可以是絕對(duì)路徑或相對(duì)于當(dāng)前工作目錄的路徑。一旦指定--presets-fileCMakePresets.json與CMakeUserPresets.json中定義的 presets 將被忽略cpack --presets-file ./my-presets.json --preset release源碼中該選項(xiàng)會(huì)把文件路徑歸一化后存入 preset 參數(shù)對(duì)象cpack.cxx 的 presetFileLambda隨后預(yù)設(shè)讀取邏輯cpack.cxx 的預(yù)設(shè)讀取代碼會(huì)根據(jù)該路徑加載預(yù)設(shè)圖。3.3--list-presets[defined]列出可用的 package presets不帶參數(shù)列出當(dāng)前可用的availablepackage presets帶defined列出所有非隱藏的已定義 package presets包括當(dāng)前不可用的預(yù)設(shè)及其不可用原因。# 列出可用預(yù)設(shè) cpack --list-presets # 列出全部已定義預(yù)設(shè)含不可用者及原因 cpack --list-presetsdefined版本說明defined值支持為 CMake 4.5 新增CMake 4.4 起若指定了--presets-file則只列出該文件中的預(yù)設(shè)。源碼中該選項(xiàng)由 presetsArgs.SetListPresets 處理非法值會(huì)提示 The only supported value is defined。3.4 package preset 的字段詳解packagePresets數(shù)組中的每個(gè)元素是一個(gè) JSON 對(duì)象核心字段如下完整定義見 packagePresets-properties.rst字段類型說明namestring必填機(jī)器可讀名稱用于cpack --preset name同一目錄下不得與 CMakePresets.json/CMakeUserPresets.json 中其他 package preset 重名hiddenbool隱藏預(yù)設(shè)不能直接通過--preset使用且允許不指定合法的configurePreset通常作為被inherits引用的基類inheritsstring / string[]繼承自其他預(yù)設(shè)除name、hidden、inherits、description、displayName外全部字段默認(rèn)繼承并可覆蓋多個(gè)來源沖突時(shí)靠前的預(yù)設(shè)優(yōu)先conditionobject條件表達(dá)式滿足條件才可使用該預(yù)設(shè)vendormap廠商擴(kuò)展信息CMake 只校驗(yàn)其是否為 map不解釋內(nèi)容displayName/descriptionstring人類可讀名稱與描述environmentmap設(shè)置環(huán)境變量支持宏展開$env{NAME}、$penv{NAME}等可相互引用但不能形成環(huán)configurePresetstring關(guān)聯(lián)的 configure preset 名稱二進(jìn)制目錄由它推斷inheritConfigureEnvironmentbool默認(rèn) true為 true 時(shí)繼承關(guān)聯(lián) configure preset 的環(huán)境變量generatorsstring[]cpack 要使用的 generator 列表等價(jià)于-Gconfigurationsstring[]要打包的構(gòu)建配置列表等價(jià)于-Cvariablesmap傳給 cpack 的變量等價(jià)于-D參數(shù)configFilestring使用的配置文件等價(jià)于--configoutputobject輸出選項(xiàng)含outputName、packageDirectory等鍵packageNamestring包名注意因?qū)崿F(xiàn)問題該字段目前不影響最終包文件名文檔建議暫不使用packageVersionstring包版本同樣因?qū)崿F(xiàn)問題暫不影響最終包文件名文檔建議暫不使用packageDirectorystring放置包文件的目錄vendorNamestring廠商名稱一個(gè)典型的CMakePresets.json示例{ version: 6, configurePresets: [ { name: dev, binaryDir: ${sourceDir}/build/dev, generator: Ninja } ], packagePresets: [ { name: package-deb, displayName: Build Debian package, configurePreset: dev, generators: [DEB], configurations: [Release], variables: { CPACK_PACKAGE_CONTACT: devexample.com } }, { name: package-tgz, inherits: package-deb, generators: [TGZ] } ] }對(duì)應(yīng)命令cpack --preset package-deb cpack --preset package-tgz在源碼層面preset 的處理流程cpack.cxx 的預(yù)設(shè)處理段依次完成讀取預(yù)設(shè)文件 → 列出/解析目標(biāo)預(yù)設(shè) → 校驗(yàn)預(yù)設(shè)中的 generator 是否在當(dāng)前平臺(tái)可用 → 查找關(guān)聯(lián)的 configure preset 并切換到其binaryDir→ 注入預(yù)設(shè)環(huán)境變量 → 把預(yù)設(shè)中的generators、configurations、variables、configFile、packageName、packageVersion、packageDirectory、vendorName等逐一合并到對(duì)應(yīng)命令行參數(shù)命令行顯式給出的參數(shù)優(yōu)先預(yù)設(shè)只在不沖突時(shí)生效。四、幫助與版本選項(xiàng)cpack 沿用了 CMake 家族統(tǒng)一的文檔查詢體系這些選項(xiàng)定義在 OPTIONS_HELP.rst由 cpack(1) 手冊通過 include 引入。4.1 版本信息cpack -version[json-v1] [file] cpack --version[json-v1] [file]打印程序名與版本橫幅后退出。若指定json-v1則輸出 JSON 格式的擴(kuò)展版本信息包含 CMake 及其依賴組件的版本JSON 輸出格式有機(jī)器可讀的 schema 描述見 version-schema.json??蛇x參數(shù)file可將輸出寫入指定文件。4.2 幫助信息選項(xiàng)作用-h, -H, --help, -help, -usage, /?打印基本用法與選項(xiàng)說明后退出--help keyword [file]打印某個(gè) CMake 關(guān)鍵字property、variable、command、policy、generator 或 module的手冊條目CMake 3.28 起不再局限于命令名--help-full [file]打印全部幫助手冊--help-manual man [file]打印指定手冊如cpack --help-manual cpack-generators--help-manual-list [file]列出所有可查詢的手冊名稱--help-command cmd [file]打印單個(gè)命令的幫助如cpack --help-command install--help-command-list/--help-commands列出命令 / 打印 cmake-commands 手冊--help-module mod/--help-module-list/--help-modules模塊級(jí)幫助--help-policy cmp/--help-policy-list/--help-policies策略級(jí)幫助--help-property prop/--help-property-list/--help-properties屬性級(jí)幫助--help-variable var/--help-variable-list/--help-variables變量級(jí)幫助這些選項(xiàng)中的file均可選用于把輸出重定向到文件。在源碼中幫助模式通過doc.CheckOptions(argc, argv, -G)判定cpack.cxx 對(duì)應(yīng)代碼并且零參數(shù)直接運(yùn)行與零參數(shù)打印幫助被刻意區(qū)分直接運(yùn)行cpack不帶任何參數(shù)會(huì)嘗試讀取當(dāng)前目錄的CPackConfig.cmake執(zhí)行打包而不是打印幫助源碼注釋明確指出這一設(shè)計(jì)見 cpack.cxx 注釋。五、標(biāo)準(zhǔn)打包工作流從 CMakeLists.txt 到安裝包綜合 CPack 模塊文檔 與 cpack(1) 手冊一個(gè)完整的打包流程如下步驟 1在項(xiàng)目中啟用 CPack# CMakeLists.txt項(xiàng)目根目錄 cmake_minimum_required(VERSION 3.16) project(MyApp VERSION 1.2.3) # ... 定義目標(biāo)、install() 規(guī)則 ... include(CPack)install()命令的DESTINATION必須是相對(duì)路徑否則安裝文件會(huì)被 CPack 忽略CPack 模塊文檔明確說明。步驟 2配置項(xiàng)目cmake -S . -B build配置結(jié)束后構(gòu)建目錄中會(huì)生成CPackConfig.cmake與CPackSourceConfig.cmake。步驟 3構(gòu)建cmake --build build步驟 4打包# 方式一直接調(diào)用 cpack cpack --config build/CPackConfig.cmake # 方式二利用 include(CPack) 生成的 package 目標(biāo) cmake --build build --target package對(duì)于 Makefile / Ninja / Xcode 生成器include(CPack)會(huì)額外生成名為package的構(gòu)建目標(biāo)因此也可以直接make package或ninja packageVisual Studio 生成器則生成大寫目標(biāo)PACKAGECPack 模塊文檔。Makefile 與 Ninja 生成器還會(huì)生成package_source目標(biāo)用于打源碼包CPack 模塊文檔。步驟 5一次產(chǎn)出多種格式# 同時(shí)產(chǎn)出 TGZ 與 DEB在 Linux 上 cpack --config build/CPackConfig.cmake -G TGZ;DEB # 或通過 -D 覆蓋配置 cpack -D CPACK_GENERATORTGZ;DEB --config build/CPackConfig.cmake源碼包c(diǎn)pack -G TGZ --config build/CPackSourceConfig.cmake源碼包會(huì)包含項(xiàng)目目錄中的全部源文件除非通過CPACK_SOURCE_IGNORE_FILES排除CPack 模塊文檔。六、常見變量速查與 -D / -P / -R / -B 的對(duì)應(yīng)關(guān)系命令行選項(xiàng)本質(zhì)上都是對(duì) CPack 變量的快捷覆蓋CPack 模塊文檔的通用變量章節(jié)命令行選項(xiàng)對(duì)應(yīng)變量默認(rèn)值說明-PCPACK_PACKAGE_NAME未指定時(shí)取項(xiàng)目名--vendorCPACK_PACKAGE_VENDOR默認(rèn)Humanity-BCPACK_PACKAGE_DIRECTORY默認(rèn)當(dāng)前工作目錄-RCPACK_PACKAGE_VERSION可由 MAJOR/MINOR/PATCH 三段拼接—CPACK_PACKAGE_FILE_NAME默認(rèn)${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}—CPACK_PACKAGE_DESCRIPTION_SUMMARY默認(rèn)取CMAKE_PROJECT_DESCRIPTION—CPACK_PACKAGE_HOMEPAGE_URL默認(rèn)取project()中的主頁 URL—CPACK_PACKAGE_CHECKSUMCMake 3.7 起支持生成校驗(yàn)和文件4.2 起支持算法列表因此-D CPACK_PACKAGE_VENDORxxx與--vendor xxx在效果上是等價(jià)的-D是最通用的萬能覆蓋口。七、源碼視角cpack 主程序是如何工作的cpack 的入口位于 Source/CPack/cpack.cxx 的main函數(shù)其關(guān)鍵鏈路可歸納為初始化處理命令行編碼、初始化 libuv、定位 CMake 資源、創(chuàng)建日志對(duì)象并設(shè)置CPack Error:等輸出前綴cpack.cxx 初始化段參數(shù)解析將所有命令行參數(shù)與預(yù)定義的arguments表逐一匹配未知的-開頭參數(shù)會(huì)報(bào)Unknown argument:并給出最接近的候選建議Did you mean: ...?見 cpack.cxx 參數(shù)匹配邏輯preset 處理若出現(xiàn)--preset/--presets-file/--list-presets則讀取、解析并合并預(yù)設(shè)cpack.cxx 預(yù)設(shè)處理段配置文件加載確定配置文件路徑默認(rèn)當(dāng)前目錄CPackConfig.cmake并執(zhí)行之同時(shí)加載CMakeDetermineSystem.cmake等系統(tǒng)探測腳本使配置文件中可正常使用FIND_XXX()命令cpack.cxx 配置加載段變量覆蓋依次把-G、-P、-R、--vendor、-B、-D收集到的值寫回全局 Makefile 定義cpack.cxx 變量寫入段迭代生成遍歷 generator 列表逐一校驗(yàn)包名/版本/安裝信息實(shí)例化生成器并調(diào)用DoPackage()任一環(huán)節(jié)失敗即返回非零退出碼cpack.cxx 生成段。倉庫還提供了對(duì)應(yīng)的回歸測試?yán)?Tests/RunCMake/CPack/ 通過set(CPACK_GENERATOR ${GENERATOR_TYPE})驅(qū)動(dòng)不同生成器類型的打包測試其中的PRE_POST_SCRIPTS測試pre.cmake、post.cmake驗(yàn)證了打包前后腳本在執(zhí)行時(shí)能正確讀取CPACK_GENERATOR上下文可作為研究 cpack 行為的參考起點(diǎn)。八、使用建議與注意事項(xiàng)多配置項(xiàng)目必須用-CXcode / Visual Studio 生成的構(gòu)建目錄含多個(gè)配置的產(chǎn)物缺了-C可能導(dǎo)致包內(nèi)缺少可執(zhí)行文件-D是萬能覆蓋任何 CPack 變量都可-D覆蓋但注意-D的鍵值必須帶否則報(bào)錯(cuò)優(yōu)先用 preset 固化流程把 generator、配置、變量寫進(jìn)CMakePresets.json的packagePresets配合--preset一鍵打包可避免命令行越寫越長-B與_CPack_Packages打包中間文件會(huì)留在-B指定的目錄下CI 中注意清理或復(fù)用該工作區(qū)CPACK_PROJECT_CONFIG_FILE是按 generator 逐個(gè) include 的若某個(gè)設(shè)置只想作用于 DEB 而不作用于 RPM應(yīng)放在該文件中并判斷CPACK_GENERATOR的當(dāng)前值CPack 模塊文檔。參考資料cpack(1) 命令行手冊本文的主體依據(jù)cpack-generators(7) 生成器手冊全部生成器清單CPack 模塊文檔include(CPack)的用法、目標(biāo)與通用變量cmake-presets(7) 手冊 與 packagePresets 屬性定義package preset 完整字段cpack 主程序源碼命令行解析與打包主流程cpack 回歸測試生成器級(jí)打包行為驗(yàn)證贊分享構(gòu)建工具開發(fā)工具CLI【免費(fèi)下載鏈接】CMakeMirror of CMake upstream repository項(xiàng)目地址https://gitcode.com/gh_mirrors/cm/CMake點(diǎn)擊查看免費(fèi)下載相關(guān)推薦CMake打包工具CPack完全指南生成DEB/RPM/MSI安裝包全流程CMake打包工具CPack完全指南生成DEB/RPM/MSI安裝包全流程 你是否還在為跨平臺(tái)軟件打包而煩惱從Linux的DEB/RPM到Windows的M構(gòu)建工具開發(fā)工具CLICMake CPack 生成器全景指南17 大打包后端選型、配置與源碼剖析CMake CPack 生成器全景指南17 大打包后端選型、配置與源碼剖析 CPack 是 CMake 的打包工具它把 install 命令收集到的安裝產(chǎn)物構(gòu)建工具開發(fā)工具CLICPack Archive 生成器完全指南用 CMake 打遍 7z/tar/zip 全格式安裝包與源碼包CPack Archive 生成器完全指南用 CMake 打遍 7z/tar/zip 全格式安裝包與源碼包 CPack 的 Archive 生成器Archi構(gòu)建工具開發(fā)工具CLI上一篇gh_mirrors/gumr/gumroad性能監(jiān)控NewRelic與APM工具應(yīng)用下一篇NocoBase部署實(shí)戰(zhàn)指南三套企業(yè)級(jí)安裝方案詳解創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考