Makefileにおける.PHONYの例を日本語で解説
.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
によって、clean
とall
が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
この例では、clean
とall
というターゲット名はファイル名と異なるため、常に実行されます。
ターゲットの依存関係を指定する
ターゲットの依存関係を指定することで、ターゲットが実行される条件を制御することができます。
.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