0
write:
    @echo `date`

file_1: write file_2
    @echo "file_1 begin"
    $(shell sleep 3)
    @echo "file_1 end"

file_3: write file_4
    @echo "file_3 begin"
    $(shell sleep 3)
    @echo "file_3 end"

all: file_1 file_3

.PHONY: write

当我运行 make 时,它​​输出:

Sat Oct 9 15:22:45 CST 2021
file_1 begin
file_3 begin
file_1 end
file_3 end

目标write只运行一次。

我的最终目标是通过编写目标的开始时间来计算和的执行file_1时间。在测试是否会覆盖的过程中,发现了上述问题。如果有更好的计算时间的方法,请告诉我。file_3write

4

1 回答 1

3

首先,在 recipe$(shell ...)中使用函数几乎总是错误的。配方已经在 shell 中运行,因此不需要它,并且它具有意外行为。为什么不直接在这里使用呢?@sleep 3

没有办法在一次 make 调用中多次构建单个目标。那将是非常糟糕的:考虑如果您有多个程序都依赖于一个.o文件,例如:您想.o多次重新编译该文件吗?

无论如何,这不会真正做你想要的:

file_1: write file_2

这不测量执行时间,file_1因为开始日期是写入的,然后file_2是构建的,然后file_1是构建的。所以你也包括执行时间file_2

而且,当然,如果您启用了并行构建,那么所有的赌注都没有了。

如果您想测量某些东西,请将启动/停止操作放在配方中,而不是使用先决条件。您可以将其隐藏在变量中,以减少输入的繁琐。

于 2021-10-09T14:49:53.203 回答