Flavor Function

flavor 함수를 이용하면 변수가 := 연산자에 의해 정의된 simple 변수인지 아니면 recursive 변수인지 알 수 있습니다.

undefined

만약에 makefile 에 FOO 변수 정의가 존재하지 않고, 또한 환경 변수도 존재하지 않고, make 명령 실행시 명령 라인에서 변수값을 전달하지도 않았다면 FOO 변수는 undefined 상태가 됩니다.

builtin 변수는 undefined 상태에 해당하지 않습니다.

$(info $(origin FOO))
결과: undefined

simple

:= 연산자를 사용하여 변수를 정의하면 simple 변수가 됩니다.
simple 변수에 += 연산자를 사용하면 그대로 simple 변수가 유지됩니다.

AA := foo
$(info $(flavor AA))
결과: simple

AA += bar
$(info $(flavor AA))
결과: simple

recursive

현재 AA1, AA2, AA3, AA4 변수는 undefined 상태라고 하면

AA1 = 100                # '=' 연산자
$(info $(flavor AA1))
결과: recursive

AA2 ?= 100               # '?=' 연산자
$(info $(flavor AA2))
결과: recursive

AA3 += 100               # '+=' 연산자
$(info $(flavor AA3))
결과: recursive

AA4 != echo hello        # '!=' 연산자는 대입 연산시 우측의 shell script 는 immediate 실행되지만
$(info $(flavor AA4))    # 변수 자체는 recursive 가 됩니다.
결과: recursive

simpe 변수에 다시 = 대입 연산자를 사용하면 recursive 변수가 되고
recursive 변수에 다시 := 대입 연산자를 사용하면 simple 변수가 됩니다.

AA := 100
$(info $(flavor AA))
결과: simple

AA = 100             # simple 변수에 다시 `=` 대입 연산을 하면 recursive 변수가 된다.
$(info $(flavor AA))
결과: recursive
-----------------------------------

AA = 100
$(info $(flavor AA))
결과: recursive

AA := 100            # recursive 변수에 다시 `:=` 대입 연산을 하면 simple 변수가 된다.
$(info $(flavor AA))
결과: simple