[MAKE] Conditional Parts

CS/Shell/Perl/Python 2011. 6. 8. 15:18
원문 GNU make
 

7.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가지 지시자가 있다
  1. ifeq
    • iffeq (qrg1, arg2)
    • ifeq 'arg1' 'arg2'
    • ifeq "arg1" "arg2"
    • ifeq "arg1" 'arg2
    • 'ifeq 'arg1' "arg2"
      arg1과 arg2에 있는 변수의 참조를 모두 확장하여 그들을 비교한다. 만약 일치한다면 text-if-true 가 적용된다.
       
  2. ifneq
    • ifneq (qrg1, arg2)
    • ifneq 'arg1' 'arg2'
    • ifneq "arg1" "arg2"
    • ifneq "arg1" 'arg2'
    • ifneq 'arg1' "arg2"
      arg1과 arg2에 있는 변수의 참조를 모두 확장하여 그들을 비교한다. 만약 일치하지 않는다면 text-if-true 가 적용된다.
       
  3. 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’.

     
  4. 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

'+' 접미어는 명령행 라인이 '-t' 플래그를 사용했음에도 불구하고 실행될 수 있게 하기 위해 "recursive" 하다는 것을 표시한다. (Section 5.7 Recursive Use of make 참고)
: