CMake安装/CPack问题:不正确的权限和错误的可执行文件



我目前正在处理一个使用CMake构建的项目;随后将其与CPack一起封装成RPM。

以下内容被打包到RPM中:

  1. 几个可执行文件
  2. 配置文件

更多上下文:

  1. 这个项目使用OpenMPI运行,有X个节点数量,这取决于用户输入和基于用户指定的节点数量,产生X个docker容器
  2. 每个可执行文件都有实例在每个容器上串联运行
  3. OpenMPI崩溃,没有GDB很难调试
  4. 可执行文件已编译为版本。但是,如果我想使调试成为可能,我已经将CMake项目编译为Debug
  5. 可执行文件被创建为Debug。制作包时,我打开了VERBOSE=1标志,并且可以确认-g标记存在,并且可执行文件在本地加载到GDB时具有调试符号

CMakeLists.txt中的一些行:

# Bunch of compilation lines above
install(TARGETS executable_1 executable_2 executable_3 DESTINATION bin) # Installs the executables into a local bin dir
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_INSTALL_PREFIX /usr)
install(DIRECTORY bin/ DESTINATION /usr/bin)
install(DIRECTORY config/ DESTINATION /etc/PROJECT_NAME FILES_MATCHING PATTERN "*")
# Making of the package
set(CPACK_PACKAGE_NAME "PROJECT_NAME")
set(CPACK_PACKAGE_VERSION 0.1)
set(CPACK_PACKAGE_RELEASE 1)
set(CPACK_GENERATOR "RPM")
set(CPACK_PACKAGE_VENDOR "ME")
set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${CMAKE_SYSTEM_PROCESSOR}")
set(CPACK_RPM_PACKAGE_AUTOREQ 0)
set(CPACK_RPM_PACKAGE_RELOCATABLE True)
include(CPack)

问题:

  1. 当CPack正在做它的事情并创建RPM时,可执行文件可以打包到RPM中,但问题是它们有不适当的权限;也就是说,当可执行文件安装在Containers上时,它们就无法执行。我可以通过添加以下内容来解决此问题:

    # Bunch of compilation lines above
    install(TARGETS executable_1 executable_2 executable_3 DESTINATION bin) # Installs the executables into a local bin dir
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    set(CMAKE_INSTALL_PREFIX /usr)
    # Permissions Fix
    set(PROGRAM_PERMISSIONS_DEFAULT
    OWNER_WRITE OWNER_READ OWNER_EXECUTE
    GROUP_READ GROUP_EXECUTE
    WORLD_READ WORLD_EXECUTE)
    install(DIRECTORY bin/ PERMISSIONS ${PROGRAM_PERMISSIONS_DEFAULT} DESTINATION /usr/bin)
    install(DIRECTORY config/ DESTINATION /etc/PROJECT_NAME FILES_MATCHING PATTERN "*")
    # Making of the package
    set(CPACK_PACKAGE_NAME "PROJECT_NAME")
    set(CPACK_PACKAGE_VERSION 0.1)
    set(CPACK_PACKAGE_RELEASE 1)
    set(CPACK_GENERATOR "RPM")
    set(CPACK_PACKAGE_VENDOR "ME")
    set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
    set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${CMAKE_SYSTEM_PROCESSOR}")
    set(CPACK_RPM_PACKAGE_AUTOREQ 0)
    set(CPACK_RPM_PACKAGE_RELOCATABLE True)
    include(CPack)
    
  2. 添加权限后,权限是固定的,但由于某种原因,复制的可执行文件不再具有调试符号;bin//strong>文件夹中的本地可执行文件是具有符号的适当可执行文件,但打包到RPM DOT中的可执行文件没有调试符号。这意味着一路上的某个地方,发生了一些非常奇怪的事情。

我的问题是,为什么?无论哪种方式都会导致不同的问题。我想知道是否有一种方法可以确保权限是正确的,并且将正确的可执行文件复制并打包到RPM中。任何建议都将不胜感激。

谢谢!

如果可以避免的话,不要使用绝对安装目标,也不要读取CMAKE_INSTALL_PREFIX。使用绝对安装目的地(可能通过使用CMAKE_INSTALL_PREFIX间接地(会迫使您以允许进程修改这些绝对路径的权限运行install目标。这通常意味着您必须使用sudo来运行安装目标,即使在安装到标准用户拥有的目录时也是如此。

由于运行cpack需要运行安装目标,安装前缀替换为构建目录中的目录(基本上是cmake --install ... --prefix ...(,因此如果使用相对安装位置,则可以避免对root权限的需要。

我更喜欢这里的安装逻辑是:

# allow the installation into any directory below the file system root
set(CMAKE_INSTALL_PREFIX /)
# set the default executable install location, see https://cmake.org/cmake/help/latest/command/install.html#installing-targets
# Note: could be set "globally", i.e. from the toplevel CMakeLists.txt allowing installation of individual targets
set(CMAKE_INSTALL_BINDIR usr/bin)
install(TARGETS executable_1 executable_2 executable_3 RUNTIME)
#preferrably replace this with install(FILES ... TYPE BIN) to install individual files
set(PROGRAM_PERMISSIONS_DEFAULT
OWNER_WRITE OWNER_READ OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
install(DIRECTORY bin/ PERMISSIONS ${PROGRAM_PERMISSIONS_DEFAULT} DESTINATION usr/bin)
# preferrably replace this with install(FILES ... TYPE SYSCONFIG)
install(DIRECTORY config/ DESTINATION etc/PROJECT_NAME FILES_MATCHING PATTERN "*")
# Making of the package
...

我假设在您的场景中,您在cmake构建/安装/包过程中获得了不正确的文件权限。

最新更新