如何在bash循环中编译CMake生成的Makefile里指定前缀的目标子集
Shell脚本编译运行CMake生成的单元测试目标解决方案
核心逻辑说明
你需要从CMake生成的Makefile中,过滤出所有以UnitTest为前缀、不带/fast后缀的编译目标,通过文本处理提取目标名后循环编译即可:
- 用
grep匹配行首为UnitTest、不包含/的目标规则行,排除fast编译规则 - 用
cut按冒号分割切取出目标名称 - 用
sort -u去重避免重复编译同一个目标
修正后的完整脚本
WORKDIR=$PWD BUILD=~/Dropbox/Projects/Apeiron/build BIN="$BUILD/bin" # 编译测试二进制文件 cd "$BUILD" || exit 1 # 提取所有符合要求的单元测试目标 for target in $(grep -E '^UnitTest[^/]*:' Makefile | cut -d: -f1 | sort -u) do echo "" echo "Compiling $target" make -j 8 "$target" || exit 1 done # 运行测试 cd "$BIN" || exit 1 for test in UnitTest* do echo "" echo "Running $test" ./"$test" done cd "$WORKDIR"
补充说明
- 脚本中给路径变量加了双引号,避免路径存在空格时执行异常
- 新增了
|| exit 1逻辑,目录切换失败或者编译失败时直接终止脚本,避免后续执行出错 - 你可以根据自己CPU的核心数调整
make -j后的并行编译数值
内容的提问来源于stack exchange,提问作者niran90
相关产品推荐
相关产品推荐

