通常情况下,在 Makefile 中,文件的转换规则是通过模式规则(pattern rules)来实现的,例如:
%.o : %.f90
这表示从所有的 .f90
文件生成相应的 .o
文件。这种写法使用了通配符 %
来匹配文件的名称部分,而后缀(.f90
和 .o
)定义了如何从 .f90
文件生成 .o
文件。
关于 .f.o:
的写法
.f.o:; ${FC} ${FCFLAGS} -c $*.f
这种写法实际上是一个后缀规则(suffix rule),这是 Makefile 的一种较旧的规则定义方式,具体作用是定义从 .f
文件生成 .o
文件的规则。后缀规则的使用在较早版本的 Makefile 中非常常见,但在现代的 GNU Make 中,模式规则(%.o : %.f90
)更加常用。
后缀规则的工作方式
.f.o:
规则表示的是“如何从.f
文件生成.o
文件”,类似于%.o : %.f
的模式规则。它匹配任何以.f
为后缀的文件,生成对应的.o
文件。- 后缀规则格式:
<source_suffix>.<target_suffix>
,例如:.f.o:
表示从.f
到.o
的转换。
为什么使用后缀规则?
后缀规则是在早期 Makefile 中的传统做法,但它仍然能够处理简单的文件转换场景,尤其在老的代码库中,仍然可以看到这样的用法。随着 Makefile 功能的增强,模式规则(%.o : %.f
或 %.o : %.f90
)变得更灵活和强大,因此在现代项目中更推荐使用模式规则。
后缀规则与模式规则的区别
-
后缀规则(
.f.o:
):- 是一种固定的规则,针对特定的文件后缀。
- 不使用通配符
%
,而是直接指定后缀,如.f
转.o
。 - 是早期 Makefile 的标准方式,但功能相对有限。
-
模式规则(
%.o : %.f90
):- 更灵活,可以匹配任意文件前缀,只要后缀符合规则。
- 使用
%
通配符来表示文件的可变部分(如文件名)。 - 在现代 Makefile 中更加常用,适合大型项目。
代码中的 .f.o:
使用理由
- 如果项目依赖于 Fortran 代码,并且所有的
.f
文件需要生成对应的.o
文件,使用后缀规则.f.o:
是一种简单直接的方式。 - 它避免了使用通配符
%
,这可能在一些老旧或特定场景下更符合项目需求,尤其是较早期的 Makefile 中。
小结
.f.o:
是一种后缀规则,指定如何从.f
文件生成.o
文件。这是 Makefile 的传统写法。- 虽然在现代项目中,模式规则(如
%.o : %.f
或%.o : %.f90
)更常见,但后缀规则依然可以用在较为简单的场景下,或是为了向后兼容一些老项目。