글
■ 확장자 규칙이란, 파일의 확장자를 보고 그에 따라 적절한 연산을 수행하도록 미리 정의된 규칙.
: make -p 명령으로 내부적으로 정의되어 있는 확장자 규칙을 확인 할 수 있다.
(1) 확장자 규칙의 사용
: 컴파일러는 확장자를 보고 어떤 프로그래밍 소스파일인지 인식한다.
(ex) $ make -p
- %는 일치하는 확장자를 제외한 파일명을 의미한다.
- gcc 컴파일러는 *.c 파일이 있을 때 확장자 .c를 보고 그 파일이 C 프로그래밍 소스 파일인 것을 인식한다.
- COMPILE.xx : 컴파일러 및 컴파일 옵션을 지정
- OUTPUT_OPTION : -o $< 로 지정
: 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는 memo.o에 의존하고 있으나, memo.o는 만들어지지 않았으며, memo.o를 생성하기 위한 규칙도 정의되지 않았다.
- make는 확장자가 .o인 내부 확장자 규칙을 이용해 다음과 같은 기준으로 현재 디렉토리에서 memo.o를 생성할 파일을 찾는다.
- %o:%c 확장자 규칙에 대응하는 memo.c 파일을 확인한다.
- 내부 정의 확장자 규칙의 $(COMPILE.c) $(OUTPUT_OPTION) $<를 이용해 memo.o를 생성한다.
(4) 내부 확장자 규칙의 재정의
: .SUFFIXES 라는 특수 타겟을 사용하여 확장자 규칙을 재정의 할 수 있다. .SUFFIXES 매크로에 대한 명령어가 명시적으로 지정되지 않을 경우 디폴트 확장자 규칙으로 명령을 실행한다.
- .SUFFIXES의 종속 항목은 확장자 규칙을 검사하는데 사용되는 확장자들의 리스트이다.
(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 $@ $< |
'L inux > Compile' 카테고리의 다른 글
리눅스 프로젝트 빌드(Make/Makefile) - 실행방법 (0) | 2013.03.03 |
---|---|
리눅스 프로젝트 빌드(Make/Makefile) - 더미 타겟의 사용 (0) | 2012.10.23 |
리눅스 프로젝트 빌드(Make/Makefile) - 매크로의 사용 (1) | 2012.10.22 |
리눅스 프로젝트 빌드(Make/Makefile) - Make의 이해 (0) | 2012.10.22 |
'__open_missing_mode' declared with attribute error - compile error (3) | 2012.03.22 |
RECENT COMMENT