更改cpack为组件RPM生成的名称

时间:2017-07-26 16:17:37

标签: cmake rpm cpack

我正在尝试使用创建多个RPM文件的cpack(通过cmake)创建RPM安装程序。我几乎得到了它的工作,但最后一个绊脚石是控制包名。 具体来说,我想控制组件名称在RPM文件名中的显示位置

以下是我的实验CMakeLists.txt文件,该文件将foo.txtbar.txt安装到两个不同的软件包" myproject-foo" &安培; " myproject的杆&#34 ;. 我希望RPM遵循我自己的命名约定(实际上我想要更加FSH友好的约定)但由于某种原因cmake坚持在最后添加组件名称。所以我得到了:

myproject-comp-1.0.i686-foo.rpm
myproject-comp-1.0.i686-bar.rpm

而不是:

myproject-compfoo-1.0.i686.rpm
myproject-compbar-1.0.i686.rpm

我注意到它命名了源RPM"更正确": E.g。

>rpm -qip <package> | grep source
Source RPM  : myproject-foo-1.0-1.src.rpm

虽然我根本不想要源RPM(有没有办法让这个字段空白?)

cmake_minimum_required(VERSION 2.8)

message("CMAKE_VERSION=${CMAKE_VERSION}")

SET(DOCDIR "doc")
set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME "core")
install(FILES foo.txt COMPONENT foo DESTINATION "${RPMBUILDROOT}${DOCDIR}")
install(FILES bar.txt COMPONENT bar DESTINATION "${RPMBUILDROOT}${DOCDIR}")

project(myproject CXX)

set(CPACK_PACKAGE_NAME "myproject")
set(CPACK_RPM_COMPONENT_INSTALL ON)
set(CPACK_PACKAGE_VERSION 1.0)
set(CPACK_PACKAGE_VENDOR "some org")

set(CPACK_COMPONENT_foo_DESCRIPTION "the foo component")
set(CPACK_COMPONENT_bar_DESCRIPTION "the bar component")

# mentioned in cpack docs but doesn't seem to do anything here
set(CPACK_COMPONENT_foo_DISPLAY_NAME "foo display name?")
set(CPACK_COMPONENT_bar_DISPLAY_NAME "foo display name?")

set(CPACK_COMPONENT_bar_DEPENDS foo)

set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "describe the complete suite of stuff")
set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_SOURCE_DIR}/README.txt)

# added in cmake 3.6?
set(CPACK_RPM_foo_PACKAGE_SUMMARY "describe the foo package")
set(CPACK_RPM_bar_PACKAGE_SUMMARY "describe the bar package")
set(CPACK_RPM_foo_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-foo")
set(CPACK_RPM_bar_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-bar")

set(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_SOURCE_DIR}/README.txt)

#set(CPACK_RPM_foo_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-foo-${CPACK_PACKAGE_VERSION}.i686")
#set(CPACK_RPM_bar_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-bar-${CPACK_PACKAGE_VERSION}.i686")


set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-comp${CPACK_COMPONENT_DISPLAY_NAME}-${CPACK_PACKAGE_VERSION}.i686")

set(CPACK_RPM_PACKAGE_ARCHITECTURE "i686")
set(CPACK_RPM_PACKAGE_RELOCATABLE TRUE)

include(CPack)

cpack_add_component(foo
                    DISPLAY_NAME foo comp
                    DESCRIPTION this is the foocomp)
cpack_add_component(bar
                    DISPLAY_NAME bar comp
                    DESCRIPTION this is the bar comp
            DEPENDS foo)

CPACK_PACKAGE_<component>_FILE_NAME or CPACK_PACKAGE_FILE_NAME似乎不太合适。 我已尝试使用cmake 3.4.3和最新版本(撰写本文时为3.9.0),因为有一些建议fixes to component based installs in 3.6.0

CPACK_COMPONENT_DISPLAY_NAME中没有CPACK_PACKAGE_FILE_NAME我使用过的变量。 cmake中的内容也会自动将组件名称添加到结尾。

很久以前.deb包有一个类似的问题here,但如果可能的话,我宁愿避免这么复杂的解决方案。 生成后重命名包会更容易(但仍然感到hacky)。

我还注意到包依赖项set(CPACK_COMPONENT_bar_DEPENDS foo)未记录在条形码包中。

更新:2017年8月1日

我已经为cmake here添加了错误报告,但我认为CPACK_RPM _ <component> _ PACKAGE_FILE_NAME的实施存在错误。至少文档没有足够的帮助。

1 个答案:

答案 0 :(得分:2)

首先,文档顶部有一个大注:

  

请注意

     

部分变量优选为大写(例如,如果组件名为foo,则使用CPACK_RPM_FOO_XXXX变量名称格式),与其他CPACK__XXXX变量一样。出于后向兼容性的目的(CMake / CPack版本3.5及更低版本),对于旧版本的CMake / CPack中定义的变量,仍支持相同的套管组件(例如,fOo将用作CPACK_RPM_fOo_XXXX),但不保证将用于将来添加。为了兼容兼容性,相同的套管组件变量也会覆盖两者都存在的大型套管版本。

因此,如果你有一个名为foo,FOO,fOo ......的组件变量是CPACK_RPM_FOO _...否则变量将被忽略 - 注意这是因为CPack存在于公共组件变量的开始,例如CPACK_COMPONENT_foo_DESCRIPTION&lt; - foo part必须为大写。

在文件名旁边 - 在CPack 3.6之前,如果没有出现错误并且必须手动复制生成的包,则无法更改文件名。从该版本开始,您可以根据需要设置文件名,或者通过将CPACK_RPM_FILE_NAMECPACK_RPM_<component>_FILE_NAME设置为RPM-DEFAULT来请求特定于平台的软件包名称(由rpm安装定义)。见https://cmake.org/cmake/help/v3.6/module/CPackRPM.html?highlight=cpack_rpm_file_name#variable:CPACK_RPM_FILE_NAME

同样set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-comp${CPACK_COMPONENT_DISPLAY_NAME}-${CPACK_PACKAGE_VERSION}.i686")无法正常工作,因为${CPACK_COMPONENT_DISPLAY_NAME}不是锚点,会自动替换在该位置 - 不是由您设置的,因此替换文字是空字符串...所以如果你真的想要要手动设置名称,您应该为每个组件设置RPM包装器相当于该变量CPACK_RPM_<component>_FILE_NAME(因此您需要一个for循环或更多的复制粘贴...) - 请注意,如文档名称必须以.rpm结尾,默认值为(从文档中复制)<CPACK_PACKAGE_FILE_NAME>[-<component>].rpm,因此这就解释了为什么组件部分总是放在最后。

这里有不同的CPack打包器测试:https://github.com/Kitware/CMake/tree/master/Tests/RunCMake/CPack/tests 所以你也可以探索这些片段。

P.S。我们随时欢迎对文件的贡献:)