1. ホーム
  2. makefile

[解決済み] makefileの*.o/.suffixesは何を意味しているのですか?

2022-02-15 06:56:57

質問

Makefile のあちこちでこのようなコマンドを見かけますが、よく理解できません。

vpath.o: make.h config.h getopt.h gettext.h dep.h

そして

.SUFFIXES:
.SUFFIXES:  .f  .o
#
# %------------------%
# | Default command. |
# %------------------%
#
.DEFAULT:
    @$(ECHO) "Unknown target $@, try:  make help"
#
# %-------------------------------------------%
# |  Command to build .o files from .f files. |
# %-------------------------------------------%
#
.f.o:
    @$(ECHO) Making $@ from $<
    @$(FC) -c $(FFLAGS) $<

は何を意味しているのでしょうか? *.o*.suffixes というのは?

注:この2つのコマンドは、スクリプトの異なる部分からのものです。

解決方法は?

ご質問の1行目は、標準的なMakefileのルールに過ぎません。

vpath.o: make.h config.h getopt.h gettext.h dep.h

A .o これは、ソースファイルと最終的なコンパイル済みバイナリとの間にある中間生成物です。このファイルにはコンパイルされたコードが含まれていますが、まだ完全なライブラリやバイナリにリンクされたわけではありません。このルールは、単に vpath.o に依存します。 make.h , config.h などがあり、それらが変更されるたびに再コンパイルが必要です。ビルドに必要なコマンドは vpath.o は、タブ文字でインデントして、次の行に続けてください。(あなたがすでに知っていることを繰り返していたらごめんなさい。あなたが最初の行のどの部分について混乱しているのかわからなかったので)。

その .SUFFIXES は実際のファイルのサフィックスを指しているわけではなく、単に makefile の中の特殊なルールで、 configure "suffix rules" に使われるものです。

サフィックスルールとは、以下のような形式のルールです。 .a.b のようなものです。 .f.o ルールがあります。これらは make を見るたびに、例えば .f ファイル(ソースファイル)を作成する際に .o ファイル (ターゲットファイル) から、そのルールにしたがって $< はソースファイルを示し $@ はターゲットファイルを表します。

その .SUFFIXES target"は、サフィックスルールで使用できるサフィックスを定義する方法です。前提条件なしで使用する場合は、内蔵のサフィックスリストをクリアします。前提条件ありで使用する場合は、サフィックスルールで使用できる既知のサフィックスリストにそれらを追加します。

GNUでは make を使用すると、より強力でより明確な % のように、パターンルールを形成することができます。

%.o: %.c
    gcc -c -o $@ $<

となり、サフィックスルールに相当します。

.c.o:
    gcc -c -o $@ $<

をご覧ください。 GNU Makeのドキュメント をご覧ください(ただし、GNUの拡張機能についても触れています)。 シングルUnix仕様/POSIX は、一般的で移植可能な構文です。