5

我有一个简单的测试 Makefile:

hello: hello.o
.SUFFIXES: .c .f90 .o
.f90.o:
    pgf90 -c -o $@ $<
.c.o:
    cc -c -o $@ $<

您不必告诉我它在同一个目录中有一个 foo.c 和一个 foo.f90 会造成混乱。我永远不会真的这样做。我只是想了解 Make 如何处理一些先例。因此,当我简单地发出 make 命令时,make 运行:

pgf90 -c -o hello.o hello.f90
cc hello.o -o hello

当然,“cc”链接会失败,因为“cc”无法链接 FORTRAN 对象以生成可执行文件。美好的。但我的问题是:我已经尽我所能阻止 make 使用 pgf90 命令作为它的第一个编译命令,而是选择了 cc 命令。我改变了后缀规则的顺序。我更改了 .SUFFIXES 语句中的后缀顺序。唯一可行的方法是完全排除 .f90 后缀。为什么会这样,可以改变吗?谢谢。(如果不是不用说,我的目录中确实有简单的 hello.f90 和 hello.c 源文件,它们编译和执行都很好。)

更新:使用 -d 进行制作。相关输出(AFAICT)如下所示:

Considering target file 'hello.o'.
 File 'hello.o' does not exist.
 Looking for an implicit rule for 'hello.o'.
 Trying pattern rule with stem 'hello'.
 Trying implicit prerequisite 'hello.c'.

对“隐式先决条件'hello.c'”没有印象,在它涉及之前尝试了一大堆其他事情

 Found an implicit rule for 'hello.o'.
  Considering target file 'hello.f90'.
   Looking for an implicit rule with stem 'hello.f90'
    .
    .
    .
   No implicit rule found for 'hello.f90'.    #???????
    .
    .
 Must remake target 'hello.o'
pgf90 -c -o hello.o hello.f90

越来越好奇

4

1 回答 1

1

出于对我来说很神秘的原因(但可能是晦涩的和历史的),您可以通过更改后缀规则来更改此行为

.f90.o:
    pgf90 -c -o $@ $<
.c.o:
    cc -c -o $@ $<

进入模式规则(并颠倒顺序):

%.o : %.c
    cc -c -o $@ $<
%.o : %.f90
    pgf90 -c -o $@ $<
于 2012-08-21T02:58:04.937 回答