Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用cmake pack redhat风格的rpm,这是主要的-德维尔;?_C++_Cmake_Rpmbuild - Fatal编程技术网

C++ 如何使用cmake pack redhat风格的rpm,这是主要的-德维尔;?

C++ 如何使用cmake pack redhat风格的rpm,这是主要的-德维尔;?,c++,cmake,rpmbuild,C++,Cmake,Rpmbuild,我曾尝试使用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.

我曾尝试使用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
包含/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
    )
但是现在,我只能得到
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

多亏了@Tsyvarev,我取得了一些进步。 在include(CPACK)之前添加行
set(CPACK\u RPM\u MAIN\u 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中的文件仍然错误。

最后,我完成了我的CMakeLists.txt

# CMakeLists.txt 
cmake_minimum_required (VERSION 3.12)

set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "build type")

project (foo VERSION 1.2.3 HOMEPAGE_URL "http://null")

include (GNUInstallDirs)

set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The CMake Demo Project")
set(CPACK_COMPONENTS_ALL major devel)
set(CPACK_GENERATOR RPM)
set(CPACK_RPM_PACKAGE_RELEASE 10)
set(CPACK_RPM_PACKAGE_RELEASE_DIST  ON)
set(CPACK_RPM_COMPONENT_INSTALL ON)
set(CPACK_RPM_MAIN_COMPONENT major) # Which set the major package name to foo instead of foo-major
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT") # Which makes the rpm name from foo-1.2.3-devel to foo-devel-1.2.3
set(CPACK_RPM_DEBUGINFO_PACKAGE ON)
set(CPACK_RPM_DEBUGINFO_SINGLE_PACKAGE ON)

# you must include it here after set(CPACK...) and befor cpack_add_... 
include (CPack) 

cpack_add_component(major DESCRIPTION "Something for demo")
cpack_add_component(devel DESCRIPTION "For 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)

set(PUBLIC_HEADERS foo.h)

install (TARGETS demo foo
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    COMPONENT major
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    COMPONENT major
    NAMELINK_COMPONENT devel # Which separate libfoo.so into foo-devel rpm, but it requires cmake-3.12, RHEL-8 takes 3.11.
    )
install (FILES ${PUBLIC_HEADERS}
    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
    COMPONENT devel
    )
install (FILES README.md
    DESTINATION ${CMAKE_INSTALL_DOCDIR}-${PROJECT_VERSION}
    COMPONENT devel
    )
使用cmake-3.11的RHEL-8解决方案:

# install libfoo.so.1.2.3 and libfoo.so.1
install (TARGETS foo
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    COMPONENT major
    NAMELINK_SKIP
    )
# install libfoo.so
install (TARGETS foo
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    COMPONENT devel
    NAMELINK_ONLY
    )


多亏了all

您可能正在寻找
CPACK\u RPM\u MAIN\u COMPONENT
变量,该变量可以分配给组件的名称,无需为其创建文件后缀。有关更多信息,请参阅。这听起来不错。在运行时,大多数应用程序只会查找libfoo.so,它可能是指向foo.major的符号链接,也可能是指向foo.major.minor的链接。开发人员唯一不同的是头文件。我还看到了
-devel
-static
包中的静态版本。@AaronD.Marasco:no.libfoo.so仅用于构建,如标题。libfoo.so.major是运行时需要的。OP的描述是正确的。