CPack 尝试构建所有目标

Posted

技术标签:

【中文标题】CPack 尝试构建所有目标【英文标题】:CPack tries to build all targets 【发布时间】:2016-04-18 09:21:47 【问题描述】:

我有一个CMake 项目,由一个根CMakeLists 和多个子CMakeLists(每个项目一个)组成。

我正在尝试使用CPack 为其中一个项目(APP_client)生成一个 .deb 文件。 然而,当我尝试运行CPack 时,它首先运行“预安装”并尝试构建所有目标。 我只想构建所需的目标及其依赖项。

这是我添加到我的CMakeLists 之一的内容:

if(UNIX)
    INSTALL(
        TARGETS $PROJECT_NAME 
        COMPONENT $PROJECT_NAME
        DESTINATION $PROJECT_INSTALL_PATH
        )

    SET(CPACK_PACKAGE_DIRECTORY $CMAKE_BINARY_DIR/../deb)
    SET(CPACK_GENERATOR "DEB")
    SET(CPACK_PACKAGE_NAME $PROJECT_NAME)
    SET(CPACK_PACKAGE_FILE_NAME $PROJECT_NAME-$PROJECT_version)
    SET(CPACK_DEBIAN_PACKAGE_NAME $PROJECT_NAME)
    SET(CPACK_DEBIAN_PACKAGE_VERSION $PROJECT_version)

    INCLUDE(CPack)
endif()

这是我尝试运行cpack -V时得到的结果

CPack: Enable Verbose
CPack Verbose: Read CPack config file: 
CPack Verbose: Read CPack configuration file: [...]/CPackConfig.cmake
CPack Verbose: Specified generator: DEB
CPack Verbose: Use generator: cmCPackDebGenerator
CPack Verbose: For project: APP_client
CPack: Create package using DEB
CPack Verbose: Read description file: [...]/CPack.GenericDescription.txt
CPack Verbose: [DEB] requested component grouping = ONE_PER_GROUP
CPack Verbose: Remove toplevel directory: [...]/../deb/APP_client/_CPack_Packages/Linux/DEB
CPack: Install projects
CPack: - Run preinstall target for: ROOT
CPack Error: Problem running install command: /home/gitlab-runner/cmake/bin/cmake --build . --target "preinstall"
Please check [...]/../deb/APP_client/_CPack_Packages/Linux/DEB/PreinstallOutput.log for errors
CPack Error: Error when generating package: APP_client

预安装失败,因为它正在尝试构建另一个目标并且无法链接它。

我正在使用CMake 3.5

【问题讨论】:

install() 的 CMake 目标不携带来自 add_executable/add_library 调用的类似 make 的依赖项。因此,即使 CPack 只需要准备部分先决条件,它也会无条件地构建所有目标。您应该调整(例如,使用选项变量)您的 CMake 项目以构建较少数量的目标。 【参考方案1】:

对于每个用户here,可以通过向 CPack 谎报您使用的 CMake 生成器来解决此问题。

似乎 CPack 只为使用 Unix Makefiles 作为 CMake 生成器的构建运行预安装目标。将变量 CPACK_CMAKE_GENERATOR 设置为系统上可用的不同生成器将改变 CPack 的行为,但 CMake 仍将使用指定的生成器进行构建。

链接线程中的用户似乎很幸运地将 XCode 指定为 CPack CMake 生成器,并且我已经成功指定了 Ninja。

例如,您可以尝试添加如下行 set(CPACK_CMAKE_GENERATOR Ninja) 这样 CPack 就不会尝试运行预安装目标。

【讨论】:

或者你可以为CMake设置非Unix Makefiles生成器(-G),然后CPack会使用同一个生成器。无论哪种方式,我都测试了NinjaXcodeVisual Studio 16 2019——所有这些生成器都没有运行预安装(如果你还没有构建你想要打包的目标也会失败,即合乎逻辑的),所以看起来这个预安装的东西是特定于Unix Makefiles的。

以上是关于CPack 尝试构建所有目标的主要内容,如果未能解决你的问题,请参考以下文章

如何跳过对包目标的所有依赖?

有没有办法让自定义目标依赖于 CPack? [复制]

防止 cmake 运行 cpack

使用 cmake 或 cpack 编辑 .bat

如何在 xcode 中快速取消选择除您想要的构建目标之外的所有构建目标

如何在 CMake 中构建过程后复制目标的所有运行时依赖项?