Makefile GNU使通配符扩展为目标和先决条件的显式列表
有一个简单的任务 有两个目录-in和out 初始状态Makefile GNU使通配符扩展为目标和先决条件的显式列表,makefile,Makefile,有一个简单的任务 有两个目录-in和out 初始状态 $ tree . . ├── in │ ├── 1 │ ├── 2 │ └── 3 ├── Makefile └── out ├── 1 ├── 2 └── 3 其中1、2、3是空文件 现在, 目标是打印目录in中的文件名,该文件名比目录out中对应的文件名更新,例如:in/2->out/2 Makefile是 out/* : in/* @ echo $? 运行它 $ make -rd ...
$ tree .
.
├── in
│ ├── 1
│ ├── 2
│ └── 3
├── Makefile
└── out
├── 1
├── 2
└── 3
其中1、2、3是空文件
现在,
目标是打印目录in中的文件名,该文件名比目录out中对应的文件名更新,例如:in/2->out/2
Makefile是
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'.
...
秩序得不到维护
有人能帮你修复吗?你的makefile没有达到你的期望。它将扩展到:
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 $?
你的makefile没有达到你的期望。它将扩展到:
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 $?
谢谢,它很有效。还有一个问题将这个问题扩展到下一个层次,我将很快在S.O.创建它,希望您再次帮助)谢谢,它起作用了。还有一个问题将此问题扩展到下一个级别,我将很快在S.O.创建它,希望您再次提供帮助)