cmake之旅(12)
cmake之旅12cmake之旅12CPack 打包与发布1 CPack 是什么2 最简单的 CPack 配置3 配置 CPack3.1 基本信息3.2 选择打包格式4 生成 DEB 包5 生成 RPM 包6 完整示例7 组件化打包8 source 包9 本篇命令速查表10 总结与下一篇预告同系列文章cmake之旅(1):构建的过程cmake之旅(2):CMakeLists.txt 核心语法cmake之旅(3):多目录项目管理cmake之旅(4):静态库与动态库cmake之旅5):函数、宏与 .cmake 模块cmake之旅6查找和使用第三方库cmake之旅7编译选项与条件编译cmake之旅8Modern CMake 与 target 思维cmake之旅9安装与导出cmake之旅10自动化测试与 CTestcmake之旅11交叉编译与工具链文件cmake之旅12CPack 打包与发布cmake之旅12CPack 打包与发布上一篇我们学会了交叉编译让程序可以在不同平台上运行。但把编译好的程序分发给最终用户总不能给他一堆.so文件和一个可执行文件让他自己放到正确的目录里吧。我们需要把项目打包成标准的安装包——Linux 上是.debDebian/Ubuntu或.rpmCentOS/FedoraWindows 上是.exe安装程序或.zipmacOS 上是.dmg。CMake 内置的CPack工具正好解决这个问题。1 CPack 是什么CPack 是 CMake 配套的打包工具。它复用install()命令定义的安装规则把要安装的文件打包成各种格式的安装包。换句话说如果你已经在第九篇中写好了install()规则那 CPack 几乎是零成本使用的——它直接利用已有的安装规则来决定哪些文件需要打包。2 最简单的 CPack 配置在 CMakeLists.txt 的末尾加上两行就行# 引入 CPack 模块必须放在所有 install 命令之后 include(CPack)然后构建并打包mkdirbuildcdbuild cmake..makecpackcpack命令默认会生成一个.tar.gz压缩包和一个.sh自解压脚本。不过默认的配置比较粗糙。我们来看看如何自定义打包行为。3 配置 CPackCPack 的配置通过一系列CPACK_xxx变量来控制。这些变量必须在include(CPack)之前设置。3.1 基本信息# 包的基本信息 set(CPACK_PACKAGE_NAME Calculator) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY 一个简单的计算器库) set(CPACK_PACKAGE_VENDOR MyCompany) set(CPACK_PACKAGE_CONTACT devexample.com) # 许可协议文件 set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) # 输出文件名不含后缀 set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}) include(CPack)3.2 选择打包格式通过CPACK_GENERATOR指定要生成的包格式# 指定一种或多种打包格式 set(CPACK_GENERATOR TGZ;DEB;RPM)常用的打包格式生成器格式适用系统TGZ.tar.gz通用ZIP.zip通用DEB.debDebian / UbuntuRPM.rpmCentOS / FedoraNSIS.exe 安装程序WindowsWIX.msi 安装程序WindowsDragNDrop.dmgmacOSSTGZ.sh 自解压脚本Linux也可以在命令行中指定cpack-GDEB# 只生成 .deb 包cpack-GZIP# 只生成 .zip 包4 生成 DEB 包Debian/Ubuntu 的.deb包是 Linux 上最常见的安装包格式之一。# DEB 包特有的配置 set(CPACK_DEBIAN_PACKAGE_MAINTAINER Your Name youremail.com) set(CPACK_DEBIAN_PACKAGE_SECTION devel) # 分类 set(CPACK_DEBIAN_PACKAGE_DEPENDS libc6 ( 2.17)) # 运行时依赖 include(CPack)构建并打包cmake..makecpack-GDEB生成的.deb文件可以直接用dpkg安装sudodpkg-iCalculator-1.0.0-Linux.deb安装后可执行文件会出现在/usr/local/bin/库文件出现在/usr/local/lib/头文件出现在/usr/local/include/——这些路径就是你在install()命令中指定的。卸载sudodpkg-rcalculator5 生成 RPM 包CentOS/Fedora 系统使用 RPM 包。需要先安装rpmbuild工具sudoapt-getinstallrpm# Ubuntu 上安装 rpm 工具CMake 配置# RPM 包特有的配置 set(CPACK_RPM_PACKAGE_LICENSE MIT) set(CPACK_RPM_PACKAGE_GROUP Development/Libraries) set(CPACK_RPM_PACKAGE_REQUIRES glibc 2.17) # 运行时依赖 include(CPack)cpack-GRPM6 完整示例我们基于 Calculator 项目写一个完整的支持打包的 CMakeLists.txtcmake_minimum_required(VERSION 3.14) project(Calculator VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) include(GNUInstallDirs) # ---- 构建 ---- add_library(calc_lib src/add.cpp src/de.cpp ) target_include_directories(calc_lib PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR} ) add_executable(calculator src/main.cpp) target_link_libraries(calculator PRIVATE calc_lib) # ---- 安装 ---- install(TARGETS calc_lib calculator EXPORT CalcLibTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) # 安装 CMake 配置文件可选供其他 CMake 项目使用 install(EXPORT CalcLibTargets FILE CalcLibTargets.cmake NAMESPACE CalcLib:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CalcLib ) # ---- CPack 打包配置 ---- set(CPACK_PACKAGE_NAME Calculator) set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY 一个简单的计算器库和工具) set(CPACK_PACKAGE_VENDOR MyCompany) set(CPACK_PACKAGE_CONTACT devexample.com) set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) # 安装路径前缀 set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) # 输出文件名 set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) # DEB 配置 set(CPACK_DEBIAN_PACKAGE_MAINTAINER devexample.com) set(CPACK_DEBIAN_PACKAGE_SECTION devel) # RPM 配置 set(CPACK_RPM_PACKAGE_LICENSE MIT) # 引入 CPack必须在所有 CPACK_ 变量设置之后 include(CPack)构建和打包mkdirbuildcdbuild cmake..make# 生成所有配置的格式cpack# 或者只生成特定格式cpack-GTGZ cpack-GDEB cpack-GZIP7 组件化打包对于复杂的项目你可能不想把所有东西打成一个包。比如用户可能只想安装运行时文件可执行文件 动态库不想安装开发文件头文件 静态库 CMake 配置。CPack 支持组件化打包——把安装内容分成多个组件每个组件可以单独打包。# 运行时组件 install(TARGETS calculator RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) install(TARGETS calc_lib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime ) # 开发组件 install(TARGETS calc_lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT development ) install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT development ) # 启用组件化打包 set(CPACK_DEB_COMPONENT_INSTALL ON) # 组件描述 set(CPACK_COMPONENT_RUNTIME_DISPLAY_NAME 运行时文件) set(CPACK_COMPONENT_RUNTIME_DESCRIPTION 可执行文件和动态库) set(CPACK_COMPONENT_DEVELOPMENT_DISPLAY_NAME 开发文件) set(CPACK_COMPONENT_DEVELOPMENT_DESCRIPTION 头文件、静态库和 CMake 配置) set(CPACK_COMPONENT_DEVELOPMENT_DEPENDS runtime) # 开发组件依赖运行时组件这样 CPack 会生成两个独立的包Calculator-1.0.0-Linux-runtime.deb Calculator-1.0.0-Linux-development.deb用户可以按需安装# 只安装运行时sudodpkg-iCalculator-1.0.0-Linux-runtime.deb# 如果需要开发编写依赖此库的代码再装开发包sudodpkg-iCalculator-1.0.0-Linux-development.deb8 source 包除了打包编译后的二进制文件CPack 还可以打包源码# 打包源码cpack--configCPackSourceConfig.cmake默认会包含所有源文件。可以通过CPACK_SOURCE_IGNORE_FILES排除不需要的文件set(CPACK_SOURCE_IGNORE_FILES /build/ /\\.git/ \\.gitignore /\\.vscode/ ) set(CPACK_SOURCE_GENERATOR TGZ;ZIP)9 本篇命令速查表CPack 常用变量变量含义CPACK_PACKAGE_NAME包名CPACK_PACKAGE_VERSION版本号CPACK_PACKAGE_DESCRIPTION_SUMMARY简短描述CPACK_PACKAGE_VENDOR厂商/作者CPACK_PACKAGE_CONTACT联系方式CPACK_GENERATOR打包格式列表CPACK_PACKAGE_FILE_NAME输出文件名CPACK_RESOURCE_FILE_LICENSE许可协议文件cpack 命令行参数参数作用-G generator指定打包格式-C config指定构建配置Debug/Release--config file使用指定的配置文件-V详细输出10 总结与下一篇预告这一篇我们学习了 CPack 的使用方法包括基本配置、DEB/RPM 包的生成、组件化打包、以及源码打包。CPack 最大的优势是复用已有的 install() 规则几乎不需要额外的工作就能生成标准化的安装包。到这里我们已经完整地走过了 CMake 从入门到进阶的所有核心知识点。最后一篇我们用一个完整的实战项目把这 12 篇的知识全部串起来让你看到一个生产级的 CMake 项目是什么样子的。下一篇——cmake之旅13实战项目总结整个系列的收官之作。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2507035.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!