如何检查在CMake中是否已经调用了include(CPack)?
我正在从事一个使用第三方源代码作为子模块的项目。在CMakeLists.txt的第三方源代码中,他们的CMakeLists.txt中有如何检查在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_子目录(第三方源代码
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
实际上有效。我想知道为什么在《不确定》中没有提到。不过,它在资料来源中已经存在很多年了。