GNU 使通配符扩展的目标和先决条件顺序显式列表



有一个简单的任务。

有两个目录 - 输入输出

初始状态

$ tree .
.
├── in
│   ├── 1
│   ├── 2
│   └── 3
├── Makefile
└── out
    ├── 1
    ├── 2
    └── 3

其中 1、2、3 是空文件。

现在

$ touch in/*
目标是在目录中打印文件名,该

文件名比目录中的相应文件更新,例如:in/2 -> out/2

生成文件是

out/* : in/*
    @ echo $?

运行它

$ make -rd
...
 Prerequisite 'in/3' is newer than target 'out/3'.
 Prerequisite 'in/2' is newer than target 'out/3'.
 Prerequisite 'in/1' is newer than target 'out/3'.
...

秩序不保留。

有人可以帮助修复它吗?

你的生成文件没有做你想要的。 它将扩展到:

out/1 out/2 out/3 : in/1 in/2 in/3
        @ echo $?

这与说每个in文件都是其特定out文件的先决条件不同。 以上与写作相同:

out/1 : in/1 in/2 in/3
        @ echo $?
out/2 : in/1 in/2 in/3
        @ echo $?
out/3 : in/1 in/2 in/3
        @ echo $?

也就是说,每个out文件都依赖于所有in文件。 这就是你得到你所做的输出的原因。

另请注意make仅生成它在 makefile 中找到的第一个目标(当然还有该目标的所有先决条件(,这就是为什么您看不到其他out文件的任何信息的原因。 您需要第一个目标,例如依赖于所有out文件all

您需要使用三个显式规则:

.PHONY: all
all: out/1 out/2 out/3
out/1 : in/1
        @ echo $?
out/2 : in/2
        @ echo $?
out/3 : in/3
        @ echo $?

(这需要预先知道哪些文件(,或者使用模式规则:

.PHONY: all
all: out/*
out/% : in/%
        @ echo $?

最新更新