首页 > 其他分享 >【CMake系列】11-CMake Pack

【CMake系列】11-CMake Pack

时间:2024-06-12 13:46:59浏览次数:25  
标签:11 set CMake component add cpack CPACK Pack

cmake pack
用于将我们的写好的项目 打包,发送给使用方;打包后产生的内容有

  1. 源代码包

  2. 二进制包

  3. 平台原生的二进制安装

    • Debian -> .deb

    • red hat -> .rpm

    • macOS -> .dmg

    • windows -> NSIS

image-20240605163151633

本专栏的实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

cmake 与 cpack

与CMake一样,CPack也有生成器的概念。

CMake上下文中的生成器是用于生成本地构建脚本的工具,例如Unix Makefile或Visual Studio项目文件,

CPack上下文中的生成器是用于打包的工具。

为源包和二进制包定义了 CPACK_SOURCE_GENERATOR 和 CPACK_GENERATOR变量

cpack 和 cmake 的变量是分离开的,CPACK变量通常以 CPACK__xxx开头

get_cmake_property(res VARIABLE) 获得 CMAKE 定义的变量

基本设置

# 设置安装的 project 适用于复杂的项目
SET(CPACK_INSTALL_CMAKE_PROJECTS "SubProject;MySub;ALL;/")


# NSIS windows etc ...

# 设置忽略的文件
set(CPACK_SOURCE_IGNORE_FILES "${PROJECT_BINARY_DIR};/.git/;.gitignore")


# 设置默认安装路径

