【问题标题】:How to build a "file copy" RPM using cmake?如何使用 cmake 构建“文件副本”RPM?
【发布时间】:2016-10-02 05:26:50
【问题描述】:

我想构建一个演示 rpm 包,它将一个文件复制到目标系统并执行一些 pre 和 post 脚本。 我设法创建了一个包。当我在目标系统上运行包时,我收到了 e 警告“警告:包 xxx 打算用于 yyy 平台”。但是没有文件被复制。 有任何想法吗? 在我的代码/项目之后:

项目树:

myRpm/CMakeLists.txt
myRpm/install.txt
myRpm/post.py
myRpm/post.sh
myRpm/pre.py
myRpm/pre.sh

CMakeLists:

cmake_minimum_required (VERSION 2.8)
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
    INCLUDE(InstallRequiredSystemLibraries)
    set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1)
    set(CPACK_PACKAGE_NAME "my test")
    set(CPACK_PACKAGE_VENDOR "tets")
    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fake rpm")
    set(CPACK_PACKAGE_VERSION "6.6.6")
    set(CPACK_PACKAGE_VERSION_MAJOR "6")
    set(CPACK_PACKAGE_VERSION_MINOR "6")
    set(CPACK_PACKAGE_VERSION_PATCH "6")
    set(targetDestDir "myDir")
    set(CPACK_GENERATOR "RPM")
    install(
        FILES "${CMAKE_CURRENT_SOURCE_DIR}/install.txt" "${CMAKE_CURRENT_SOURCE_DIR}/pre.py" "${CMAKE_CURRENT_SOURCE_DIR}/post.py"
        DESTINATION "${targetDestDir}"
    )
    set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/pre.sh")
    set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/post.sh")
    include(CPack)
endif()

【问题讨论】:

  • 您使用哪台 host 机器(您构建项目并打包它的地方)和 target 机器(您提取包的地方)? (架构、操作系统)。
  • 我在虚拟机中运行的 Debian 上构建 rpm。目标是一个ARM系统。它是在 Yocto 工具链的帮助下构建的。
  • @ARM: Linux sama5d3xek 4.1.0-linux4sam_5.3-00046-g19291d7 #1 Wed Jun 1 16:17:37 CEST 2016 armv7l GNU/Linux(由 uname -a 提供)
  • @VM: Linux Dev 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux(由 uname -a 提供)
  • 似乎我必须将“CPACK_RPM_PACKAGE_ARCHITECTURE”设置为“noarch”。不是default设置的

标签: cmake rpm rpmbuild cpack


【解决方案1】:

在为其他系统/发行版构建 RPM 时,CPACK_RPM_PACKAGE_ARCHITECTURE 的值很重要。 以下代码应该可以工作:

cmake_minimum_required (VERSION 2.8)
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
    INCLUDE(InstallRequiredSystemLibraries)
    set(CMAKE_INSTALL_TMPDIR /tmp CACHE PATH "Output dir for tmp")
    set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1)
    set(CPACK_PACKAGE_NAME "mytest")
    set(CPACK_PACKAGE_VENDOR "tets")
    set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fake rpm")
    set(CPACK_PACKAGE_VERSION "6.6.6")
    set(CPACK_PACKAGE_VERSION_MAJOR "6")
    set(CPACK_PACKAGE_VERSION_MINOR "6")
    set(CPACK_PACKAGE_VERSION_PATCH "6")
    set(CPACK_GENERATOR "RPM")
    set(CPACK_RPM_PACKAGE_ARCHITECTURE "noarch")
    set(targetDestDir ${CMAKE_INSTALL_TMPDIR})
    install(
        FILES "${CMAKE_CURRENT_SOURCE_DIR}/install.txt" "${CMAKE_CURRENT_SOURCE_DIR}/post.py"
        DESTINATION "${targetDestDir}"
    )
    set(CPACK_RPM_PRE_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/pre.sh")
    set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/post.sh")
    include(CPack)
endif()

注意: pre.sh 和 post.sh 位于源的根目录中。在 post.sh 中调用了 post.py。

【讨论】:

    猜你喜欢
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多