如何从Makefile向Gtest传递命令行参数?
解决Makefile中Gtest参数不生效的问题
问题根源
直接运行debug/ut "--gtest-filter=*simple*"时,引号会阻止shell解析*通配符;但通过Make传递参数时,Make会先剥离外层引号,再将参数交给shell执行,此时shell会把*simple*当作文件名通配符,尝试匹配当前目录下的文件(无匹配时部分shell会保留原字符串,但行为不稳定),导致Gtest无法收到预期的过滤规则。
可行解决思路
1. 转义通配符避免shell展开
在执行make命令时,对*进行转义,让shell不解析它:
make ut-run -- --gtest-filter=\*simple\*
此时传递给Gtest的参数就是--gtest-filter=*simple*,能正常触发测试过滤。
2. 修改Makefile为参数添加引号
修改ut-run目标,将每个参数用引号包裹,强制shell不解析通配符:
ut-run: ut-link @debug/ut $(foreach arg,$(filter-out $@,$(MAKECMDGOALS)),"$(arg)")
执行命令时无需额外添加引号:
make ut-run -- --gtest-filter=*simple*
3. 使用环境变量传递参数
这种方式完全避开shell通配符解析问题,是最可靠的方案:
- 修改Makefile:
ut-run: ut-link @debug/ut $(if $(GTEST_FILTER),--gtest-filter=$(GTEST_FILTER))
- 执行命令时通过环境变量传递过滤规则:
make ut-run GTEST_FILTER="*simple*"
4. 禁用shell的通配符扩展
在Makefile的命令中添加set -f,临时禁用shell的文件名扩展功能:
ut-run: ut-link @set -f; debug/ut $(filter-out $@,$(MAKECMDGOALS))
执行命令时直接传递参数即可:
make ut-run -- "--gtest-filter=*simple*"
内容的提问来源于stack exchange,提问作者JohnA
相关产品推荐
相关产品推荐

