如何检查在CMake中是否已经调用了include(CPack)?

如何检查在CMake中是否已经调用了include(CPack)?,cmake,cpack,Cmake,Cpack,我正在从事一个使用第三方源代码作为子模块的项目。在CMakeLists.txt的第三方源代码中,他们的CMakeLists.txt中有include(CPack),这会导致问题,因为当我在项目的CMakeLists.txt中编写自己的include(CPack)时,我会收到如下的cmake配置警告 CPack.cmake has already been included!! 我编写的所有CPack变量都被第三方源代码覆盖,这在我运行makepackage 我尝试了add_子目录(第三方源代码

我正在从事一个使用第三方源代码作为子模块的项目。在CMakeLists.txt的第三方源代码中,他们的CMakeLists.txt中有
include(CPack)
,这会导致问题,因为当我在项目的CMakeLists.txt中编写自己的
include(CPack)
时,我会收到如下的cmake配置警告

CPack.cmake has already been included!!
我编写的所有CPack变量都被第三方源代码覆盖,这在我运行
makepackage

我尝试了
add_子目录(第三方源代码从_ALL中排除_)
,它忽略了第三方源代码中的所有
install
调用,但不幸的是它没有忽略CPack调用

有没有办法让我添加类似的内容

if(CPACK_ALREADY_INCLUDED)
  include(CPack)
endif()

在第三方来源中,要解决这个问题?

覆盖第三方的不当行为从来都不容易。这就是为什么我个人不喜欢
add_子目录
,而是更喜欢使用
vcpkg
或其他构建编排工具(如Conan)

但是,以下代码段应该可以工作:

function (add_third_party)
  # Write an empty CPack module
  file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/override/CPack.cmake" "")
  set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_BINARY_DIR}/override;${CMAKE_MODULE_PATH}")
  add_subdirectory(third-party-source)
endfunction ()

add_third_party()
这将创建一个空白的CPack模块,并诱使第三方代码包含它而不是标准模块。该函数的存在是为了确保此重写行为不会泄漏到构建的其余部分


我误解了你的问题。我以为你控制了包括
CPack
在内的项目


是的,变量名为
CPack\u CMake\u INCLUDED
。但是,最好检查您是否是顶级项目,并有条件地包括打包规则,如下所示:

string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" is_top_level)
option(MyProj_INCLUDE_PACKAGING "Include packaging rules for MyProj" "${is_top_level}")

if (MyProj_INCLUDE_PACKAGING)
    # ...
    include(CPack)
endif ()

EXCLUDE\u FROM\u ALL
仅适用于在该目录及以下目录中创建的目标,因此绝对没有理由忽略
include()
指令。
CPack\u CMake\u INCLUDED
实际上有效。我想知道为什么在《不确定》中没有提到。不过,它在资料来源中已经存在很多年了。