考虑以下 Makefile 片段:
FORTRAN = ifort -c
PATH_MOD = mod/
FILE_MOD = mod_constant.f90 mod_rot.f mod_test.f90
SOURCE_MOD = $(FILE_MOD:%=$(PATH_MOD)%)
OBJECT_MOD = $(FILE_MOD:%.f*=%.o)
$(OBJECT_MOD): $(SOURCE_MOD)
$(FORTRAN) $(SOURCE_MOD)
clean:
rm -f *.o
该脚本执行命令ifort -c mod_constant.f90 mod_rot.f mod_test.f90
。
但是,我希望实现$(FILE_MOD)
[但目录中的其他文件] 中列出的所有文件都将在单独的行中$(PATH_MOD)$
编译,将目标文件放入目录中。在本例中,脚本应运行以下命令序列:lnk
ifort -c mod_constant.f90 -o lnk/mod_constant.o
ifort -c mod_rot.f -o lnk/mod_rot.o
ifort -c mod_test.f90 -o lnk/mod_test.o
有什么办法可以做到这一点吗?
这条规则...
表示扩展到的列表中的每个目标都以扩展到的列表中的所有文件
$(OBJECT_MOD)
为先决条件,并且应该由扩展到的命令构建。那根本不是你想要的。$(SOURCE_MOD)
$(FORTRAN) $(SOURCE_MOD)
由于您似乎已经致力于 GNU 版本的
make
,因此解决此问题的自然方法是编写模式规则。实际上,或者两个,因为您有两个不同的源名称模式。如果您希望目标文件进入与其相应源不同的目录,那么也可以在此类规则中进行处理。例如,可以
%
解释为通配符,但需要注意的是,规则目标中的外观及其先决条件列表中的外观必须扩展为相同的字符串。是
$<
一个自动变量,根据 的扩展,扩展为规则先决条件列表的第一个实际元素%
。扩展$@
到正在构建的实际目标。另外,请注意,这些规则告诉如何构建所需的文件,但您仍然需要以某种方式告诉
make
它们是否需要构建。这通常是通过将它们作为某些规则的先决条件来实现的,尽管您也可以依赖于从命令行显式请求其中一个或多个make
。