make'vpath'指令,为什么这个先决条件不够?

时间:2016-07-15 22:28:27

标签: makefile fortran gnu-make vpath

以下示例makefile按预期工作,使用vpath查找目标文件和源文件。但是在最后一行,我告诉make一个目标文件的依赖关系,我需要指定先决条件文件的目录$(objd)/,否则我得到一个错误(请参阅代码下面的错误消息) 。为什么vpath指令在最后一行是不够的?

# Program Name
prog = avpar

#dirs
objd=obj
modd=mod


# extra places to search for prerequisites
vpath %.f90 ../modules
vpath %.o obj/

# etc
FC      = gfortran
flags       = -I$(modd) -J$(modd) #-fopenmp

obj_files   = $(prog).o rw_mod.o 

# compile
p$(prog): $(obj_files)    
    $(FC)  $(flags) $^ -o $@

$(objd)/%.o: %.f90  
    $(FC)  $(flags) -c $< -o $@

$(objd)/$(prog).o: $(objd)/rw_mod.o

即,将最后一行更改为:

$(objd)/$(prog).o: rw_mod.o

给出错误:

make: *** No rule to make target 'rw_mod.o', needed by 'obj/avpar.o'.  Stop.

修改 使用这种形式的最后一行它也可以工作,没有目录规范:

#compile
p$(prog): $(obj_files)    
    $(FC)  $(flags) $^ -o $@

$(objd)/rw_mod.o: rw_mod.f90 
    $(FC)  $(flags) -c $< -o $@

$(objd)/$(prog).o: $(prog).f90 rw_mod.o
    $(FC)  $(flags) -c $< -o $@

1 个答案:

答案 0 :(得分:0)

vpath只能用于查找存在的先决条件。

Makefiles rule 3

  

使用VPATH查找对象目录中的源,而不是从sources目录中找到对象。

没有匹配rw_mod.o的规则,因此obj/avpar.o的规则失败,vpath在先决条件规则查找期间不会添加前缀,唯一可行的方法是if { {1}}已经存在。

无论如何规则是不正确的,为什么一个目标文件依赖于另一个?