반응형

 

 

1. 주요 키워드

(1) all

Makefile의 기본 목표(target)입니다.
Makefile을 실행할 때 make만 입력하면 기본적으로 all 규칙이 실행됩니다.
일반적으로 전체 빌드 프로세스를 정의하는 데 사용됩니다.

all: program

 

(2) clean

빌드 디렉토리에서 생성된 파일(예: 객체 파일, 실행 파일 등)을 삭제합니다.
일반적으로 빌드 환경을 초기화하는 데 사용됩니다.

clean:
    rm -f *.o program

 

(3) install

빌드된 프로그램이나 파일을 시스템의 특정 위치(예: /usr/local/bin)에 설치합니다.

install:
    cp program /usr/local/bin

 

(4) test

테스트 프로그램을 실행하는 데 사용됩니다.
단위 테스트, 통합 테스트 등을 자동화할 때 유용합니다.

test:
    ./run_tests

 

(5) PHONY

PHONY는 실제 파일 이름과 충돌하지 않도록 특정 타겟을 가상 타겟으로 정의합니다.
clean, all, install과 같은 타겟은 일반적으로 PHONY로 선언됩니다.

.PHONY: all clean install

 

 

2. Makefile의 주요 구성 요소

(1) 변수 (Variables)

변수는 값을 재사용하거나 유지 관리하기 쉽게 합니다.
변수는 = 또는 :=로 정의합니다.

CC = g++
CFLAGS = -Wall -Wextra -g

program: main.o
    $(CC) $(CFLAGS) main.o -o program

 

변수 사용 시에는 $(변수명) 형식으로 참조합니다.

 

(2) 타겟 (Targets)

빌드 대상입니다. 파일 이름이나 가상 타겟 이름(예: all, clean)으로 지정됩니다.
규칙의 왼쪽에 위치하며, Makefile의 실행 단위가 됩니다.

target: dependencies
    commands

 

예시)

program: main.o utils.o
    g++ main.o utils.o -o program

 

(3) 종속성 (Dependencies)

타겟을 빌드하는 데 필요한 파일이나 타겟입니다.
종속성이 변경되었을 때 타겟이 재빌드됩니다.

program: main.o utils.o

 

 

(4) 명령  (Commands)

종속성을 만족시킨 후 실행되는 실제 명령어입니다.
반드시 **탭(tab)**으로 시작해야 합니다.

main.o: main.cpp
    g++ -c main.cpp -o main.o

 

 

3. Makefile의 기본 동작

(1) 규칙 기반 빌드

타겟을 만들기 위해 종속성을 확인하고, 필요한 경우 명령을 실행합니다.

program: main.o utils.o
    g++ main.o utils.o -o program

(2) 내장 규칙 (Implicit Rules)

Makefile은 컴파일 명령을 자동으로 추론합니다.
예: .cpp 파일을 .o로 컴파일

main.o: main.cpp


이 규칙은 컴파일러 g++를 자동으로 사용하여 빌드합니다.

(3) 변수 자동화

Makefile은 내장된 변수들을 제공합니다:

 

$@: 타겟 이름

$<: 첫 번째 종속성

$^: 모든 종속성

main.o: main.cpp
    g++ -c $< -o $@

 

 

4. 주요 내장 변수

(1) CC

컴파일러를 지정합니다. 기본값은 cc입니다.
예: CC = gcc

(2) CFLAGS

컴파일러 옵션을 지정합니다.
예: CFLAGS = -Wall -g

(3) LDFLAGS

링커 옵션을 지정합니다.
예: LDFLAGS = -lm

(4) MAKE

현재 실행 중인 Make 명령을 나타냅니다.

subdir:
    $(MAKE) -C subdir

 

 

5. 간단한 Makefile 예제

(1) 소스 코드 컴파일

CC = g++
CFLAGS = -Wall -Wextra -g

SRC = main.cpp utils.cpp
OBJ = $(SRC:.cpp=.o)
TARGET = program

all: $(TARGET)

$(TARGET): $(OBJ)
    $(CC) $(CFLAGS) $^ -o $@

%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f $(OBJ) $(TARGET)

.PHONY: all clean

 

(2) 실행

make       # 프로그램 빌드
make clean # 빌드 결과물 삭제
반응형

'Build > Make' 카테고리의 다른 글

[Make] Makefile에서 내장 변수 $@, $<, $^ 의 의미  (0) 2024.11.21
Makefile (MK 파일) 기본 문법 - 1  (0) 2022.04.27