有一个简单的任务。
有两个目录 - 输入和输出。
初始状态
$ 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 $?