확장자 규칙

MySprtlty·2022년 7월 11일
0

make utility

목록 보기
10/12
post-thumbnail

🏷️확장자 규칙

📌개념

  • gcc는 .c 확장자의 파일을 보고나서, 그 파일이 C소스 파일인 것을 인식한다.

    • C소스 파일인 것을 확인한 후에야, C언어 컴파일러를 내부적으로 호출하는 등의 그에 걸맞는 동작을 수행한다.
    • .abc같은 확장자를 갖는 파일을 gcc가 C소스 파일로 인식하여 번역해주길 바라는 것은 무리다.
  • 또한 각각의 언어는 소스 파일에 암묵적으로 정해진 확장자를 갖고 있다.

    • 이는 확장자를 구별하여, 그 언어에 걸맞는 번역 프로그램을 호출하도록 할 수 있다는 의미다.
      • 🔍ex) .cpp파일은 C++ 컴파일러를 호출하고, .java파일은 java 컴파일러를 호출한다.
  • 이러한 확장자가 가지는 규칙에 기초하여, make는 사용자가 내리는 명령을 알아서 해석하여 컴파일 과정을 자동화 시킬 수 있다.

  • 즉, 확장자 규칙이란 파일의 확장자를 보고, 자동으로 그에 걸맞는 명령을 수행하도록 미리 정의해 놓은 규칙이다.

  • make -p 명령으로 내부적으로 미리 정의되어 있는 확장자 규칙을 볼 수 있다.


📌기본적인 동작 방식

Makefile

  • 다음과 같이 Makefile이 기술되어 있다고 가정하자.
OBJECTS = add.o sub.o main.o

all : calc
calc : $(OBJECTS)
	$(CC) -o $@ $^
  • 현재 디렉터리엔 add.c, sub.c, main.c, calc.h 밖에 없다.
  • add.o, sub.o, main.o를 만들기 위한 룰(rule)이 존재하지 않는다.
  • 🖇️cf) $@$^는 자동 매크로로, 각각 현재 타겟명과 종속 항목 리스트를 뜻한다.

동작 과정

  • 현재 상태에서 make를 수행하면 다음과 같은 과정을 갖는다.
  1. Makefile에서 calc를 생성하기 위해 make는 타겟 calc의 종속 항목들을 살펴보고, 종속 항목들(오브젝트 파일들)을 각각 타겟으로 설정한다.
  2. calc는 add.o에 의존하고 있는데, add.o는 생성되지 않았으며 add.o를 만들기 위한 룰도 Makefile엔 기술되어 있지 않다.
  3. 따라서 make는 확장자가 .o인 내부 확장자 규칙을 이용해, 다음과 같은 기준으로 현재 디렉터리에서 add.o를 생성할 파일을 찾는다.
  • add.o를 생성할 파일을 찾는 기준
    • [✔️] 확장자를 제외한 add와 같은 이름이 존재해야 한다. (add.c가 이에 해당한다.)
    • [✔️] 중요 확장자를 갖고 있어야 한다. (add.c가 이에 해당한다.)
      • 🔍ex) .c, .cpp, .S, etc.
    • [✔️] 내부 확장자 규칙에 따라 add.o를 만드는데 사용 할 수 있어야 한다. (add.c가 이에 해당한다.)
      • %.o : %.c 확장자 규칙이 존재한다.
  1. 파일을 찾았으므로, 내부 확장자 규칙의 명령어를 수행하여 add.o를 생성한다.

📌확장자 규칙 재정의

  • 사용자가 원하는 명령어를 수행하길 바랄 땐, 내부적으로 정의된 확장자 규칙을 재정의하면 된다.
  • 이때 특수 타겟 .SUFFIXES를 사용한다.
    • .SUFFIXES의 종속 항목은 확장자 규칙을 검사하는 데 사용되는 중요한 확장자들의 리스트다.
    • 따라서 확장자 규칙을 사용하길 원하는 확장자는 .SUFFIXES의 종속 항목에 지정해야 한다.

재정의 형식

  • 재정의 형식은 다음과 같다.
.SUFFIXES: .확장자1 .확장자2
%.확장자1 : %.확장자2
	명령어1
    명령어2
  • 확장자1에 대응하는 확장자2를 발견하면 아래 명령을 수행한다.

  • 🔍ex)
.SUFFIXES: .o .c
%.o : %.c
	$(CC) -DDEBUG -c -o $@ $<
  • .o에 대응하는 .c를 발견하면 $(CC) -DDEBUG -c -o $@ $<명령을 수행한다.
  • $<는 확장자 규칙에서만 사용되는 자동 매크로다.
    • 🖇️cf. 이와 반대로 $^는 일반적인 타겟 생성 룰에서만 사용되는 자동 매크로다.
  • $<를 사용하지 않으면, 종속 항목을 지정할 방법이 없다!

0개의 댓글