Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile GNU使通配符扩展为目标和先决条件的显式列表_Makefile - Fatal编程技术网

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

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 ...

有一个简单的任务

有两个目录-inout

初始状态

$ 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.创建它,希望您再次提供帮助)