考虑目标重制而不运行任何规则的 Makefile

bla*_*ost 5 makefile

我正在回答另一个问题 ——SO 上的多作业生成的依赖关系排序错误,我发布了以下生成文件。OP 回复说,如果-j没有在命令行中指定,它就不会构建dir1/out/file.bar目标......很困惑,我确认它可以-j2-j1. 我已经看过了,我没有看到我错过了什么。我想我会把它贴在这里以防有人知道,因为我很好奇......

$(shell mkdir dir1 >& /dev/null; touch dir1/file.foo; \
        mkdir dir2 >& /dev/null; touch dir2/file.foo)


OUTDIRS = dir1/out dir2/out
OUTPUTS = dir1/out/file.bar dir2/out/file.bar

.DEFAULT_GOAL := all

$(OUTPUTS) : | $(OUTDIRS)

$(OUTDIRS) :
        @echo "making $@"
        sleep 1
        mkdir -p $@
        @echo "done making $@"


%.bar : ../%.foo
        @echo "copying $< to $@"
        @cp $< $@

all : outputs
        @echo "done $@"

outputs : $(OUTPUTS)
        @echo "created all output files"

clean :
        @rm -rf dir1 dir2
Run Code Online (Sandbox Code Playgroud)

我正在运行 make 3.81,而 OP 使用的是 3.82。我尝试使用 运行make -d -j1 -r,并得到以下代码段:

     Finished prerequisites of target file `dir1/out/file.bar'.
    Must remake target `dir1/out/file.bar'.
    Successfully remade target file `dir1/out/file.bar'.
    Considering target file `dir2/out/file.bar'.
     File `dir2/out/file.bar' does not exist.
      Considering target file `dir2/out/../file.foo'.
       Finished prerequisites of target file `dir2/out/../file.foo'.
      No need to remake target `dir2/out/../file.foo'.
      Pruning file `dir1/out'.
      Pruning file `dir2/out'.
     Finished prerequisites of target file `dir2/out/file.bar'.
    Must remake target `dir2/out/file.bar'.
copying dir2/out/../file.foo to dir2/out/file.bar
    Successfully remade target file `dir2/out/file.bar'.
Run Code Online (Sandbox Code Playgroud)

它似乎认为它重新制作了 dir1/out/file.bar,但它没有运行任何目标/配方来这样做......我想知道我错过了什么......