我正在编写一个 Makefile 配方,如果且仅当某个文件存在时才需要执行...
这是我所拥有的:
clean:
$(if $(shell test -s ${MFN_LSTF}), \
$(foreach mfn, $(shell cat ${MFN_LSTF}), \
$(MAKE) -f mfd/${mfn} clean;), )
.PHONY: clean
${MFN_LSTF} 包含一个文件名,该文件名包含一列生成文件名列表,假定与此生成文件配方位于同一本地目录中。
我遇到的问题是,foreach
语句总是执行。我希望它仅在文件名${MFN_LSTF}
存在时执行。
我也试过这个:
clean:
[ test -s ${MFN_LSTF} ] &&
for mfn in $(shell cat ${MFN_LSTF}); do
$(MAKE) -f mfd/${mfn} clean
done
.PHONY: clean
你可以在一个recipie中写shell部分。
需要注意的是,如果您希望 shell 看到一美元,则需要将其加倍,并且您希望程序是一个逻辑行,因此 make 将其提供给单个 shell。
GNUmake 有一个扩展,允许您在单个 shell 中运行整个 recipie。
将带有 cat 的文件读入 for 循环不是最佳实践,例如,如果文件中有空格,则会出错,但我不会在这里修复它以使代码接近原始代码。
这可能是一个可能且更简单的解决方案,模拟 shell:
并且,以下工作,无需模拟外壳: