如何阻止CMake构建外部依赖中子目录dir1的目标?
不修改第三方CMake配置停止构建指定子目录的解决方案
方法1:拦截add_subdirectory调用(推荐)
在主项目的CMakeLists.txt中,于调用add_subdirectory(extern)之前,定义自定义的add_subdirectory函数,拦截对dir1的添加操作,其余子目录正常执行原始逻辑:
# 保存CMake原生的add_subdirectory函数 function(add_subdirectory_orig) _add_subdirectory(${ARGV}) endfunction() # 自定义add_subdirectory,跳过dir1的构建 function(add_subdirectory) if("${ARGV0}" STREQUAL "dir1") message(STATUS "Skipping build of dir1 as requested") return() endif() add_subdirectory_orig(${ARGV}) endfunction() # 引入第三方extern目录 add_subdirectory(extern)
该方案完全无需修改第三方文件,所有逻辑封装在主项目配置中,团队成员和客户无需额外操作即可正常构建。
方法2:标记dir1目标为EXCLUDE_FROM_ALL
若明确知道dir1生成的所有目标名称(如库、可执行文件),可在主项目中将这些目标设置为EXCLUDE_FROM_ALL,默认构建时会跳过它们:
add_subdirectory(extern) # 假设dir1生成的目标是dir1_lib和dir1_executable set_target_properties(dir1_lib dir1_executable PROPERTIES EXCLUDE_FROM_ALL TRUE)
注意:此方法需精准覆盖dir1的所有目标,若dir1内部嵌套较多子目标,容易遗漏,可靠性不如方法1。
方法3:临时隐藏dir1目录(不推荐)
通过构建脚本临时重命名dir1目录,待CMake完成extern配置后恢复:
mv extern/dir1 extern/dir1.temp cmake .. mv extern/dir1.temp extern/dir1
该方案依赖特定脚本,跨平台兼容性差,且若CMake配置过程需读取dir1内文件会触发错误,仅作为极端场景下的备选。
内容的提问来源于stack exchange,提问作者zhou
相关产品推荐
相关产品推荐

