将以下 Makefile 视为 MWE:
###################################################################
# first bunch
###################################################################
FORTRAN1 = ifort -c
PATH1 = sub/
FILE1 = first.f90
SOURCE1 = $(FILE_TEST:%=$(PATH1)%)
OBJECT1 = $(addprefix lnk/,$(addsuffix .o,$(basename $(FILE1))))
###################################################################
#second bunch
###################################################################
FORTRAN2 = ifort -traceback -c
PATH2 = sub/
FILE2 = second.f90
SOURCE2 = $(FILE2:%=$(PATH2)%)
OBJECT2 = $(addprefix lnk/,$(addsuffix .o,$(basename $(FILE2))))
###################################################################
# first rule
###################################################################
all: $(OBJECT1)
lnk/%.o: $(PATH1)%.f90
$(FORTRAN1) -o $@ $<
###################################################################
# second rule
###################################################################
all: $(OBJECT2)
lnk/%.o: $(PATH2)%.f90
$(FORTRAN2) -o $@ $<
当我运行此脚本时,将执行以下命令:
ifort -traceback -c -o lnk/first.o sub/first.f90
ifort -traceback -c -o lnk/second.o sub/second.f90
换句话说,第一条和第二条规则都使用FORTRAN2=ifort -traceback -c
,而第一条规则应该使用FORTRAN1=ifort -c
。您能帮我看看是什么造成了这种奇怪的行为吗?我怎样才能实现$(FORTRAN1)$
第一条规则应该使用的目标?
编辑#1:
根据 MadScientist 的建议,我尝试了以下方法:
###################################################################
# first bunch
###################################################################
FORTRAN1 = ifort -c
PATH1 = sub/
FILE1 = first.f90
SOURCE1 = $(FILE_TEST:%=$(PATH1)%)
OBJECT1 = $(addprefix lnk/,$(addsuffix .o,$(basename $(FILE1))))
###################################################################
#second bunch
###################################################################
FORTRAN2 = ifort -traceback -c
PATH2 = sub/
FILE2 = second.f90
SOURCE2 = $(FILE2:%=$(PATH2)%)
OBJECT2 = $(addprefix lnk/,$(addsuffix .o,$(basename $(FILE2))))
###################################################################
# first rule
###################################################################
$(OBJECT1): lnk/%.o: $(PATH1)%.f90
$(FORTRAN1) -o $@ $<
###################################################################
# second rule
###################################################################
$(OBJECT2): lnk/%.o: $(PATH2)%.f90
$(FORTRAN2) -o $@ $<
但是,它只执行一个(即第一个)命令:
ifort -c -o lnk/first.o sub/first.f90
编辑#2:
问题是我删除了all:
目标。正确的文件内容应该是:
###################################################################
# first bunch
###################################################################
FORTRAN1 = ifort -c
PATH1 = sub/
FILE1 = first.f90
SOURCE1 = $(FILE_TEST:%=$(PATH1)%)
OBJECT1 = $(addprefix lnk/,$(addsuffix .o,$(basename $(FILE1))))
###################################################################
#second bunch
###################################################################
FORTRAN2 = ifort -traceback -c
PATH2 = sub/
FILE2 = second.f90
SOURCE2 = $(FILE2:%=$(PATH2)%)
OBJECT2 = $(addprefix lnk/,$(addsuffix .o,$(basename $(FILE2))))
###################################################################
# first rule
###################################################################
all: $(OBJECT1)
$(OBJECT1): lnk/%.o: $(PATH1)%.f90
$(FORTRAN1) -o $@ $<
###################################################################
# second rule
###################################################################
all: $(OBJECT2)
$(OBJECT2): lnk/%.o: $(PATH2)%.f90
$(FORTRAN2) -o $@ $<
Make 不是一种脚本语言:make 不会读取 makefile 并在处理时“执行”它。Make 完全读取整个 makefile 以及所有包含的文件,然后在完成后开始处理。
只能有一个具有相同目标和先决条件的模式规则。在你的 makefile 中你有:
由于
PATH1
和PATH2
变量具有相同的值,因此 make 会看到:第二条规则与第一条规则相同,因此它会覆盖第一条规则,并且第一条规则会丢失。然后在所有这些解析完成之后,THEN make 开始尝试构建对象并查看应该使用哪个规则来匹配哪个目标。由于只有一种匹配的模式规则,因此它适用于所有对象。
您可以通过几种不同的方法来执行此操作。一种是使用静态模式规则而不是完整模式规则:
现在这些规则只匹配那些确切的对象。