cpack介绍及打deb包方法

cpack介绍

CPack 是 CMake 的一个组件,用于创建软件包。它可以将 CMake 项目打包为各种不同的软件包格式,例如 ZIP、TGZ、RPM、DEB 等。CPack 可以自动检测您的系统,并根据您的系统自动选择适当的软件包格式。CPack 还提供了许多选项,以便您可以自定义软件包的生成过程。

CPack 可以与 CMake 无缝集成,因此您可以使用 CMake 的语法来指定要包含在软件包中的文件、目录和其他资源。您可以使用 CMake 的变量和函数来指定软件包的元数据,例如软件包名称、版本、描述等。CPack 还提供了许多选项,以便您可以自定义软件包的生成过程。

CPack 支持许多不同的软件包格式,包括 ZIP、TGZ、RPM、DEB、NSIS、InnoSetup 等。CPack 还支持自定义软件包格式,因此您可以根据需要创建自己的软件包格式。

cpack基本语法

  • 设置打包完后,包存放的路径(这个路径是相对于打包的机器)
set(CPACK_PACKAGE_DIRECTORY ${CMAKE_SOURCE_DIR}/build/packages)
  • 设置依赖项,可根据选择是否开启,并可以控制依赖包的版本
option(DEPEND_ACE "depend ace" ON)
if(DEPEND_ACE)
    set(CPACK_DEBIAN_PACKAGE_DEPENDS "libace-dev(>=7.0)")
endif()
  • 设置要打包的文件夹相对于安装该包的机器的路径,并设置文件夹和文件的权限(例如某机器执行apt install安装该包,这里设置的路径是根据安装的机器的,设置的权限也是基于该机器的)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/scripts
        DESTINATION /test
        DIRECTORY_PERMISSIONS
            OWNER_READ OWNER_WRITE OWNER_EXECUTE
            GROUP_READ GROUP_EXECUTE
            WORLD_READ WORLD_EXECUTE
        FILE_PERMISSIONS
            OWNER_READ OWNER_WRITE OWNER_EXECUTE
            GROUP_READ GROUP_EXECUTE
            WORLD_READ WORLD_EXECUTE
)
  • 设置二进制、静态库、动态库的安装路径
INSTALL(TARGETS myrun mylib mystaticlib
     RUNTIME DESTINATION bin
     LIBRARY DESTINATION lib
     ARCHIVE DESTINATION libstatic
    )

可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

  • 设置可执行程序的安装路径
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/control DESTINATION opt/omatrix/bin)

control安装到/opt/omatrix/bin

  • 指定安装软件包之后执行的脚本(脚本存放位置基于打包的机器,里面的内容基于安装包的机器)
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/scripts/postinst")

总共有四种脚本:preinst(安装前执行), postinst(安装后执行), prerm(删除前执行), postrm(删除后执行)
还要注意的就是这些脚本的权限问题,不要使用chmod u+x来赋权限,最好使用chmod 0777
这里脚本的内容不能执行有关apt install等命令,在测试过程中发现会造成死锁

  • 在安装的时候执行一些shell命令(基于安装包的机器)
install(CODE "EXECUTE_PROCESS(COMMAND cp -r /opt/omatrix/lib ${CMAKE_SOURCE_DIR})")
install(CODE "execute_process(COMMAND rm -rf ${CMAKE_SOURCE_DIR}/lib/.svn ${CMAKE_SOURCE_DIR}/lib/capture/.svn)")
  • 设置包的维护者信息
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "cdy <[email protected]>")
  • 设置包的名称、版本、包的类型
set(CPACK_PACKAGE_NAME "ems")
set(CPACK_PACKAGE_VERSION "1.0.0") 
set(CPACK_GENERATOR "DEB") 
  • 这一句放在CMakeLists.txt文件最后,不能少
include(CPack)

猜你喜欢

转载自blog.csdn.net/QAZ600888/article/details/130922228
今日推荐