set (CPACK_PACKAGE_INSTALL_DIRECTORY "CMake
${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")

CPACK_PACKAGE_VENDOR #发行商

# 设置安装名
set (CPACK_NSIS_PACKAGE_NAME "CMake
${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")

# 设置图标
set (CPACK_NSIS_MUI_ICON
"${CMake_SOURCE_DIR}/Utilities/Release\\CMakeLogo.ico")

set (CPACK_NSIS_MUI_UNIICON
     "${CMake_SOURCE_DIR}/Utilities/Release\\CMakeLogo.ico")

# 图标
set (CPACK_PACKAGE_ICON
"${CMake_SOURCE_DIR}/Utilities/Release\\CMakeInstall.bmp")

# 创建桌面图标
set (CPACK_CREATE_DESKTOP_LINKS cmake-gui)

# 创建多个图标 到启动菜单 start menu 当安装超过多个可执行文件时

set (CPACK_PACKAGE_EXECUTABLES "cmake-gui" "CMake" ) # cmake-gui 原始名称 CMake 在 start menu 显示的名称

set (CPACK_NSIS_MENU_LINKS
"doc/cmake-${VERSION_MAJOR}.${VERSION_MINOR}/cmake-gui.html"
"cmake-gui Help" "http://www.cmake.org" "CMake Web Site")

# 设置安装目录
set (CPACK_PACKAGE_INSTALL_DIRECTORY "CMake
${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")


# 权利声明
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")

# 添加环境变量

set(CPACK_NSIS_MODIFY_PATH true) # option提供选项 添加到 path 环境变量 default off
CPACK_PROJECT_CONFIG_FILE #配置文件

configure_file ("${PROJECT_SOURCE_DIR}/MyCPackOptions.cmake.in" # 额外的配置文件
                "${PROJECT_BINARY_DIR}/MyCPackOptions.cmake"
@ONLY)


# NSIS 设置注册表
# NSIS.template.in

安装微软运行时库

include (InstallRequiredSystemLibraries)

# 默认放置到 bin , 通过下面可以修改
set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) # 关闭默认安装
include (InstallRequiredSystemLibraries)
install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}
DESTINATION mydir)

set(CMAKE_INSTALL_DEBUG_LIBRARIES true) # 可安装debug 版本库

componet 组件化安装

对于复杂的软件,通常有很多部分,可以提供一种组件化安装的方式

cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
project(MyLib)

add_library(mylib mylib.cpp)

add_executable(mylibapp mylibapp.cpp)
target_link_libraries(mylibapp mylib)

install(TARGETS mylib ARCHIVE DESTINATION lib)
install(TARGETS mylibapp RUNTIME DESTINATION bin)
install(FILES mylib.h DESTINATION include)

# add CPack to project
set(CPACK_PACKAGE_NAME "MyLib")
set(CPACK_PACKAGE_VENDOR "CMake.org")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
    "MyLib - CPack Component Installation Example")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CPack Component Example")


include(CPack)
install(TARGETS mylib
ARCHIVE
DESTINATION lib
COMPONENT libraries)

install(TARGETS mylibapp
RUNTIME
DESTINATION bin
COMPONENT applications)

install(FILES mylib.h
DESTINATION include
COMPONENT headers)

cpack_add_install_type

cpack_add_install_type(typename
                       [DISPLAY_NAME name])

设置安装类型

  • Full
  • Developer

cpack_add_component_group

设置component 组

cpack_add_component_group(groupname
                         [DISPLAY_NAME name]
                         [DESCRIPTION description]
                         [PARENT_GROUP parent]
                         [EXPANDED]
                         [BOLD_TITLE])
cpack_add_component_group(Development
EXPANDED
DESCRIPTION
"All of the tools you'll ever need to develop software")

cpack_add_component

前面两项都是为了这个命令做准备

cpack_add_component(compname
                    [DISPLAY_NAME name]
                    [DESCRIPTION description]
                    [HIDDEN | REQUIRED | DISABLED ]
                    [GROUP group]
                    [DEPENDS comp1 comp2 ... ]
                    [INSTALL_TYPES type1 type2 ... ]
                    [DOWNLOADED]
                    [ARCHIVE_FILE filename]
                    [PLIST filename])
  • DISPLAY_NAME 别名
  • DESCRIPTION 描述
  • GROUP 组
  • DEPENDS 依赖
  • INSTALL_TYPES 安装类型
cpack_add_component(applications)
cpack_add_component(libraries)
cpack_add_component(headers)

# 设置别名
cpack_add_component(applications DISPLAY_NAME "MyLib Application")
cpack_add_component(libraries DISPLAY_NAME "Libraries")
cpack_add_component(headers DISPLAY_NAME "C++ Headers")

#设置描述
cpack_add_component(applications DISPLAY_NAME "MyLib Application"
DESCRIPTION
"An extremely useful application that makes use of MyLib"
)
cpack_add_component(libraries DISPLAY_NAME "Libraries"
DESCRIPTION
"Static libraries used to build programs with MyLib"
)

cpack_add_component(headers DISPLAY_NAME "C++ Headers"
DESCRIPTION "C/C++ header files for use with MyLib"
)

设置组件依赖 防止不可用【如果依赖项不存在 就无法安装】

cpack_add_component(headers DISPLAY_NAME "C++ Headers"
DESCRIPTION
"C/C++ header files for use with MyLib"
DEPENDS libraries
)
cpack_add_component(applications
DISPLAY_NAME "MyLib Application"
DESCRIPTION
"An extremely useful application that makes use of MyLib"
GROUP Runtime)

cpack_add_component(libraries
DISPLAY_NAME "Libraries"
DESCRIPTION
"Static libraries used to build programs with MyLib"
GROUP Development)

cpack_add_component(headers
DISPLAY_NAME "C++ Headers"
DESCRIPTION "C/C++ header files for use with MyLib"
GROUP Development
DEPENDS libraries
)
cpack_add_component(libraries DISPLAY_NAME "Libraries"
DESCRIPTION
"Static libraries used to build programs with MyLib"
GROUP Development
INSTALL_TYPES Developer Full)

cpack_add_component(applications
DISPLAY_NAME "MyLib Application"
DESCRIPTION
"An extremely useful application that makes use of MyLib"
GROUP Runtime
INSTALL_TYPES Full)

cpack_add_component(headers
DISPLAY_NAME "C++ Headers"
DESCRIPTION "C/C++ header files for use with MyLib"
GROUP Development
DEPENDS libraries)

其他进阶变量

CPACK_COMPONENTS_ALL
CPACK_INSTALL_CMAKE_PROJECTS
CPACK_SYSTEM_NAME
CPACK_PACKAGE_VERSION
CPACK_TOPLEVEL_TAG
CPACK_INSTALL_COMMANDS
CPACK_INSTALL_SCRIPTS
CPACK_PRE_BUILD_SCRIPTS
CPACK_POST_BUILD_SCRIPTS
CPACK_PACKAGE_FILES
CPACK_INSTALLED_DIRECTORIES
CPACK_PACKAGE_INSTALL_REGISTRY_KEY
CPACK_CREATE_DESKTOP_LINKS
CPACK_BINARY_<GENNAME>
CPACK_READELF_EXECUTABLE
CPACK_OBJCOPY_EXECUTABLE
CPACK_OBJDUMP_EXECUTABLE

其他安装器

linux-like environment for windows

  • cygwin

Mac OS X

  • Drag and Drop
  • PackageMaker
  • X11

for debian

for rpm

cpack --help

基础实践

本节的相关代码可以从github上进行拉取后进行测试

# win 目录下
cmake -B build -S .
cmake --build build --config=Release # 打包默认release版本 否则会提示找不到

cd build
cpack.exe CPackConfig.cmake

参考

多看文档

CPack — CMake 3.29.3 Documentation

[Packaging With CPack — Mastering CMake](https://cmake.org/cmake/help/book/mastering-cmake/chapter/Packaging With CPack.html)

CPackComponent — CMake 3.29.3 Documentation

InstallRequiredSystemLibraries

标签:11,set,CMake,component,add,cpack,CPACK,Pack
From: https://www.cnblogs.com/caibucai/p/18243784

相关文章

  • 【CMake系列】10-cmake测试集成googletest与第三方库自动化构建
    cmake测试,使用ctest可能不能满足我们的需求,需要我们使用更为强大的第三方测试框架,如googletest,完成项目中的测试工作本篇文章将第三方测试框架googletest,引入,同时也可以作为关于第三方包自动化构建的很好示例,值得学习本专栏的实践代码全部放在github上,欢迎star!!!如......
  • 【CMake系列】10-cmake测试 ctest
    cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习如何借助cmake完成测试本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392......
  • 【CMake系列】09-cmake install 一般文件 文件夹 代码文件
    上一节,我们学习了项目构建后、目标的安装,本节学习的内容是对于一般文件,文件夹以及源代码的安装本节的文件依然使用file(WRITExxx.xx)来创建,不依赖额外的文件本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流文件安装CMakeLi......
  • C51学习归纳11 --- PWM原理、应用案例
        本节进入到一个更加常用的环节PWM的产生与应用,日常生活中,电机的使用非常普及,如何控制转速?其实就可以应用我的PWM。一、PWM的产生原理    PWM(PulseWidthModulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需......
  • 《UML基础、案例与应用》习题记录-第11章
    部分习题,使用visio或plantuml,非正确答案,仅供参考,欢迎评论,谢绝转载。第11章活动图11.10.2习题1.活动图 2.活动图 3.活动图,动作带钉 4.活动图 ......
  • 6.11
    上午计网实验三  综合性训练(搭建中小企业园区网)  一、实验目的: 1.通过对网络设备的连通和对拓扑的分析,加深对常见典型局域网拓扑的理解; 2.通过路由建立起网络之间的连接,了解网络路由的设计与配置;3.进一步熟悉交换机、路由器的基本操作命令。二、实验设备:六台PC,两台二......
  • 【练习代码】6.11 java学习记录:继承与多态(实例:媒体资料库的设计)
    设计一个媒体资料库,能存入不同类别的媒体资料,例如CD与DVD,并且能完成添加与列表等操作,需要些什么?最基础的想法一个代表整体库的DataBase类,内部的属性包括CD和DVD的Arraylist,对应操作通过定义自己的方法来实现,部分代码如下:publicclassDatabase{privateArrayList<CD>......
  • WIN11系统下JDK1.8保姆级别安装步骤
    一、下载安装包链接:https://pan.baidu.com/s/1KonVGsgl8u6nDpvOR84zxw?pwd=meb0 提取码:meb0 可以直接去官网下载,也可以选择我提供的百度网盘链接下载二、JDK安装过程1.双击下载好后的安装包,点击下一步2.修改安装目录,可以自己在D盘建一个文件夹3.jre的安装,点击完成......
  • 【网络编程开发】11.IO模型 12.IO多路复用
    11.IO模型什么是IO:IO是Input/Output的缩写,指的是输入和输出。在计算机当中,IO操作通常指将数据从一个设备或文件中读取到计算机内存中,或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。通常用户进程中的一个完整I/O分为两个阶段......
  • 6/11
    SparkSQL的所有语句 SparkSQL提供了一种基于结构化数据处理的高级API,它允许使用SQL或DataFrameAPI进行数据查询和分析。以下是SparkSQL中常用的语句:创建表格:使用CREATETABLE语句创建表格,可以基于现有数据源或手动定义模式。示例:CREATETABLEtableName(col......