CMake add_custom_target使用Shell循环报错,求修复方案
修复CMake自定义目标中Shell循环的语法错误
问题原因
你写的CMake命令里,while循环的分号;会被CMake当作列表分隔符,再加上VERBATIM选项的转义处理,最终传递给shell的命令被拆分得不完整,导致shell解析时找不到do关键字,抛出语法错误。
修复方案
方案1:使用独立Shell脚本(推荐)
把文件处理逻辑写成单独的shell脚本,彻底避免CMake与shell的语法冲突:
- 在项目目录下创建
process_temp.sh脚本:
#!/bin/bash while read -r line; do echo "$line" # 这里可以添加你的其他处理逻辑 done < "$1"
- 在CMakeLists.txt中调用该脚本:
add_custom_target(mytarget COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/process_temp.sh ${CMAKE_CURRENT_BINARY_DIR}/temp.txt VERBATIM )
如果脚本没有可执行权限,直接用sh或bash调用即可;也可以通过CMake的execute_process提前给脚本添加权限:
execute_process(COMMAND chmod +x ${CMAKE_CURRENT_SOURCE_DIR}/process_temp.sh)
方案2:直接修正COMMAND中的语法
如果不想单独写脚本,需要将整个shell循环用sh -c包裹,同时转义特殊字符,确保CMake把完整命令传递给shell:
add_custom_target(mytarget COMMAND sh -c "while read -r line; do echo \"\$line\"; done < '${CMAKE_CURRENT_BINARY_DIR}/temp.txt'" VERBATIM )
注意点:
- 用
sh -c将整个循环作为单一命令传递给shell - 转义
$为\$,避免CMake提前展开变量 - 用单引号包裹文件路径,防止路径含空格时解析出错
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

