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