확장자 규칙이란, 파일의 확장자를 보고 그에 따라 적절한 연산을 수행하도록 미리 정의된 규칙.
: make -p 명령으로 내부적으로 정의되어 있는 확장자 규칙을 확인 할 수 있다.


(1) 확장자 규칙의 사용
: 컴파일러는 확장자를 보고 어떤 프로그래밍 소스파일인지 인식한다.

(ex) $ make -p 
 %.o: %.c
 #  실행할 명령어 (내장) :
                 $(COMPILE.c) $(OUTPUT_OPTION) $<

 %.o: %.f

 #  실행할 명령어 (내장) :
                 $(COMPILE.f) $(OUTPUT_OPTION) $<

 %.o: %.S
 #  실행할 명령어 (내장) :
                 $(COMPILE.S) -o $@ $<
- %는 일치하는 확장자를 제외한 파일명을 의미한다.
- gcc 컴파일러는 *.c 파일이 있을 때 확장자 .c를 보고 그 파일이 C 프로그래밍 소스 파일인 것을 인식한다.

- COMPILE.xx : 컴파일러 및 컴파일 옵션을 지정
- OUTPUT_OPTION : -o $< 로 지정

*.c 파일은 C컴파일러를 이용해 *.o 파일로 만들 수 있고, *.f 파일은 포트란 컴파일러를 이용해 *.o 파일을 만들 수 있다.
이런 확장자가 가지는 규칙에 기초해 make는 사용자가 내리는 명령을 알아서 해석해 컴파일 과정을 자동화할 수 있다.


(2) 디폴트 확장자 규칙
: make 유틸리티는 똑똑한 유틸리티이어서 소스파일(.c)을 가지고 목적파일(.o)을 생성해야 한다는 것과 그러기 위해서는 어떤 명령을 사용해야 하는지를 알고 있다.

○ 타겟과 종속성은 있지만 함께 기술했던 명령어가 없이도 make 유틸리티가 스스로 알고있다.
○ make 유틸리티의 디폴트 처리 방식 : ${CC} ${CFLAGS} -c -o $@ $*.c
○ make 유틸리티는 종속성에 의해 .o를 확장자로 하는 타겟을 만날 때마다 이 명령어에 대입한다.


(3) 확장자 규칙 사용의 예

- 확장자 규칙 적용 전 소스

 
-  확장자 규칙 적용 후 소스

- diary를 생성하기 위해 make는 종속 항목을 확인하고, 종속항목을 각각 타겟으로 설정한다.
- diary는 memo.o에 의존하고 있으나, memo.o는 만들어지지 않았으며, memo.o를 생성하기 위한 규칙도 정의되지 않았다.
- make는 확장자가 .o인 내부 확장자 규칙을 이용해 다음과 같은 기준으로 현재 디렉토리에서 memo.o를 생성할 파일을 찾는다.
- %o:%c 확장자 규칙에 대응하는 memo.c 파일을 확인한다.
- 내부 정의 확장자 규칙의 $(COMPILE.c) $(OUTPUT_OPTION) $<를 이용해 memo.o를 생성한다.


(4) 내부 확장자 규칙의 재정의
: .SUFFIXES 라는 특수 타겟을 사용하여 확장자 규칙을 재정의 할 수 있다. .SUFFIXES 매크로에 대한 명령어가 명시적으로 지정되지 않을 경우 디폴트 확장자 규칙으로 명령을 실행한다. 

- .SUFFIXES의 종속 항목은 확장자 규칙을 검사하는데 사용되는 확장자들의 리스트이다.
 .SUFFIXES : .c .o                       # make가 중요하게 여길 확장자 리스트

 .c.o :                                        # .o와 대응되는 .c를 발견하면 다음 명령을 수행 (재정의된 확장자 규칙)
      $(CC) -DDEBUG -c -o $@ $< 



by 민트앤라떼 2012. 10. 22. 18:51