Makefile 배우기: C/C++ 빌드 자동화 가이드
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Makefile 배우기

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

DevOps

대상자

  • 대상자: C/C++ 프로젝트 개발자, 빌드 자동화 담당자, DevOps 엔지니어
  • 난이도: 초급에서 중급까지 (기본 개념부터 고급 패턴 규칙까지 다룸)

핵심 요약

  • Makefile빌드 자동화 및 의존성 관리를 위한 핵심 도구로, 타임스탬프 기반 변경 파일 검출을 통해 변경된 부분만 재컴파일 가능
  • 핵심 구조: 타겟: 의존성 + 명령어, 자동 변수($@, $^, $<) 및 패턴 규칙(%.o: %.c) 활용
  • GNU Make 3.0 이상 호환, 탭 문자로 명령어 들여쓰기 필수, .PHONY 사용 권장 (예: clean)

섹션별 세부 요약

1. Makefile 기본 개념

  • 타겟은 빌드 결과 파일(예: blah), 의존성은 타겟 생성 전 조건(예: blah.c), 명령어는 쉘 스크립트
  • make hello 실행 시 hello 파일이 없으면 명령어 실행, 존재하면 생략
  • 타임스탬프 기반으로 의존성 검출 (예: blah: blah.cblah.c 변경 시 자동 재컴파일)

2. 고급 기능 및 패턴

  • 자동 변수

- $@: 타겟명, $^: 모든 의존성, $<: 첫 번째 의존성

- 예: cc $^ -o $@

  • 패턴 규칙

- %.o: %.cfoo.o: foo.c와 같은 규칙 자동 생성

- 예: $(objects): %.o: %.c → 여러 오브젝트 파일 동시 빌드

3. 실전 예시 및 주의사항

  • .PHONY 사용: clean 타겟의 경우 clean 파일명과 혼동 방지

- 예: .PHONY: clean

  • 변수 정의

- files := file1 file2$(files)로 참조

- wildcard 함수로 파일 패턴 처리 (예: $(wildcard *.c))

4. Makefile 대안 및 한계

  • C/C++ 외 언어: Python, Ruby 등은 인터프리터 언어로 Makefile 필요성 낮음
  • 대안 도구: CMake, Bazel, Task, just
  • Make의 한계: 잡 러너로서는 조건문 처리가 복잡, 대규모 프로젝트에서는 CMake/Ninja 추천

결론

  • MakefileGNU Make 기반으로 작성하며, 탭 문자 사용 필수
  • .PHONY 사용, 패턴 규칙 적용, 변수 확장(wildcard, $^ 등)을 통해 효율성 극대화
  • 대규모 프로젝트에서는 CMake/Ninja, 잡 러너 역할은 Task/just 고려
  • MakefileC/C++ 빌드 자동화에 최적화되며, 타임스탬프 기반 의존성 관리가 핵심 기능임