【发布时间】:2022-01-16 12:46:48
【问题描述】:
鉴于 Makefile 的以下部分:
$(call pkg-source,$(1)):
$(call unpack,$(call tarball,$(1)))
$(foreach pch, $(sort $(wildcard src/$(notdir $(ver_$(1))).patch*)), patch -d $(1)* -p1 < $(pch))
$(foreach var, $(shell find $(1)* -type f -iname abc.xyz), cp my_abc.xyz $(var))
touch $$@
noopstop
noopstop 用于强制 make 以“找不到命令”终止。
在make clean 之后首先运行,解压外部源代码,然后(第一个foreach)修补(如果存在修补程序)。
然后(第二个foreach)必须用我自己的版本覆盖源附带的一个已知名称的文件。这在第一次运行时总是失败,但文件在那里。
删除touch $$@创建的文件,再次运行make,文件现在被替换了。
以-j1 选项开始make 没有区别; -d 选项也无助于查找问题。
GNU Make 页面声明:“通常,make 一次只会执行一个配方,等待它完成后再执行下一个。”那么在第一个foreach(用于打补丁)之后,为什么第二个看不到文件?
这是在 Fedora_35、x86_64、GNU make 4.3 上
谢谢,马特
【问题讨论】:
-
你怎么知道它失败了?它在哪一步失败?你能给我们一个minimal complete example吗?
-
@Beta,很抱歉没有提供完整的示例,我以为我对 make 的工作原理有一个简单的误解。我可以检测到文件替换不起作用,因为文件仍然是原始日期和大小,而不是副本运行良好时的大小和日期。对我来说,看起来 foreach 仍然没有获取在配方执行期间对目录内容所做的更改。我会尝试做一个完整的例子,但它是一个复杂的 Makefile。
-
我尝试制作一个简单的makefile来演示这个问题,但每次我有一个问题也消失了。我已经放弃了这种方法,因为在 makefile 的其他地方我找到了另一种方法来做我想做的事情,并且它有效。