Makefile 배우기
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 대상자: C/C++ 프로젝트 개발자, 빌드 자동화 담당자, DevOps 엔지니어
- 난이도: 초급에서 중급까지 (기본 개념부터 고급 패턴 규칙까지 다룸)
핵심 요약
- Makefile은 빌드 자동화 및 의존성 관리를 위한 핵심 도구로, 타임스탬프 기반 변경 파일 검출을 통해 변경된 부분만 재컴파일 가능
- 핵심 구조:
타겟: 의존성
+명령어
, 자동 변수($@
,$^
,$<
) 및 패턴 규칙(%.o: %.c
) 활용 - GNU Make 3.0 이상 호환, 탭 문자로 명령어 들여쓰기 필수,
.PHONY
사용 권장 (예:clean
)
섹션별 세부 요약
1. Makefile 기본 개념
- 타겟은 빌드 결과 파일(예:
blah
), 의존성은 타겟 생성 전 조건(예:blah.c
), 명령어는 쉘 스크립트 make hello
실행 시hello
파일이 없으면 명령어 실행, 존재하면 생략- 타임스탬프 기반으로 의존성 검출 (예:
blah: blah.c
→blah.c
변경 시 자동 재컴파일)
2. 고급 기능 및 패턴
- 자동 변수
- $@
: 타겟명, $^
: 모든 의존성, $<
: 첫 번째 의존성
- 예: cc $^ -o $@
- 패턴 규칙
- %.o: %.c
→ foo.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
추천
결론
- Makefile은 GNU Make 기반으로 작성하며, 탭 문자 사용 필수
.PHONY
사용, 패턴 규칙 적용, 변수 확장(wildcard
,$^
등)을 통해 효율성 극대화- 대규모 프로젝트에서는
CMake
/Ninja
, 잡 러너 역할은Task
/just
고려 - Makefile은 C/C++ 빌드 자동화에 최적화되며, 타임스탬프 기반 의존성 관리가 핵심 기능임