【发布时间】:2020-03-22 23:41:35
【问题描述】:
我曾尝试使用 cmake 来打包 redhat 风格的 rpm。
经典的 RedHat 风格的 rpm 由 2 个 rpm 组成,一个是 package-version.rpm,另一个是 package-devel-version.rpm。但我失败了。
例如项目foo,其中包含
- bin/demo
- lib/libfoo.so.1.2.3
- lib/libfoo.so.1
- lib/libfoo.so
- include/foo.h
我希望foo-1.2.3.rpm 包含bin/demo、lib/libfoo.so.1、lib/libfoo.so.1.2.3 和foo-devel-1.2.3.rpm 包含lib/libfoo.so、include/foo.h。
但现在,我只能得到foo-1.2.3-major.rpm(bin/demo,lib/libfoo.so,lib/libfoo.so.1,lib/libfoo.so.1.2.3)和foo-1.2.3-devel.rpm(include/foo.h)。
# CMakeLists.txt
project (foo)
include (GNUInstallDirs)
set(CPACK_PACKAGE_VERSION_MAJOR 1)
set(CPACK_PACKAGE_VERSION_MINOR 2)
set(CPACK_PACKAGE_VERSION_PATCH 3)
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The CMake Demo Project")
set(CPACK_GENERATOR RPM)
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
set(CPACK_RPM_COMPONENT_INSTALL ON)
set(CPACK_COMPONENTS_ALL major devel)
include (CPackComponent)
include (CPack)
cpack_add_component(major DISPLAY_NAME Major)
cpack_add_component(devel DISPLAY_NAME Development)
add_executable (demo demo.cxx)
add_library (foo SHARED foo.cxx foo.h)
set_target_properties(foo PROPERTIES VERSION 1.2.3 SOVERSION 1)
install (TARGETS demo foo
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT major
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
COMPONENT major
)
install (FILES foo.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
COMPONENT devel
)
感谢@Tsyvarev,我取得了一些进展。
在include(CPack) 之前添加行set(CPACK_RPM_MAIN_COMPONENT major),我得到以下结果。 rpm 名称 foo-1.2.3.rpm 现在是正确的。
]$ rpm -ql --qf "%{name}-%{version}\n" -p foo-1.2.3-devel.rpm
foo-devel-1.2.3
/usr/include/foo.h
]$ rpm -ql --qf "%{name}-%{version}\n" -p foo-1.2.3.rpm
foo-1.2.3
/usr/bin/demo
/usr/lib64/libfoo.so
/usr/lib64/libfoo.so.1
/usr/lib64/libfoo.so.1.2.3
但是foo-1.2.3-devel.rpm的文件名还是不对,rpm里面的文件还是不对。
【问题讨论】:
-
您可能正在寻找
CPACK_RPM_MAIN_COMPONENT变量,它可以分配给组件的名称,无需为其创建文件后缀。请参阅CPackRPM documentation 了解更多信息。 -
这听起来不错。在运行时,大多数应用程序只会查找 libfoo.so,它可能是指向 foo.major 的符号链接,并且是指向 foo.major.minor 的链接。对开发人员来说唯一不同的是头文件。我还在
-devel或-static包中看到了静态版本。 -
@AaronD.Marasco:没有。 libfoo.so 仅用于构建,例如标题。 libfoo.so.major 是您在运行时需要的。 OP描述是对的。