본문 바로가기

Linux

Linux) Makefile란?

Makefile은 빌드를 자동화해주는 설정 파일입니다.
make 명령어와 함께 사용되며, 소스 코드를 컴파일하고 실행 파일을 만드는 과정을 쉽게 만들어줍니다.

1. 빌드 자동화

Makefile은 복잡한 빌드 과정을 자동화해줍니다.
빌드에 필요한 파일들을 컴파일하거나 링킹하기 위한 명령어들을 Makefile에 입력하고, 의존성과 순서를 정확히 작성해두면 'make' 명령어 하나만으로 손쉽게 빌드를 수행할 수 있습니다.

2. 점진적 빌드 (Incremental Build)

Makefile은 변경된 파일만 다시 컴파일하는 기능을 통해 전체 빌드 시간을 단축시킵니다.
예를 들어, A 파일이 변경되었을 때, A 파일에 직접적 또는 간접적으로 의존하는 파일만 다시 컴파일합니다.
A 파일과 관련 없는 파일들은 다시 빌드하지 않기 때문에, 불필요한 작업을 줄이고 컴파일 시간을 효과적으로 줄일 수 있습니다.

3. 환경 설정 및 공유

다른 사람과 협업하는 경우, 동일한 환경에서 프로그램을 빌드하고 실행하기 위해 설정이 필요합니다.
Makefile을 이용하면 필요한 소프트웨어 다운로드, 환경 설정, 커스터마이징 등을 자동화하여 동일한 개발 환경을 쉽게 구축할 수 있습니다.

예시: QEMU 기반 에뮬레이션 환경 설정

현재 QEMU를 이용한 에뮬레이션 실행을 목표로 하고 있다고 가정해봅시다.
이때, 에뮬레이션을 위해서는 rootfs와 커널 이미지가 필요합니다.

Rootfs 생성 과정

  1. Buildroot, Yocto 등 리눅스 시스템 구축 프레임워크 설치
  2. .config 파일을 수정하여 시스템 커스터마이징
  3. 수정된 설정을 기반으로 빌드 수행

이 전체 과정을 Makefile로 정의하면 다음과 같은 타겟을 만들 수 있습니다:

buildroot-download:
	if [ ! -e buildroot ]; then \
		wget <다운로드 URL>; \
		tar xvf <압축파일명>; \
		rm <압축파일명>; \
		mv <기존 디렉토리명> <원하는 디렉토리명>; \
	fi

설명:

  • if [ ! -e buildroot ]; then ... fi: buildroot 디렉토리가 없다면 아래 명령어들을 실행합니다.
  • wget: 지정된 URL에서 압축파일을 다운로드합니다.
  • tar xvf: 압축을 해제합니다.
  • rm: 원본 압축파일을 삭제합니다.
  • mv: 디렉토리명을 원하는 이름으로 변경합니다.

✨ 결론

Makefile을 작성하는 이유는 단순한 빌드 자동화를 넘어서, 환경 통일, 협업 효율화, 유지보수 편의성까지 제공하기 때문입니다.
Makefile을 공유함으로써 누구든지 동일한 소프트웨어 환경을 쉽게 구축하고, 빌드를 간편하게 수행할 수 있습니다.