【问题标题】:set CMAKE_INSTALL_PREFIX when using cpack使用 cpack 时设置 CMAKE_INSTALL_PREFIX
【发布时间】:2021-07-06 23:56:01
【问题描述】:

我正在尝试使用 cpack 创建一个 rpm。创建本身没问题,但我无法使安装路径正确。

在我的 CMakeLists.txt 中

cmake_minimum_required(VERSION 3.17)

project(ProjectName VERSION 1.2.3)

include(GNUInstallDirs) # << Here I use GNUInstallDirs for canonical install dir on linux

set(CMAKE_BUILD_TYPE RelWithDebInfo)

# next is just generating dummy code so that this example is standalone
add_custom_command(VERBATIM COMMAND_EXPAND_LISTS
                  COMMAND echo "int f(void) { return 0\; }" > ${CMAKE_BINARY_DIR}/dummy.cpp
                  COMMAND echo "dummy config" > ${CMAKE_BINARY_DIR}/config.ini
                  OUTPUT ${CMAKE_BINARY_DIR}/dummy.cpp ${CMAKE_BINARY_DIR}/config.ini)
add_custom_target(gen
                 DEPENDS ${CMAKE_BINARY_DIR}/dummy.cpp ${CMAKE_BINARY_DIR}/config.ini
                 OUTPUT ${CMAKE_BINARY_DIR}/dummy.cpp ${CMAKE_BINARY_DIR}/config.ini)

add_library(dummy SHARED ${CMAKE_BINARY_DIR}/dummy.cpp)

set_target_properties(dummy  PROPERTIES
        VERSION "4"
        SOVERSION "4.1.2")

install(TARGETS dummy EXPORT MyLibraryConfig
    LIBRARY  DESTINATION ${CMAKE_INSTALL_LIBDIR})

install(FILES ${CMAKE_BINARY_DIR}/config.ini DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
install(EXPORT MyLibraryConfig DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/MyLibrary/cmake)

include(cpack)

正如在代码中强调的那样,我使用 GNUInstallDirs 在 linux 上正确安装了东西,即,当前缀为 //usr 时,配置内容进入 /etc/usr/lib 中的库,当前缀是任何东西时否则,比如说 /X,他们会进入 /X/etc//X/lib/

在进行 make install 时可以正常工作。

但是我真的不知道在调用 cpack 时如何将 CMAKE_INSTALL_PREFIX 设置为 / 或 /usr,当它内部调用 cmake 时,它​​似乎永远保留在 /usr/local(默认值)命令,尽管我已经完成了测试:

CPACK_INSTALL_PREFIX 
CPACK_PACKAGING_PREFIX        
CPACK_PACKAGING_INSTALL_PREFIX 
CMAKE_INSTALL_PREFIX         
CPACK_INSTALL_PREFIX        
CPACK_PACKAGE_INSTALL_DIRECTORY 
CPACK_PACKAGING_INSTALL_PREFIX 
CPACK_NATIVE_INSTALL_DIRECTORY 

还搞砸了CPACK_SET_DESTDIR

我从来没有得到一个包含正确树的 rpm...我有点困惑。

我的命令是:

cmake . # generates the cpack stuff
cpack -G RPM # creates the rpm
rpm -q -l ProjectName-1.2.3-Linux.rpm # to check rpm content

我得到:

/usr/etc
/usr/etc/config.ini
/usr/lib/.build-id
/usr/lib/.build-id/f0
/usr/lib/.build-id/f0/9b19950e7734825f8d307f7835a8cc0e45c050
/usr/usr
/usr/usr/lib64
/usr/usr/lib64/libdummy.so
/usr/usr/lib64/libdummy.so.4
/usr/usr/lib64/libdummy.so.4.1.2
/usr/usr/share
/usr/usr/share/MyLibrary
/usr/usr/share/MyLibrary/cmake
/usr/usr/share/MyLibrary/cmake/MyLibraryConfig-relwithdebinfo.cmake
/usr/usr/share/MyLibrary/cmake/MyLibraryConfig.cmake

您可能会注意到这里的前缀似乎是 usr,但实际上它从未传递给 cmake 调用(我在调试时放了一些打印消息以确保它)

那我做错了什么?我有办法吗?

【问题讨论】:

    标签: cmake cpack


    【解决方案1】:

    原来 rpm 生成不会编译任何东西。在生成器使用的 .spec 文件中(在日志中给出)它实际上被发现:

    # This is a shortcutted spec file generated by CMake RPM generator
    # we skip _install step because CPack does that for us.
    # We do only save CPack installed tree in _prepr
    # and then restore it in build.
    %prep
    mv $RPM_BUILD_ROOT %_topdir/tmpBBroot
    

    所以此时没有编译,它只是将本地目录构建的内容放入包中,这里,prefix的默认值是因为我没有设置任何CMAKE_INSTALL_PREFIX,认为rp​​m生成会重建所有内容从头开始。

    所以第一个解决方案是调用

    cmake -DCMAKE_INSTALL_PREFIX=/ . before calling cpack.
    

    第二种解决方案(我认为更好)是生成一个 src.rpm 并从这个源 rpm 构建 .rpm。我认为这更好,因为它可以用来在 centos 的任何其他更新中重新生成 rpm。

    所以我补充说:

    set(CPACK_RPM_SOURCE_PKG_BUILD_PARAMS -DCMAKE_INSTALL_PREFIX=/)
    

    到 CMakeLists.txt

    然后创建了 src.rpm 做

    cmake -DCPACK_RPM_PACKAGE_SOURCES=ON . && cpack -G RPM  --config CPackSourceConfig.cmake
    

    然后我得到一个 projectname-1.2.3-1.src.rpm,我可以在其上调用 rpmbuild:

    rpmbuild --rebuild projectname-1.2.3-1.src.rpm
    

    它生成了一个包含正确路径的二进制文件的 rpm:

    $ rpm -ql ProjectName-1.2.3-Linux.rpm 
    /etc/config.ini
    /usr/lib/.build-id
    /usr/lib/.build-id/7e
    /usr/lib/.build-id/7e/045303c53b44d5592555b4703b9783eaeb8f83
    /usr/lib64/libdummy.so
    /usr/lib64/libdummy.so.4
    /usr/lib64/libdummy.so.4.1.2
    /usr/share/MyLibrary
    /usr/share/MyLibrary/cmake
    /usr/share/MyLibrary/cmake/MyLibraryConfig-relwithdebinfo.cmake
    /usr/share/MyLibrary/cmake/MyLibraryConfig.cmake
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多