您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何進行CPack的入門,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
背景
CPack 是 CMake 2.4.2 之后的一個內(nèi)置工具,用于創(chuàng)建軟件的二進制包和源代碼包。
CPack 在整個 CMake 工具鏈的位置。
CPack 支持打包的包格式有以下種類:
7Z (7-Zip file format)
DEB (Debian packages)
External (CPack External packages)
IFW (Qt Installer Framework)
NSIS (Null Soft Installer)
NSIS64 (Null Soft Installer (64-bit))
NuGet (NuGet packages)
RPM (RPM packages)
STGZ (Self extracting Tar GZip compression
TBZ2 (Tar GZip compression)
TXZ (Tar XZ compression)
TZ (Tar Compress compression)
ZIP (ZIP file format)
軟件程序想要在生產(chǎn)環(huán)境快速被使用,就需要一個一鍵安裝的安裝包,這樣生產(chǎn)環(huán)境就可以很方便的部署和使用。
C++ 工程大部分都是用 CMake 配置編譯, 而 CPack 是 CMake 內(nèi)置的工具,支持打包成多種格式的安裝包。因為是 CMake 的內(nèi)置工具,所以使用的方式也是通過在 CMakeLists.txt 配置參數(shù),就能達到我們的需求。使用起來很方便,容易上手。
安裝 CMake 的時候會把 CPack 一起安裝了,直接通過 yum 或者 apt-get 安裝即可。
這里介紹如何打包 rpm 包,deb 的打包是一樣的,區(qū)別在于一些配置。Cpack 打包 rpm 用的是 CPack RPM 生成器,用到的配置變量是以 CPACK_RPM_XXX 為前綴。最終通過
rpm-build 這個工具去打包,所以需要安裝
rpm-build 這個工具,可以通過 sudo yum install -y rpm-build
安裝。下面配置是用 3.14.5 的 CMake 進行測試的。
現(xiàn)在有一個工程 example,其目錄結(jié)構(gòu)如下:
example |-- CMakeLists.txt // example 的主 CMakeLists.txt 文件 |-- Readme.txt |-- License.txt |-- src | |-- CMakeLists.txt | |-- MainA.cpp // 可執(zhí)行文件 Aprogram 的源碼 | |__ MainB.cpp // 可執(zhí)行文件 Bprogram 的源碼 | |-- etc | |-- CMakeLists.txt | |-- A.conf // 可執(zhí)行文件 Aprogram 的配置文件 | |__ B.conf // 可執(zhí)行文件 Bprogram 的配置文件 | |__ scripts |-- preinst // 安裝前執(zhí)行的腳本 |-- postinst // 安裝后執(zhí)行的腳本 |-- prerm // 卸載前執(zhí)行的腳本 |__ postrm // 卸載后執(zhí)行的腳本
只需要在 example/CMakeLists.txt 文件里面添加如下配置
# 設(shè)置生成的安裝包名字 set(CPACK_PACKAGE_NAME "example") # 設(shè)置支持指定安裝目錄的控制為 ON set(CPACK_SET_DESTDIR ON) # 設(shè)置安裝到的目錄路徑 set(CPACK_INSTALL_PREFIX "/home/vesoft/install") # 這是生成的安裝的版本號信息 set(CPACK_PACKAGE_VERSION "1.0.0") # 設(shè)置 group 名字 set(CPACK_RPM_PACKAGE_GROUP "vesoft") # 設(shè)置 vendor 名字 set(CPACK_PACKAGE_VENDOR "vesoft") # 設(shè)置 license 信息 set(CPACK_RPM_PACKAGE_LICENSE "Apache 2.0 + Common Clause 1.0") include(CPack)
執(zhí)行 cmake 命令后, 你會發(fā)現(xiàn)當(dāng)前目錄下面多了兩個文件
CPackConfig.cmake 和 CPackSourceConfig.cmake。 編譯完成后,執(zhí)行
cpack -G RPM
就可將文件打包成 rpm 包,當(dāng)前目錄下會生成一個
_CPack_Packages 目錄和一個以 .rpm 為后綴名的文件
example-1.0.0-Linux.rpm,example-1.0.0-Linux.rpm 就是我們想要的安裝包文件。
如果想要查看打包過程的詳細輸出,可以在命令后面添加
--verbose
。CPack 是根據(jù)用戶的配置生成_CPack_Packages/Linux/RPM/SPECS/example.spec 文件,然后讓 rpm-build 用。
上面配置生成的安裝包 example-1.0.0-Linux.rpm里面包含的文件如下:
??注意:假如安裝時出現(xiàn)
file /home from install of example-1.0.0-1.x86_64 conflicts with file from package filesystem-3.2-25.el7.x86_64
,那么需要在配置文件里面添加以下配置,讓生成的 rpm 文件不包含 /home 和 /home/vesoft 。
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/home") list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/home/vesoft")
我們要在安裝前后、卸載前后做一些事情時,可以通過寫相應(yīng)的腳本文件:
preinst:安裝前腳本文件
postinst:安裝后腳本文件
prerm:卸載前文件
postrm:卸載后文件
在上述的 CMakeLists.txt 文件里面添加如下配置:
# 設(shè)置安裝前執(zhí)行的腳本文件 preinst set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/preinst) # 設(shè)置卸載前執(zhí)行的腳本文件 prerm set(CPACK_RPM_PRE_UNINSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/prerm) # 設(shè)置安裝后執(zhí)行的腳本文件 postinst set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/postinst) # 設(shè)置卸載后執(zhí)行的腳本文件 postrm set(CPACK_RPM_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/scripts/postrm)
CPack 會將上面配置的腳本里面的內(nèi)容寫到生成的 SPEC 文件里面去。
??注意:上述的四個腳本文件需要的權(quán)限是所有用戶和用戶組均能執(zhí)行,創(chuàng)建完腳本文件后,通過
chmod 755 scripts/*
修改 scripts 目錄下面的腳本文件的權(quán)限。
執(zhí)行
sudo rpm -ivh example-1.0.0-Linux.rpm
命令會有以下輸出
執(zhí)行
sudo rpm -e example-1.0.0
會有以下輸出
可以看到圖片里面綠色和紅色字樣,就是四個腳本文件的打印輸出,分別對應(yīng)安裝前后和卸載前后執(zhí)行打印。所以用戶可以在這四個腳本里面實現(xiàn)自己想要的功能。
上述配置是將所有需要打包的文件打包成一個安裝包,但一個項目往往會有多個不同服務(wù),在實施部署時需安裝到不同的機子上,這個時候如果把所有服務(wù)一起打包,會導(dǎo)致部署時包太大。這個時候就需要用上 CPack 的 Components 功能。
下面介紹在這個過程需要用到的三個函數(shù):cpack_add_component 和 cpack_add_component_group,還有 install。
以下為添加 install 的函數(shù)定義
以下為添加 component 的函數(shù)定義
以下為添加 group 的函數(shù)定義
以上述為例,假如我們要將 program A 和它的配置文件 A.conf 打成一個 rpm 包,將 program B 和它的配置文件 B.conf 打成一個 rpm 包,則需要在 CMakeLists.txt 里添加以下內(nèi)容,把上述配置的 include(CPack) 移到下面配置的位置:
# 設(shè)置每個分組打包成一個 rpm 包 set(CPACK_COMPONENTS_GROUPING ONE_PER_GROUP) # 設(shè)置支持 COMPONENT set(CPACK_RPM_COMPONENT_INSTALL ON) include(CPack) # 添加一個名為 AComponent 的 component cpack_add_component(AComponent DISPLAY_NAME "A program" DESCRIPTION "The program for test" GROUP Aprogram) # 添加一個名為 BComponent 的 component cpack_add_component(BComponent DISPLAY_NAME "B program" DESCRIPTION "The program for test" GROUP Bprogram) # 添加一個名為 Aprogram 的 group, 這個名字會作為 rpm 包名字的一部分 cpack_add_component_group(Aprogram) # 添加一個名為 Bprogram 的 group cpack_add_component_group(Bprogram)
然后修改 src/CMakeLists.txt,看下圖紅框內(nèi)容,將 program A 二進制文件配置為 AComponent,將 program B 二進制文件配置為 BComponent。
修改 etc/CMakeLists.txt,看下圖紅框內(nèi)容,將配置文件 A.conf 配置為 AComponent, 將配置文件 B.conf 配置為 BComponent。
更新 CMakeLists.txt 的配置之后,重新執(zhí)行下 cmake 命令生成新的 makefile 文件,并執(zhí)行
cpack -G RPM
,你可以在當(dāng)前目錄下面看到生成兩個文件
example-1.0.0-Linux-Aprogram.rpm 和
example-1.0.0-Linux-Bprogram.rpm, 它們各自包含的文件如下:
安裝到指定目錄:上述配置,生成的安裝包只能安裝到 /home/vesoft/install 目錄,假如用戶希望能夠安裝指定位置,這個時候需要在 include(CPack) 之前添加以下配置
# 將上述配置設(shè)置指定目錄這個選項置為 OFF set(CPACK_SET_DESTDIR OFF) # 設(shè)置可重定目錄的選擇為 ON set(CPACK_RPM_PACKAGE_RELOCATABLE ON) # 設(shè)置默認重定的目錄 set(CPACK_PACKAGING_INSTALL_PREFIX "/home/vesoft/install")
通過上述配置,重新生成的 rpm 包就可以支持安裝到其他指定目錄,下面是把它安裝到 /home/test/install,使用如下:
sudo rpm -ivh example-1.0.0-Linux-Aprogram.rpm --prefix=/home/test/install
用戶可以通過 CPACK_RPM_SPEC_MORE_DEFINE 這個參數(shù)在生成的 SEPC 文件里面增加相應(yīng)的宏,來應(yīng)用 rpmbuild 的一些功能開關(guān)。
CPack 有很多參數(shù),不同版本參數(shù)有些差異,想要了解更多,可以去 CMake 官網(wǎng)查看,見
CPack?;蛑苯油ㄟ^
CPack --help
獲取參數(shù)描述。
Nebula Graph 也是采用 CPack 進行打包成 rpm 和 deb 包,您可以通過 https://github.com/vesoft-inc/nebula/releases 獲取到 Nebula Graph 每次 release 發(fā)布的包。
以上就是如何進行CPack的入門,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。