시냅스

Makefile : 컴파일을 쉽게 하자! 본문

C

Makefile : 컴파일을 쉽게 하자!

ted k 2022. 3. 10. 01:09

Makefile에 앞서...

컴파일 단계

 

출처 : https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html

 

1. Preprocessor (전처리 단계)

  • 전처리기가 전처리기 지시자(헤더, 매크로)를 처리한다.
  • 소스코드를 담고있는 c파일로부터 i를 생성한다. .c -> .i

 

2. Compiler (컴파일 단계)

  • 전처리된 파일에서 .i -> .s를 생성한다.
  • .s 파일은 어셈블리어 코드로 이루어져 있다.


3. Assembler (어셈블 단계)

  • .s -> 기계어로 이루어진 .o 생성

 

4. Linking (링킹 단계)

  • .o (object) 파일은 라이브러리 함수가 없기 떄문에 라이브러리와 .o 파일을 링킹하여 .exe 파일을 생성한다.

 

 

Makefile

Makefile을 통해 컴파일 단계들을 대량으로 제어하거나, 처리하기 쉽게 할 수 있다.

중요한 키워드는 Incremental build로, 간략하면 중복처리나 최신화에 용이하다는 것이다.

 

Microsoft

 

증분 빌드 - MSBuild

최신 출력 파일이 실행되지 않도록 최적화된 MSBuild 증분 빌드에 대해 알아봅니다.

docs.microsoft.com

에 자세한 설명이 되어있다.

 

 

규칙 및 패턴

 

목표 파일 (target) : 의존성 (dependencies)
	레시피 (recipe)

# e.g.
target : target.c
	gcc target.c
# 변수
CC=<컴파일러>
CFLAGS=<컴파일 옵션>
LDFLAGS=<링크 옵션>
LDLIBS=<링크 라이브러리 목록>
OBJS=<Object 파일 목록>
TARGET=<빌드 대상 이름>

# 매크로
all: $(TARGET)
 
clean:
    rm -f *.o
    rm -f $(TARGET)

$(TARGET): $(OBJS)
	$(CC) -o $@ $(OBJS)

 

 

자동 변수

Makefile에 내장되어 있는 변수

  • $@ : target 의 파일 이름
  • $< : 첫 번째 의존성의 파일 이름
  • $? : 목표 파일 이전에 갱신된 모든 의존성 파일 이름
  • $^ : 모든 의존성의 파일 이름

 

 

내장 함수

dir : 디렉토리 부분을 추출

$(dir src/memo   main)
#     src/       ./

notdir : 디렉토리 아닌 부분을 추출

$(notdir src/memo   main)
#        memo       main

suffix : 접미사(확장자)를 추출

$(suffix  .c, memo.c main.c)
#               memo   main

basename : 접미사를 제외한 부분을 추출

$(notdir src/memo.c   main)
#        src/memo     main

addsuffix : 접미사를 각 이름 끝에 더한다.

$(addsufix  .c, memo   main)
#               memo.c main.c

addprefix : 접두사를 이름 앞에 더한다. 

$(addprefix  src/, memo   main)
#                 src/memo src/main.c

 

 

Phony target

실제 파일 명과 매크로와의 충돌을 막아주거나 성능 개선에 도움을 줄 수 있다.

.PHONY: clean
clean:
        rm *.o temp

https://www.gnu.org/software/make/manual/make.html#Phony-Targets

 

GNU make

 

www.gnu.org

 

Comments