Makefileでターゲット内で設定した変数を用いた条件分岐が意図した動作にならない
Makefileのターゲット内で変数に値を設定し,
その変数を用いて条件分岐により処理を切り替えたいと考えています.
ターゲット内では単に代入はできずevalを用いる必要があるため
以下のようなMakefileを書きました.
build:
$(eval CC := gcc)
ifeq ($(CC),gcc)
@echo $(CC) is gcc
else
@echo $(CC) is not gcc
endif
しかし,これを実行しても変数CCはgccでないと判定されます.
$ make
gcc is not gcc
変数に値を設定する場所がターゲット外の場合は
期待した通り変数CCはgccであると判定されます.
CC := gcc
build:
ifeq ($(CC),gcc)
@echo $(CC) is gcc
else
@echo $(CC) is not gcc
endif
この実行結果は以下の通りです
$ make
gcc is gcc
ターゲット外でevalを用いて変数を設定した場合も同様です.
$(eval CC := gcc)
build:
ifeq ($(CC),gcc)
@echo $(CC) is gcc
else
@echo $(CC) is not gcc
endif
この実行結果は以下の通りです.
$ make
gcc is gcc
なぜターゲット内外で変数を設定した場合に条件分岐の挙動が異なるのでしょうか.
また,ターゲット内で変数を設定した場合の条件分岐はどのように実装すればよいのでしょうか.
利用環境:
GNU Make 4.1
OS: Ubuntu 16.04.3 LTS