特定于目标的变量在Makefile中不起作用的是什么?

时间:2014-12-24 13:33:02

标签: makefile fortran

大家

如果同一目标属于不同的目标,如何设置不同的先决条件。例如, 目标t1取决于文件main.o和t1.o,其中main.o依赖于t1.o(它是fortran中的模块文件,类似于C中的头文件.h),除了它的源, 目标t2取决于文件main.o和t2.o,此时main.o依赖于t2.o和它的源文件。


t1 : main.o t1.o 
main.o:   t1.o

t2:main.o t2.o
main.o:  t2.o

我在一个makefile中一起编写它们,但不幸的是,main.o的dependece没有生效。为什么呢?

-

 1    .SECONDEXPANSION:
 2   
 3    FC=gfortran
 4    PRJ = t1 t2
 5   
 6    all: $(PRJ)
 7   
 8    %.o:%.f90 ; $(FC) -c $<
 9   
10   
11    t1: tname = t1.o
12    t2: tname = t2.o
13   
14    $(PRJ) : main.o $$(tname) ; $(FC) $^ -o $@
15    main.o : $$(tname)
16   
17    clean:
18        rm -rf $(PRJ) *.o *.mod

第15行不生效。为什么呢?

这是源文件:

main.f90时

use eqn
print *,nam
end

t1.f90

module eqn
    character(10):: nam = 't1'
end module

t2.f90

module eqn
    character(10):: nam = 't2'
end module

1 个答案:

答案 0 :(得分:0)

target-specific vairable实际上正在运行,如果您运行make t1,然后运行make clean,那么make t2(它可以在我的电脑上运行)。但是,当您运行makemake all时,情况并非如此。这是因为有多个目标,我猜测只生成了一个目标main.o(对此部分不太确定)

运行makemake all时,依赖关系图可能是这样的:

 t1               t2
 |\              / |
 | +-> main.o <-+  |
 |                 |
t1.o             t2.o

检查以下内容:

GNU make does its work in two distinct phases. .....constructs a dependency graph
 of all the targets and their prerequisites. During the second phase, make uses 
these internal structures to determine what targets will need to be rebuilt and 
to invoke the rules necessary to do so.

immediate : immediate ; deferred
        deferred
That is, the target and prerequisite sections are expanded immediately

(来自this