プロが教える店舗&オフィスのセキュリティ対策術

以下のMakefileを実行した場合、
 foo bar fooey barney
という結果を予測していましたが、実際は以下の通り、異なる結果でした。
 foo fooey barney
 bar fooey barney
と展開される理由をご教授いただけると幸いです。
$ @の変数が一つずつ展開されているように見えますが、その認識で合っていますでしょうか?

■Makefile
FOO= foo
BAR = bar
FOOBAR = $(FOO)$(BAR)
all: $(FOOBAR)
$(FOOBAR):
@echo $ @ $(FOOBAR)
FOO = fooey
BAR = barney

■実行結果
$ make
foo fooey barney
bar fooey barney

A 回答 (2件)

$(FOOBAR):


  @echo $@ $(FOOBAR)
は FOOBAR = $(FOO) $(BAR)
であるから
$(FOO) $(BAR):
  @echo $@ $(FOO) $(BAR)
であり、ターゲットの方はこの時点での FOO,BAR が展開され
foo:
  @echo $@ $(FOO) $(BAR)
bar:
  @echo $@ $(FOO) $(BAR)
の意味になります。
    • good
    • 0

詳細については使っている make によって違うかもしれんけど, この例でいえば


$(FOOBAR):
  @echo $@ $(FOOBAR)
のところで上の $(FOOBAR) が展開されて
foo bar:
  @echo $@ $(FOOBAR)
になる. そして, このように複数のターゲットが指定されているときには
foo:
  @echo $@ $(FOOBAR)
bar:
  @echo $@ $(FOOBAR)
と個別に記述したのと同じ意味を持つ. 今 all の依存関係で foo と bar の両方を作り直すのであれば, それぞれに対して
(foo に対して) @echo foo fooey barney

(bar に対して) @echo bar fooey barney
が実行される.

つまり「$@ が一つずつ展開されている」というよりも「個々のターゲットに対してそれぞれ実行される (結果としてそれぞれのターゲットに展開されている)」というべきかな.

make が正確にどのように認識しているかについては, make に「しかるべき」オプション (ふつうは -p かな) を与えてみればわかると思う.
    • good
    • 0

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