我在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