2.5. Make를 사용하여 더 많은 코드 관리

GNU make 유틸리티는 일반적으로 축약된 make 에서 소스 파일에서 실행 파일 생성을 제어하는 도구입니다. 복잡한 프로그램의 어떤 부분이 변경되었으며 다시 컴파일해야 하는지 확인합니다. make 는 Makefiles라는 설정 파일을 사용하여 프로그램이 빌드되는 방식을 제어합니다.

2.5.1. GNU makeMakefile 개요

특정 프로젝트의 소스 파일에서 사용 가능한 양식(일반적으로 실행 파일)을 만들려면 몇 가지 필수 단계를 수행합니다. 작업 및 해당 시퀀스를 기록하여 나중에 반복할 수 있습니다.

Red Hat Enterprise Linux에는 이러한 목적을 위해 설계된 빌드 시스템인 GNU make 가 포함되어 있습니다.

사전 요구 사항

  • 컴파일 및 연결의 개념 이해

GNU make

GNU make 는 빌드 프로세스를 설명하는 지침이 포함된 Makefiles를 읽습니다. Makefile에는 특정 조건(대상)을 충족하는 방법을 설명하는 특정 작업(메시피)을 설명하는 여러 규칙이 포함되어있습니다. 규칙은 다른 규칙에 따라 계층적으로 달라질 수 있습니다.

옵션 없이 make 를 실행하면 현재 디렉터리에서 Makefile을 찾아 기본 대상에 도달하려고 시도합니다. 실제 Makefile 파일 이름은 Makefile,makefileGNUmakefile 중 하나일 수 있습니다. 기본 대상은 Makefile 콘텐츠에서 결정됩니다.

Makefile 세부 정보

makefiles는 타겟레시피로 구성된 변수규칙을 정의하는 비교적 간단한 구문을 사용합니다. target은 규칙이 실행되는 경우 출력을 지정합니다. 레시피가 포함된 행은 TAB 문자로 시작해야 합니다.

일반적으로 Makefile에는 소스 파일을 컴파일하는 규칙, 결과 개체 파일을 연결하는 규칙 및 계층 구조의 맨 위 진입점 역할을 하는 대상이 포함됩니다.

단일 파일 hello.c 로 구성된 C 프로그램을 빌드하려면 다음 Makefile 을 고려해 보십시오.

all: hello

hello: hello.o
        gcc hello.o -o hello

hello.o: hello.c
        gcc -c hello.c -o hello.o

이 예에서는 대상에 도달하기 위해 hello 파일이 필요함 을 보여줍니다. hello를 얻으려면 hello .o (gcc로 링크됨 )가 필요하며 hello.c (gcc에 의해 컴파일됨 )에서 생성됩니다.

target all 은 마침표(.)로 시작하지 않는 첫 번째 대상이기 때문에 기본 대상입니다. 인수 없이 make 를 실행하면 현재 디렉터리에 이 Makefile 이 포함된 경우 실행 중인 make 와 같습니다.

일반적인 Makefile

더 일반적인 Makefile에서는 단계를 일반화하기 위해 변수를 사용하고, 대상 "clean"을 추가합니다. - 소스 파일을 제외한 모든 항목을 제거합니다.

CC=gcc
CFLAGS=-c -Wall
SOURCE=hello.c
OBJ=$(SOURCE:.c=.o)
EXE=hello

all: $(SOURCE) $(EXE)

$(EXE): $(OBJ)
        $(CC) $(OBJ) -o $@

%.o: %.c
        $(CC) $(CFLAGS) $< -o $@

clean:
        rm -rf $(OBJ) $(EXE)

이러한 Makefile에 소스 파일을 추가하려면 SOURCE 변수가 정의된 행에만 추가하면 됩니다.

추가 리소스

2.5.2. 예제: Makefile을 사용하여 C 프로그램 빌드

이 예제의 단계에 따라 Makefile을 사용하여 샘플 C 프로그램을 빌드합니다.

사전 요구 사항

  • Makefiles의 개념을 이해하고 만들어야 합니다.

절차

  1. hellomake 디렉터리를 생성하고 이 디렉터리로 변경합니다.

    $ mkdir hellomake
    $ cd hellomake
  2. 다음 콘텐츠를 사용하여 hello.c 파일을 생성합니다.

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      printf("Hello, World!\n");
      return 0;
    }
  3. 다음 콘텐츠를 사용하여 Makefile 파일을 생성합니다.

    CC=gcc
    CFLAGS=-c -Wall
    SOURCE=hello.c
    OBJ=$(SOURCE:.c=.o)
    EXE=hello
    
    all: $(SOURCE) $(EXE)
    
    $(EXE): $(OBJ)
            $(CC) $(OBJ) -o $@
    
    %.o: %.c
            $(CC) $(CFLAGS) $< -o $@
    
    clean:
            rm -rf $(OBJ) $(EXE)
    중요

    Makefile 레시피 행은 탭 문자로 시작해야 합니다! 설명서에서 위의 텍스트를 복사하는 경우 cut-and-paste 프로세스는 탭 대신 공백을 붙여넣을 수 있습니다. 이 경우 문제를 수동으로 수정합니다.

  4. make: 실행

    $ make
    gcc -c -Wall hello.c -o hello.o
    gcc hello.o -o hello

    그러면 실행 가능한 파일 hello 가 생성됩니다.

  5. 실행 파일 hello:

    $ ./hello
    Hello, World!
  6. Makefile target clean 을 실행하여 생성된 파일을 제거합니다.

    $ make clean
    rm -rf hello.o hello

2.5.3. Make에 대한 문서 리소스

make 에 대한 자세한 내용은 아래 나열된 리소스를 참조하십시오.

설치된 문서

  • maninfo 툴을 사용하여 시스템에 설치된 도움말 페이지와 정보 페이지를 확인합니다.

    $ man make
    $ info make

온라인 문서