如何在Makefile的一个recipe中循环调用另一个recipe并修复相关报错
Makefile 报错修复方案
错误原因
你的写法存在两个核心问题:
run_experiment1是Makefile内部定义的目标,不是系统可执行命令,直接在shell循环中调用会提示找不到命令。- 变量转义逻辑错误:Makefile会优先解析
${k}作为自身变量,你没有提前定义该变量就会被展开为空,同时shell循环内的变量没有正确转义,导致无法拿到循环中的k值。
修复后的Makefile
# 声明伪目标,避免存在同名文件时目标不执行 .PHONY: run_experiment1 run_all_experiments run_experiment1: python some_file.py \ --data_file /somewhere/here \ --k ${k} run_all_experiments: for k in 1 2 3 4 5 ; do \ $(MAKE) run_experiment1 k=$$k ; \ done
改动说明
- 新增
.PHONY声明两个目标为伪目标,排除目录下存在同名文件导致的执行异常。 - 循环内使用
$(MAKE)调用当前make进程执行run_experiment1目标,解决命令找不到的问题。 - 传参处写为
k=$$k:两个$是Makefile的转义写法,Makefile解析后会传给shell一个$,shell执行时就能正确读取循环变量k的值,再作为参数传给make赋值给内部的${k}变量,解决参数为空的问题。
注意事项
Makefile的所有规则行缩进必须使用Tab,不能用空格,复制代码时请确认缩进格式正确。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

