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