2009-02-03 4 views
46

많은 반복적 인 내용으로 Makefile을 작성하고 있습니다. 타겟 'SYST'가 정의 Makefile의 함수

debug_ifort_Linux: 
     if [ $(UNAME) = Linux ]; then       \ 
      $(MAKE) FC=ifort FFLAGS=$(difort) PETSC_FFLAGS="..." \ 
        [email protected] LEXT="ifort_$(UNAME)" -e syst;  \ 
     else             \ 
      echo $(err_arch);          \ 
      exit 1;            \ 
     fi 

변수 'UNAME'는 정의 (리눅스는 일반적이지만, 또한 시그윈 또는 OSF1가 있음)와 변수 "difort '및'err_arch"도 정의되어있다 . 이 코드 블록은 다른 컴파일러 타겟 (' '이라는 이름 규칙을 사용)에 매우 많이 사용됩니다. 이것은 많은 양의 중복 코드이므로 더 간단한 방법으로 작성할 수 있기를 바랍니다. 예를 들어 다음과 같이하고 싶습니다.

여기서 compile은 인수를 기반으로 위 코드를 수행하는 함수가 될 수 있습니다. 아무도 내가 이것을 성취 할 수있는 어떤 생각을 가지고 있습니까?

답변

35

3 개 관련 개념이 있습니다

  1. call function
  2. multi-line variables
  3. conditionals

리팩토링 결과는 다음과 같을 수 있습니다 :

ifeq ($(UNAME),Linux) 
    compile = $(MAKE) FC=$(1) FFLAGS=$(2) PETSC_FFLAGS=$(3) \ 
         [email protected] LEXT="$(1)_$(UNAME)" -e syst 
else 
    define compile = 
     echo $(err_arch) 
     exit 1 
    endef 
endif 


debug_ifort: 
     $(call compile,ifort,$(difort),"...") 

그 중 하나가 \ 인 경우 쉘에 대해 $(MAKE) 행을 계속 수행하는 것입니다. 여기에는 한 줄의 쉘 코드 만 있으므로 여러 줄 변수가 필요하지 않습니다. 여러 줄 변수는 else 블록에서만 사용됩니다. 버전 3.82 이전에 =을 사용 :

[편집]주 (canned recipes 참조) = 할당을 그냥 $(compile)와 방법을 확장 :이 매개 변수를 필요로하지 않는 경우

당신은 사용할 수 있습니다 나에 대한 정의문의 끝에서 인식되지 않았다. 대신 define compile을 사용하여이 문제를 해결했습니다.

+0

이것이 현재 올바른 것으로 표시된 이전 답장보다 나은 이유는 무엇입니까? –

+1

\가 아닌 여러 줄 변수를 사용해야합니다. 다시 한번 "너무 복잡하여 그 대답을 편집 할 수 없습니다"(지금까지 리뷰를받은 한) – JonnyJD

+0

여러 줄 변수를 설명하는 것은 주석을 작성하는 데 너무 많은 부분입니다. 물론 당신은 동의 할 필요가 없습니다. – JonnyJD

36

당신은 call function을 찾고 있습니다. 당신이 당신의 Makefile 약간의 구조 조정을 할 수 있다면 당신은 makeconditionals 대신 sh의 년대를 사용할 수 있는지

compile =             \ 
     if [ $(UNAME) = $(1) ]; then      \ 
      $(MAKE) FC=$(2) FFLAGS=$(3) PETSC_FFLAGS="..." \ 
        [email protected] LEXT="$(4)_$(UNAME)" -e syst; \ 
     else            \ 
      echo $(err_arch);        \ 
      exit 1;           \ 
     fi 

debug_ifort_Linux: 
     $(call compile,Linux,ifort,$(difort),ifort) 

하지만, 당신은 볼 수 있습니다.

+1

감사합니다. :) make의 조건부를 사용하여 내가 원하는 것과 동일한 작업을 수행하는 방법을 직접 볼 수 없습니다. 최소한 구조 조정 없이는. 물론 이것은 메이크 파일을 작성하는 데 익숙하지 않기 때문일 수도 있습니다 ... –

+0

[멀티 라인 변수] (http://www.gnu.org/software/make)를 사용해야하는 대표적인 예입니다. /manual/html_node/Multi_002dLine.html). – JonnyJD