在extern目录用FetchContent获取pFUnit时CMake配置失败求助
解决pFUnit在extern目录下的CMake配置问题
问题根源
当pFUnit的FetchContent配置放在extern/pFUnit/CMakeLists.txt中时,CMake的作用域隔离会导致test目录无法访问pFUnit定义的PFUNIT_DRIVER等关键变量,以及add_pfunit_ctest依赖的CMake模块路径,进而触发configure_file找不到模板文件的错误。
解决方案
步骤1:修改extern/pFUnit/CMakeLists.txt,导出关键变量到父作用域
在FetchContent_MakeAvailable代码块后,添加代码将pFUnit的核心变量和模块路径传递到父目录:
FetchContent_Declare( pFUnit GIT_REPOSITORY https://github.com/Goddard-Fortran-Ecosystem/pFUnit.git GIT_TAG 4.6.0 ) FetchContent_MakeAvailable(pFUnit) # 导出pFUnit核心变量到父作用域 set(PFUNIT_DRIVER "${PFUNIT_DRIVER}" PARENT_SCOPE) set(PFUNIT_MODULE_DIR "${PFUNIT_MODULE_DIR}" PARENT_SCOPE) # 将pFUnit的CMake模块路径添加到全局CMAKE_MODULE_PATH并导出 list(APPEND CMAKE_MODULE_PATH "${pFUnit_SOURCE_DIR}/cmake") set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE)
步骤2:调整根目录CMakeLists.txt的子目录加载顺序
确保先加载pFUnit依赖,再加载test目录,让test目录能继承根作用域的变量:
cmake_minimum_required(VERSION 3.18) project(broken Fortran) add_subdirectory(src) # 优先加载pFUnit依赖,确保变量已导出到根作用域 add_subdirectory(extern/pFUnit) add_subdirectory(test)
步骤3:验证test目录的CMake配置
确保test/CMakeLists.txt中能正常调用pFUnit的宏:
add_pfunit_ctest(test_square TEST_SOURCES test_square.pf LINK_LIBRARIES square )
原理说明
CMake子目录的变量默认仅在当前作用域有效,通过PARENT_SCOPE将pFUnit的关键变量和模块路径传递到根目录后,后续加载的test目录就能访问这些资源,满足add_pfunit_ctest宏的运行要求。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

