[MAKE] Conditional Parts
CS/Shell/Perl/Python 2011. 6. 8. 15:187.1 Example of a Conditional
다음 예제는 CC변수가 gcc인 경우에 make가 라이브러리들 중 하나의 셋을 사용하게 하고, gcc가 아닌 경우에는 다른 라이브러리 셋을 사용하게 한다.
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
혹은, 다음과 같이 변수를 조건부로 할당하고, 변수를 명시적으로 사용할 수도 있다
libs_for_gcc = -lgnu
normal_libs =
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo: $(objects)
$(CC) -o foo $(objects) $(libs)
7.2 Syntax of Conditionals
syntax는 else가 없는 다음의 가장 간단한 형태부터 else를 포함한 두가지 형태가 있다.
conditional-directive
text-if-true
endif
conditional-directive
text-if-true
else
text-if-false
endif
conditional-directive
text-if-true
else
text-if-false
else
text-if-false
endif
조건을 테스트하는데는 다음의 4가지 지시자가 있다
- ifeq
- iffeq (qrg1, arg2)
- ifeq 'arg1' 'arg2'
- ifeq "arg1" "arg2"
- ifeq "arg1" 'arg2
- 'ifeq 'arg1' "arg2"
arg1과 arg2에 있는 변수의 참조를 모두 확장하여 그들을 비교한다. 만약 일치한다면 text-if-true 가 적용된다.
- ifneq
- ifneq (qrg1, arg2)
- ifneq 'arg1' 'arg2'
- ifneq "arg1" "arg2"
- ifneq "arg1" 'arg2'
- ifneq 'arg1' "arg2"
arg1과 arg2에 있는 변수의 참조를 모두 확장하여 그들을 비교한다. 만약 일치하지 않는다면 text-if-true 가 적용된다.
- ifdef variable-name
name은 변수에 대한 레퍼런스가 아니라 변수의 이름을 나타낸다.
bar = true
foo = bar
ifdef $(foo)
frobozz = yes
endif
$(foo)는 확장되어 bar가 되고, bar는 참조가 아니라 이름으로 간주된다.
만약 variable-name이 non-empty 값이 아니라면 text-if-true 가 적용된다.
ifdef는 변수를 확장하여 그 값이 비어있는지는 확인하지 않는다(그 이름이 정의 되어 있는지만 확인). non-empty인지 확인하기 위해서는 ifeq($(foo),)를 사용한다.
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
sets ‘frobozz’ to ‘yes’, while:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
sets ‘frobozz’ to ‘no’.
- ifndef variable-name
만약 vraiable-name이 empty 값이라면, text-if-true 가 적용된다.
7.3 Conditionals that Test Flags
findstring 함수와 함께 MAKEFLAGS 변수를 사용하여 -t 와 같은 make command flags를 테스트하는 조건을 쓸 수 있다.
이것은 touch가 파일을 갱신하는데 충분하지 않을 때 유용하다.
findstring 함수는 한 문자열이 다른 부분 문자열로 나타나는지 확인한다. 만약 '-t' 플래그에 대해서 테스트하길 원한다면, 첫번째 문자열로 't'를 사용하고 비교할 다른 문자열로 MAKEFLAGS의 값을 사용한다.
다음은 아카이브 파일을 갱신하는 것에대해 마킹하는것을 종료하기 위해 'ranlib -t'를 사용하는것을 어떻게 정리하는지를 보여준다.
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif