tech.junha.kr

노트/Docker

Makefile

작성 수정

  • 빌드 자동화를 위한 파일
  • **make**의 설정 파일
  • 빌드 규칙, 명령어, 의존성이 정의되어있다.

역할

Makefile은 빌드, 테스트, 배포 등 소프트웨어 개발 과정에서 반복되는 작업을 간단하게 자동화하고, 의존성을 관리하여 효율적인 개발 환경을 제공하는 중요한 도구입니다. 특히 큰 프로젝트에서 복잡한 빌드 과정을 단순화하는 데 유용합니다.

  1. 빌드 자동화:
    • Makefile은 소스 코드를 컴파일하고 링크하는 작업을 자동화합니다. 개발자는 컴파일 명령어를 일일이 기억할 필요 없이, make 명령을 사용해 소프트웨어를 쉽게 빌드할 수 있습니다.
  2. 작업 간소화:
    • 코드 빌드 외에도 테스트 실행, 코드 분석, 파일 정리 등 여러 작업을 정의할 수 있습니다. 복잡한 명령어도 하나의 규칙으로 정의해 간단하게 실행할 수 있습니다.
  3. 의존성 관리:
    • Makefile은 파일들 간의 의존성을 관리합니다. 즉, 소스 코드 파일이 수정되면 관련된 파일만 다시 빌드하여 시간과 리소스를 절약할 수 있습니다.

구조

  • **규칙(rule)**들로 구성된다.
  • 규칙은 목표(target), 의존성(dependency), 명령어(commands) 들로 이루어져있다.
target: dependencies
    command
  • target: 만들고자 하는 파일이나 작업입니다.
  • dependencies: target을 만들기 위해 필요한 파일이나 다른 규칙들입니다.
  • command: target을 빌드하거나 목표를 달성하기 위해 실행되는 쉘 명령어입니다. 각 명령어는 탭으로 들여쓰기가 되어야 합니다.

예시

# main.o를 생성하는 규칙
main.o: main.c
    gcc -c main.c -o main.o

# 프로그램을 빌드하는 규칙
my_program: main.o utils.o
    gcc main.o utils.o -o my_program

# 파일을 정리하는 규칙
clean:
    rm -f *.o my_program
  1. main.o를 생성하는 규칙:
    • main.c 파일이 수정되면 이 규칙이 트리거되어 main.o를 재컴파일합니다.
  2. my_program을 빌드하는 규칙:
    • main.o와 utils.o 파일이 준비되면 이를 링크하여 my_program이라는 실행 파일을 만듭니다.
  3. clean 규칙:
    • 빌드된 파일들을 정리하는 작업입니다. make clean 명령어를 실행하면 이 규칙이 실행됩니다.

Makefile의 장점:

  • 반복 작업의 자동화: 컴파일, 테스트, 배포 같은 반복 작업을 쉽게 자동화할 수 있습니다.

  • 효율적인 빌드: 수정된 부분만 재빌드하여 시간을 절약할 수 있습니다.

  • 일관성 유지: 여러 개발자가 참여할 때 동일한 명령어로 작업을 수행하므로 일관성을 유지할 수 있습니다.

  • 명령어

    Makefile을 실행하려면, 터미널에서 make 명령어를 사용하면 됩니다. make 명령어는 현재 디렉토리에 있는 Makefile을 읽고, 정의된 규칙을 실행합니다.

    기본 실행 방법:

    1. 기본 규칙 실행:

      • make 명령어를 입력하면 Makefile에 정의된 첫 번째 규칙이 실행됩니다.
      make
      
    2. 특정 타겟 실행:

      • 특정 규칙(타겟)을 실행하고 싶으면 make 뒤에 타겟 이름을 명시합니다.
      make <target>
      

      예를 들어, clean 규칙을 실행하고 싶다면 다음과 같이 입력합니다.

      make clean
      

    예시:

    위에서 설명한 예시 Makefile을 기준으로:

    • 프로그램을 빌드하려면, make 명령어를 입력합니다. 이 경우 my_program 규칙이 첫 번째 규칙이므로 실행됩니다.

      make
      
    • 만약 빌드된 파일을 정리하고 싶다면, clean 타겟을 명시하여 실행합니다.

      make clean
      

    주의할 점:

    • Makefile 이름: 기본적으로 파일 이름은 Makefile이어야 합니다. 만약 파일 이름이 다르다면, make -f <filename> 형식으로 파일을 지정해서 실행할 수 있습니다.

      make -f MyMakefile
      
  • 타겟 없이 make 실행하면 첫 번째로 정의된 타겟이 실행됩니다. 다른 타겟을 실행하려면 타겟 이름을 명시해야 합니다.

이렇게 make 명령어를 사용하여 Makefile에 정의된 작업을 손쉽게 실행할 수 있습니다.

make와 운영체제

  • 리눅스: make는 기본적으로 리눅스에 포함된 도구입니다. 리눅스 개발 환경에서 자주 사용되며, C/C++ 프로젝트뿐만 아니라 다양한 언어 및 도구에서 빌드를 자동화하는 데 유용합니다.
    • macOS: macOS도 Unix 계열이므로 기본적으로 make 명령어를 사용할 수 있습니다. 다만, Xcode Command Line Tools가 설치되어 있어야 합니다.
    • Windows: Windows에서는 make가 기본적으로 설치되어 있지 않습니다. 하지만 Windows 환경에서도 make를 사용할 수 있는 방법이 있습니다:
      • WSL(Windows Subsystem for Linux): Windows에 WSL을 설치하면 리눅스 배포판에서 make를 사용할 수 있습니다.
      • MinGW, Cygwin: Windows용 리눅스 명령어 툴체인을 설치하면 make를 포함한 여러 Unix 명령어를 사용할 수 있습니다.
      • Git Bash: Git for Windows에 포함된 Bash 쉘을 사용하면 일부 make 명령어를 사용할 수 있습니다.

**make는 주로 Unix 계열 운영체제(리눅스, macOS 등)**에서 사용하는 명령어입니다. make는 빌드 자동화 도구로, 소스 코드의 컴파일, 테스트, 배포 등 여러 반복적인 작업을 자동화하는 데 사용됩니다. 기본적으로 Makefile이라는 파일에 정의된 규칙을 읽고, 그에 따라 빌드 작업을 수행합니다.

결론

make는 리눅스와 macOS 같은 Unix 계열 운영체제에서 주로 사용하는 명령어입니다. 하지만 Windows에서도 위에서 언급한 방법을 통해 사용할 수 있으며, 특히 크로스플랫폼 개발 환경에서는 여전히 중요한 도구로 많이 사용됩니다.