重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

下記のmakefileでPHONYの使い方が分からない。通常は、依存しないターゲットを作る時に使うがこの場合は依存する場合としない場合の両方で使われている。依存しない場合に使うのは分かるが、依存する場合に敢えてこのPHONYを使う必要がどこに有るのかが分からない。PHONYを使う事の必要性を教えてください。その時のmakefileを下記に示します。

1. SRC=message.c
2. OBJS=$(SRC:.c=.o)
3. PROG=message.exe
4. CC=gcc
5. CFLAGS=-Wall -O3
6. #LDFLAGS=-mwindows
7. RM=rm
8.
9. %.o: %.c
10. $(CC) $(CFLAGS) -o $@ -c $<
11.
12. .PHONY : all
13. all: $(PROG)
14.
15. $(PROG): $(OBJS)
16. $(CC) $(OBJS) $(LDFLAGS) -o $@
17.
18. .PHONY : clean
19. clean:
20. $(RM) $(OBJS)

12行目は依存しているが、18行目は依存していない。18行目は分かるが。果たして12行目で敢えて指定する事の必要性がどこに有るのかが分からない。必要性を教えてください。

A 回答 (2件)

先のURLには「フォニーターゲットを使うのには、同名のファイルとの衝突の回避、パフォーマンスの向上という二つの理由があります。

」とあります。

「暗黙のルールでの検索作業でもフォニーターゲットを飛ばします」ともあるので、.PHONYが無いと偶然「$(PROG)→all」の暗黙のルールが存在していた場合、そのルールが適用されることになります。
今回は暗黙のルールが無いと思われるので、.PHONY無しでも動作するでしょう。


無くてもよい。(cleanの方も、「clean」というファイルが無ければ、期待通りに動きます)
けど、あると更によい。(期待しないルールが適用される可能性が減る)

ということになります。
    • good
    • 0
この回答へのお礼

丁寧な説明有難う御座います。今度は分かりました。衝突の回避とパフォーマンスの向上と言うのも分かります。今回は、私の例示したmakefileのみを考えていましたので更に必要は無いと思っていましたので。 

変に誤動作をする可能性も無きにしも有らずと言うのを避けると言う事でしょうか。それとそれに伴う負荷の軽減ですね。

分かりやすい説明有難う御座いました。

お礼日時:2015/08/19 08:43

http://www.ecoop.net/coop/translated/GNUMake3.77 …
「依存しないターゲットを作る時に使う」というのは副次的なもので、主目的は「本当のファイル名ではないターゲット」を指定することです。
    • good
    • 0
この回答へのお礼

PHONYは有っても無くても動くと言う事でしょうか。単に明示化をするだけでしょうか。単に処理を実行させると言うのは分かりましたが。これを使う事の意味は分かりません。別に無くても良い物を何で使う様になるのかが分かりません。

この件についての回答をお願いします。

お礼日時:2015/08/19 07:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!