我在make
(3.81)中遇到与隐式规则有关的错误。的示例代码是:使隐式规则第一次失败,但第二次成功
dongli:test02 dongli$ ls -R
Makefile a.F90 b.F90 dir
./dir:
a.t.F90
代码间的依赖关系:
a.t.F90: a.F90
a.t.o: a.t.F90
b.o: b.F90
b: a.t.o b.o
即a.F90
是中间代码,并且当a.F90
被更新a.t.F90
将被更新。我的make
过程是:
试验1(所有在位置代码):
-------------------------------------------------------------
Project: >>> test <<<
-------------------------------------------------------------
Creating dependency a.t.o
-------------------------------------------------------------
-----> ./dir/a.t.F90
Creating dependency b.o
-------------------------------------------------------------
-----> b.F90
Creating target 'b'
---> b is created.
-------------------------------------------------------------
Finished
-------------------------------------------------------------
试验2(触摸a.F90
):
dongli:test02 dongli$ touch a.F90
dongli:test02 dongli$ make
-------------------------------------------------------------
Project: >>> test <<<
-------------------------------------------------------------
Processing templates in a.F90
-------------------------------------------------------------
Creating dependency a.t.o
-------------------------------------------------------------
-----> a.t.F90
gfortran: error: a.t.F90: No such file or directory
gfortran: fatal error: no input files
compilation terminated.
make: *** [a.t.o] Error 1
试验3:(运行make
):
dongli:test02 dongli$ make
-------------------------------------------------------------
Project: >>> test <<<
-------------------------------------------------------------
Creating dependency a.t.o
-------------------------------------------------------------
-----> ./dir/a.t.F90
Creating dependency b.o
-------------------------------------------------------------
-----> b.F90
Creating target 'b'
---> b is created.
-------------------------------------------------------------
Finished
-------------------------------------------------------------
我知道有在make
约目录缓存(见here)的错误,但对我来说,dir/a.t.F90
始终存在。任何想法?谢谢!
UPDATE1:
我用make -d
捕捉测试2以下信息:
Finished prerequisites of target file `a.t.F90'.
Prerequisite `a.F90' is newer than target `a.t.F90'.
Must remake target `a.t.F90'.
Ignoring VPATH name `./dir/a.t.F90'.
...
Successfully remade target file `a.t.F90'.
Finished prerequisites of target file `a.t.o'.
Prerequisite `a.t.F90' of target `a.t.o' does not exist.
Must remake target `a.t.o'.
为什么./dir/a.t.F90
是当它的前提条件是a.F90
比它更新的忽略?
UPDATE2:
我已经把例子代码上gist。
UPDATE3:
我发现了以下相关信息:
如果目标需要重建,GNU使丢弃的文件名VPATH搜索这一目标过程中发现 ,和使用makefile中给出的文件名在本地建立文件 。如果目标不需要重建 ,则GNU make将使用在VPATH 搜索期间找到的文件名。
我已将此错误隔离为最小集合。如果有人需要他们弄清楚什么是错误的,我可以把它们放在某个地方。 –
谢谢,这正是我正在寻找的。 – schwart