CMake ExternalProject_Add显式设置SOURCE_DIR时复制时间戳文件失败
解决CMake ExternalProject自定义目录的stamp文件错误
问题根源
你遇到的错误是因为SOURCE_DIR与PREFIX路径重合,同时启用BUILD_IN_SOURCE,导致ExternalProject在生成和复制stamp文件时出现路径冲突,CMake 3.17.5对这种目录结构的兼容性有限。
解决方案
方案1:调整目录结构(推荐)
将源码目录设为PREFIX下的子目录,用绝对路径明确所有目录位置,避免路径重叠:
include(ExternalProject) ExternalProject_Add(libserialportDL PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/src TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/tmp STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/stamp DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/download GIT_REPOSITORY git://sigrok.org/libserialport GIT_PROGRESS TRUE GIT_TAG 21b3dfe5 UPDATE_COMMAND "" # 禁用每次构建的更新检查 BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bash -c "./autogen.sh && ./configure" BUILD_COMMAND make INSTALL_COMMAND "" )
方案2:保留源码在PREFIX根目录
如果坚持要将源码放在_deps/libserialport根目录,可将辅助目录设为隐藏子目录,避免与源码文件冲突:
include(ExternalProject) ExternalProject_Add(libserialportDL PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/.tmp STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/.stamp DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/_deps/libserialport/.download GIT_REPOSITORY git://sigrok.org/libserialport GIT_PROGRESS TRUE GIT_TAG 21b3dfe5 UPDATE_COMMAND "" BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bash -c "./autogen.sh && ./configure" BUILD_COMMAND make INSTALL_COMMAND "" )
关键说明
- 使用
${CMAKE_CURRENT_BINARY_DIR}指定绝对路径,消除相对路径解析的歧义 - 为
DOWNLOAD_DIR指定独立路径,确保git克隆的临时文件不会干扰源码目录 - 避免
SOURCE_DIR与PREFIX完全重合,防止stamp文件操作时的路径冲突
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

