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」はFORTRANオブジェクトをリンクして実行可能ファイルを作成できないため、「cc」リンクは失敗します。罰金。しかし、私の質問は、makeが最初のコンパイルコマンドとしてpgf90コマンドを使用することを思いとどまらせ、代わりにccコマンドを選択するために考えられるすべてのことを試みました。サフィックスルールの順序を変更しました。.SUFFIXESステートメントのサフィックスの順序を変更しました。動作しているように見える唯一のことは、.f90サフィックスの除外を完全に除外することです。なぜこれで変更できますか?ありがとう。(言うまでもないことですが、私のディレクトリには単純なhello.f90とhello.cのソースファイルがあり、それらは正常にコンパイルおよび実行されます。)

更新:-dでmakeを実行しました。関連する出力(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'」に感銘を受けないで、makeは他のことをたくさん試します

 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 に答える