Makefileにおける.PHONYの例を日本語で解説

2024-09-02

.PHONYの目的を日本語で説明

Makefileにおいて、.PHONYという特殊なターゲットを使用する目的は、phonyターゲットを定義することです。phonyターゲットとは、ファイルシステム上の実際のファイルに対応しないターゲットであり、常に再実行されることが保証されます。

.PHONYの役割

  • ファイルの存在チェックの回避: .PHONYターゲットは、ファイルシステム上のファイルの存在をチェックしません。そのため、同名のファイルが存在していても、常にターゲットが再実行されます。
  • 依存関係の強制: .PHONYターゲットは、依存関係を強制的に実行します。つまり、.PHONYターゲットが実行される際には、そのターゲットに依存するすべてのターゲットも必ず実行されます。

使用例

.PHONY: clean all

clean:
        rm -f *.o *.bin

all:
        gcc *.c -o main

この例では、.PHONY: clean allによって、cleanallがphonyターゲットとして定義されています。これにより、以下のことが保証されます。

  • cleanターゲットは、常に実行され、ファイルの削除が実行されます。
  • allターゲットは、常に実行され、コンパイルとリンクが実行されます。



Makefileにおける.PHONYの例を日本語で解説

Makefileにおいて、.PHONYを使用する例を以下に示します。

例1: ファイルの削除

.PHONY: clean

clean:
        rm -f *.o *.bin

この例では、cleanというphonyターゲットが定義されています。このターゲットは、ファイルシステム上のファイルの存在をチェックすることなく、常に実行されます。実行時には、rm -f *.o *.binコマンドが実行され、指定されたファイルが削除されます。

例2: コンパイルとリンク

.PHONY: all

all:
        gcc *.c -o main

この例では、allというphonyターゲットが定義されています。このターゲットは、常に実行され、コンパイルとリンクの処理を行います。実行時には、gcc *.c -o mainコマンドが実行され、すべてのCソースファイルがコンパイルされて実行ファイルmainが生成されます。

例3: 複数のphonyターゲット

.PHONY: clean all test

clean:
        rm -f *.o *.bin

all:
        gcc *.c -o main

test:
        ./main



.PHONYの代替方法を日本語で解説

Makefileにおいて、.PHONYを使用する代わりに、以下のような方法を用いることもできます。

ターゲット名をファイル名と異なるものにする

最も単純な方法は、ターゲット名をファイル名と異なるものにすることです。これにより、ファイルシステム上のファイルの存在をチェックする必要がなくなります。

clean:
        rm -f *.o *.bin

all:
        gcc *.c -o main

この例では、cleanallというターゲット名はファイル名と異なるため、常に実行されます。

ターゲットの依存関係を指定する

ターゲットの依存関係を指定することで、ターゲットが実行される条件を制御することができます。

.PHONY: clean

clean:
        rm -f *.o *.bin

all: *.o
        gcc *.o -o main

この例では、allターゲットは*.oターゲットに依存しています。そのため、*.oターゲットが実行された場合にのみ、allターゲットが実行されます。

ターゲットのレシピを条件付きで実行する

ターゲットのレシピを条件付きで実行することで、特定の条件下でのみターゲットを実行することができます。

clean:
        if [ -f *.o ]; then \
                rm -f *.o *.bin; \
        fi

この例では、*.oファイルが存在する場合にのみ、cleanターゲットが実行されます。


makefile phony-target

makefile phony target

GNU Makefile 変数代入の代替方法

GNU Makefile で変数を代入する際に、=、?=、:=、+= の4つの演算子を使用することができます。それぞれに異なる挙動があるため、適切な演算子を選択することが重要です。意味: 通常の代入演算子。挙動: 変数の値を指定された文字列に設定します。


gcc と makefile での「No rule to make target ...」エラーの代替手法

「No rule to make target . ..」というエラーは、gcc と makefile を使ったコンパイルプロセスにおいて、makefile に指定されたターゲットファイルを作成するためのルールが見つからないことを意味します。