Makefile - 2. Makefile의 기본 문법 (2-1. 변수 (Variables))

2025. 3. 11. 18:59개발/개발도구와 환경

📌 2-1. 변수 (Variables)

Makefile에서 변수(Variable)는 빌드 과정에서 자주 사용되는 값(컴파일러, 플래그, 파일 목록 등)을 효율적으로 관리하는 데 사용됩니다.
변수를 활용하면 코드를 간결하게 유지하고, 유지보수성을 높일 수 있으며, 명령줄에서 쉽게 값을 변경할 수도 있습니다.


1. 변수를 사용하는 이유

📌 1-1. 변수 활용의 장점

코드의 가독성 향상

  • 변수 없이 동일한 값이 여러 번 반복되면 유지보수하기 어려움.
  • 변수를 사용하면 재사용성 증가코드 간결화 가능.

유지보수 용이

  • 특정 값을 변경해야 할 때, 한 곳에서 수정하면 전체에 적용됨.
  • 예를 들어, 컴파일러를 gcc에서 clang으로 변경해야 한다면, 변수를 활용하면 쉽게 변경 가능.

플랫폼 독립적인 코드 작성 가능

  • 시스템에 따라 다른 컴파일러, 플래그, 디렉토리를 설정할 수 있음.
  • 예를 들어, Windows와 Linux에서 다른 컴파일 옵션을 적용할 수 있음.

빌드 과정의 유연성 증가

  • 명령줄에서 변수를 재정의하여 특정 설정을 쉽게 변경할 수 있음.
  • 예를 들어, make DEBUG=1을 실행하면 디버깅 옵션을 추가할 수도 있음.

2. 변수 정의 및 사용 방법

📌 2-1. 변수 정의

Makefile에서 변수는 다음과 같은 방식으로 정의됩니다.

변수이름 = 값

🔹 예제

CC = gcc
CFLAGS = -Wall -g
SRC = main.c utils.c
OBJS = main.o utils.o
TARGET = myprogram
  • CC → 사용할 컴파일러 (gcc)
  • CFLAGS → 컴파일 옵션 (-Wall -g)
  • SRC → 소스 파일 목록 (main.c utils.c)
  • OBJS → 오브젝트 파일 목록 (main.o utils.o)
  • TARGET → 최종 실행 파일 (myprogram)

📌 2-2. 변수 사용

변수를 사용할 때는 $() 또는 ${}를 사용합니다.

$(변수이름)

또는

${변수이름}

🔹 예제

CC = gcc
CFLAGS = -Wall -g
SRC = main.c utils.c
OBJS = main.o utils.o
TARGET = myprogram

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

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

utils.o: utils.c
	$(CC) $(CFLAGS) -c utils.c

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

이점

  • $(TARGET)을 사용하면 실행 파일 이름을 쉽게 변경할 수 있음.
  • $(OBJS)를 사용하면 소스 코드가 추가되거나 삭제될 때 한 곳만 수정하면 됨.

3. 변수의 재정의 (명령줄에서 make VAR=value 사용)

📌 3-1. 기본적인 변수 재정의

Makefile에서 변수를 설정했더라도, 명령줄에서 값을 변경할 수 있음.
이는 빌드 옵션을 다르게 적용할 때 매우 유용합니다.

make CFLAGS=-O2
  • CFLAGS의 기본값은 -Wall -g였지만, 실행 시 -O2로 변경됨.

🔹 Makefile 예제

CC = gcc
CFLAGS = -Wall -g

all:
	$(CC) $(CFLAGS) -o myprogram main.c utils.c
make CFLAGS=-O3

➡ gcc -O3 -o myprogram main.c utils.c 실행됨.


📌 3-2. 환경 변수 활용

Makefile에서 ?= 연산자를 사용하면 환경 변수 값이 있는 경우 우선 적용할 수 있습니다.

CFLAGS ?= -Wall -g
export CFLAGS=-O2
make

➡ 환경 변수 CFLAGS=-O2가 적용됨.


📌 3-3. 변수 값의 추가 및 변경

  • += 연산자를 사용하면 기존 값에 새로운 값을 추가할 수 있음.

🔹 예제

CFLAGS = -Wall
CFLAGS += -g

➡ CFLAGS 값은 -Wall -g가 됨.

make CFLAGS="-O2"

➡ CFLAGS 값이 -O2로 변경됨.


📌 2-1. 변수(Variables) 요약 정리

개념  설명
변수 정의 변수이름 = 값 형식으로 선언
변수 사용 $(변수이름) 또는 ${변수이름} 사용
변수 재정의 make VAR=value로 명령줄에서 변경 가능
환경 변수 적용 ?=를 사용하면 환경 변수 값을 우선 적용
변수 값 추가 += 연산자로 기존 값에 추가 가능