본문 바로가기

Makefile은 빌드 자동화를 위한 강력한 도구이며, Makefile 내에서 사용되는 특수 변수(reserved variables)는 빌드 과정을 동적으로 제어하고 유연하게 만듭니다. 이 글에서는 Makefile에서 자주 사용되는 예약 변수특수 변수를 정리하고, 각 변수의 역할과 활용 예제를 제공합니다.

예약 변수 총정리

변수 이름 설명 예제
$(MAKECMDGOALS) 실행 중인 타겟 목록 cdc_quick gzip
$@ 현재 타겟 이름 gcc -o $@
$< 첫 번째 의존성 gcc -c $< -o $@
$^ 모든 의존성 목록 gcc $^ -o program
$? 수정된 의존성 목록 gcc -c $? -o $@
$* 타겟 이름에서 확장자 제거 file.c -> file
$(MAKE) 현재 Make 명령어 $(MAKE) -C subdir
$(CURDIR) 현재 디렉토리 /path/to/current/dir
$(wildcard) 파일 패턴 검색 $(wildcard *.c)
$(filter) 패턴 필터링 $(filter %.o,files)
$(addprefix) 접두사 추가 $(addprefix /build/,main.o)
$(addsuffix) 접미사 추가 $(addsuffix .o,main utils)

1. $(MAKECMDGOALS)

  • 설명: 현재 make 명령어에서 호출된 목표(Target) 목록을 포함합니다.

  • 주요 용도: 실행된 타겟에 따라 동적으로 다른 작업을 수행.

  • 예제:

    all:
        @echo "Targets: $(MAKECMDGOALS)"
    
    clean:
        rm -rf *.o *.log
    • 실행: make clean all
    • 출력: Targets: clean all

2. $@

  • 설명: 현재 타겟(Target)의 이름을 나타냅니다.
  • 주요 용도: 타겟 이름 기반으로 파일 생성 또는 로그 기록.
  • 예제:
    build:
        @echo "Building target: $@"
    • 실행: make build
    • 출력: Building target: build

3. $<

  • 설명: 첫 번째 의존성(Dependency)의 이름을 나타냅니다.
  • 주요 용도: 의존성을 기반으로 파일 처리.
  • 예제:
    output.o: input.c
        gcc -c $< -o $@
    • 실행: make output.o
    • 동작: gcc -c input.c -o output.o

4. $^

  • 설명: 모든 의존성의 이름 목록을 공백으로 구분하여 제공합니다.
  • 주요 용도: 다중 파일 컴파일 또는 링크.
  • 예제:
    program: file1.o file2.o
        gcc $^ -o $@
    • 실행: make program
    • 동작: gcc file1.o file2.o -o program

5. $?

  • 설명: 의존성 중 수정된 파일 목록만 반환합니다.
  • 주요 용도: 변경된 파일만 업데이트.
  • 예제:
    output.o: input.c
        gcc -c $? -o $@
    • 만약 input.c가 수정되었으면 컴파일이 실행됩니다.

6. $*

  • 설명: 타겟 이름에서 확장자(확장자를 포함한 가장 오른쪽 부분)를 제거한 이름을 반환.
  • 주요 용도: 다중 파일 패턴 매칭.
  • 예제:
    %.o: %.c
        gcc -c $< -o $@
    • 실행: make file.o
    • 동작: gcc -c file.c -o file.o

7. $(MAKE)

  • 설명: 현재 실행 중인 Make 명령어의 경로를 나타냅니다.
  • 주요 용도: Make 재귀 호출.
  • 예제:
    subdir:
        $(MAKE) -C subdirectory
    • 실행: make subdir
    • 동작: 하위 디렉토리로 이동하여 Makefile 실행.

8. $(CURDIR)

  • 설명: 현재 디렉토리의 절대 경로를 반환.
  • 주요 용도: 파일 경로 지정 또는 디렉토리 이동.
  • 예제:
    current:
        @echo "Current Directory: $(CURDIR)"
    • 실행: make current
    • 출력: Current Directory: /path/to/current/directory

9. $(wildcard pattern)

  • 설명: 주어진 패턴에 맞는 파일 목록을 반환.

  • 주요 용도: 파일 목록 생성.

  • 예제:

    sources := $(wildcard *.c)
    objects := $(sources:.c=.o)
    
    all: $(objects)
        gcc $^ -o program
    • sources는 현재 디렉토리의 .c 파일 목록.
    • objects는 대응하는 .o 파일 목록.

10. $(filter pattern,text)

  • 설명: 주어진 텍스트에서 패턴에 맞는 항목만 필터링.

  • 주요 용도: 조건부 처리.

  • 예제:

    files := file1.o file2.o file3.c
    objs := $(filter %.o,$(files))
    
    all:
        @echo "Object files: $(objs)"
    • 출력: Object files: file1.o file2.o

11. $(addprefix prefix,names)

  • 설명: 각 항목에 접두사를 추가.

  • 주요 용도: 파일 경로 지정.

  • 예제:

    files := main.o utils.o
    full_paths := $(addprefix /build/,$(files))
    
    all:
        @echo "Paths: $(full_paths)"
    • 출력: Paths: /build/main.o /build/utils.o

12. $(addsuffix suffix,names)

  • 설명: 각 항목에 접미사를 추가.

  • 주요 용도: 파일 확장자 변경.

  • 예제:

    files := main utils
    objects := $(addsuffix .o,$(files))
    
    all:
        @echo "Object files: $(objects)"
    • 출력: Object files: main.o utils.o

결론

Makefile의 특수 변수는 간단한 빌드 스크립트를 복잡한 빌드 자동화 시스템으로 발전시킬 수 있는 강력한 도구입니다. 이 글에서 소개한 변수들을 이해하고 활용하면 Makefile 작성의 효율성과 유연성을 극대화할 수 있습니다. 프로젝트에 맞는 특수 변수를 적절히 사용해 보세요!

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.