使用CMake ExternalProject_Add构建mongo-c-driver时安装停滞
问题概述
使用CMake 4.0.0搭建的超级构建项目中,mongo-c-driver的安装步骤始终无法完成,最后一条日志停留在:
-- Installing: <...>-Release/../artifacts/thirdparty/mongo-c-driver/share/mongo-c-driver/THIRD_PARTY_NOTICES
推测该文档文件是最后一个安装项,但进程卡住无进展。项目主CMake配置及第三方依赖构建脚本如下:
主CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(...-solution) if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0) message(FATAL_ERROR "Clang version must be at least 14.0!") endif() set(TESSER_CLANG_TIDY "clang-tidy-15") set(TESSER_CLANG_FORMAT "clang-format-15") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_FIND_DEBUG_MODE ON) set(CMAKE_VERBOSE_MAKEFILE ON) # Handle superbuild first option (USE_SUPERBUILD "Whether or not a superbuild should be invoked" ON) if (USE_SUPERBUILD) include(thirdparty.cmake) else() include(product.cmake) endif()
thirdparty.cmake
include(ExternalProject) if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(ENABLE_LTO OFF) set(BOOST_LTO "") set(BOOST_VARIANT debug) else() set(ENABLE_LTO ON) set(BOOST_LTO "--lto=on") set(BOOST_VARIANT release) endif() set(THIRDPARTY_CMAKE_CACHE_ARGS -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=${ENABLE_LTO} ) set(THIRDPARTY_INSTALL_DIR ${CMAKE_BINARY_DIR}/../artifacts/thirdparty/${CMAKE_BUILD_TYPE}) ExternalProject_Add( mongo_c_driver GIT_REPOSITORY https://github.com/mongodb/mongo-c-driver.git GIT_TAG 1.30.2 SOURCE_DIR "${CMAKE_BINARY_DIR}/mongo-c-driver" BINARY_DIR "${CMAKE_BINARY_DIR}/mongo-c-driver/build" BUILD_ALWAYS 1 UPDATE_COMMAND "" CMAKE_CACHE_ARGS ${THIRDPARTY_CMAKE_CACHE_ARGS} -DENABLE_AUTOMATIC_INIT_AND_CLEANUP:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=${THIRDPARTY_INSTALL_DIR}/mongo-c-driver )
解决方案尝试
以下是针对该问题的几种排查和修复方向:
检查安装路径权限与路径解析
当前安装路径使用了相对路径../,可能导致CMake解析路径时出现异常,或者目标目录无读写权限。建议改用绝对路径,例如:set(THIRDPARTY_INSTALL_DIR ${CMAKE_SOURCE_DIR}/artifacts/thirdparty/${CMAKE_BUILD_TYPE})同时确认目标目录
${THIRDPARTY_INSTALL_DIR}/mongo-c-driver的父目录已存在,且当前用户拥有完整的读写权限。禁用强制重新构建
配置中BUILD_ALWAYS 1会强制每次构建都重新编译mongo-c-driver,可能引发文件锁定或重复操作导致的卡顿。将其改为:BUILD_ALWAYS 0仅在源码或配置变更时重新构建。
增加安装步骤日志 verbosity
替换默认的安装命令,获取更详细的安装过程日志,定位具体卡顿点:ExternalProject_Add( mongo_c_driver # ... 其他配置保持不变 INSTALL_COMMAND ${CMAKE_COMMAND} --install . --verbose --prefix=${THIRDPARTY_INSTALL_DIR}/mongo-c-driver )通过详细日志确认是否是文件复制、权限等待或其他操作导致的停滞。
跳过文档安装
如果THIRDPARTY_NOTICES等文档并非必需,可以通过mongo-c-driver的CMake选项禁用文档安装:CMAKE_CACHE_ARGS ${THIRDPARTY_CMAKE_CACHE_ARGS} -DENABLE_AUTOMATIC_INIT_AND_CLEANUP:BOOL=OFF -DENABLE_DOCS:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=${THIRDPARTY_INSTALL_DIR}/mongo-c-driver降级CMake版本
CMake 4.0.0是较新的版本,可能与ExternalProject模块存在兼容性问题。尝试降级到CMake 3.27~3.29版本,验证是否是新版本的bug导致的安装停滞。
内容的提问来源于stack exchange,提问作者Moravas
相关产品推荐
相关产品推荐

