我正在尝试使用创建多个RPM文件的cpack(通过cmake)创建RPM安装程序。我几乎得到了它的工作,但最后一个绊脚石是控制包名。 具体来说,我想控制组件名称在RPM文件名中的显示位置。
以下是我的实验CMakeLists.txt
文件,该文件将foo.txt
和bar.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)
未记录在条形码包中。
我已经为cmake here添加了错误报告,但我认为CPACK_RPM _ <component>
_ PACKAGE_FILE_NAME的实施存在错误。至少文档没有足够的帮助。
答案 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_NAME
或CPACK_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。我们随时欢迎对文件的贡献:)