Makefile 만드는 방법 기초

linux에서 Makefile을 모르면 linux사용할 때 답답해집니다. ms윈도우즈는 장치에 대한 드라이버를 바이너리파일로 지원하여 setup이라는 프로그램을 실행하면 자동으로 설치가 되지만, linux는 꼭 그렇지 않습니다. 일반적으로 드라이버를 소스파일로 지원을 하여 gcc로 컴파일 한 후에 사용해야 합니다.

이때 소스파일이 여러게 있을 경우에는 컴파일이 복잡 해 지므로 Makefile이라는 파일을 함께 제공합니다. 사용자는 이 Makefile을 이용해서 컴파일을 하게 됩니다.

그럼 Makefile의 어떻게 만드는지 알아보도록 하겠습니다. 예제 방식으로 설명을 하겠습니다. 사이트를 뒤져보면 영어원문을 그대로 해석해 놓은 것이 많은데 초보자 분들은 이해하기 힘든 부분이 많이 있을 것입니다.


c파일 test1.c, test2.c, test3.c 에 사용되는 헤더파일 stdio.h 일때 각각을 컴파일하여 모두를 링크해서 test라는 실행파일을 만들어 보겠습니다.

- 일반적인 방식으로 컴파일 링크하는 방법

    # gcc -c test1.c     [test1.o가 만들어집니다.]

    # gcc -c test2.c     [test2.o가 만들어집니다.]

    # gcc -c test3.c     [test3.o가 만들어집니다.]

    # gcc -o test test1.o test2.o test3.o    [test가 만들어집니다.]


- Makefile로 컴파일 하는 방법

    test    :  test1.o test2.o test3.o

               gcc -o test test1.o test2.o test3.o

    test1.o :  stdio.h test1.c

               gcc -c test1.c

    test2.o :  stdio.h test2.c

               gcc -c test2.c

    test3.o :  stdio.h test3.c

               gcc -c test3.c

  일반적인 컴파일 방식보다 더 복잡해 보이나 컴파일 파일수가 많아질수록 Makefile이 유리하게 됩니다.   Makefile 그냥 봐도 이해가 가시겠지요. 위의 일반적인 방식과 비교해보세요.

만들어진 Makefile을 이용해서 컴파일 하려면

    # make [enter key]

이렇게 하면 됩니다.


메크로를 사용해서 Make파일 만드는 방법에 대해 이야기를 해 보겠습니다.

메크로라는 의미는 여러개의 명령이나 문자열등을 한 개의 label로 표현하는 방식을 말합니다.

위의 예에서 test1.o test2.o test3.o을 메크로로 정의 해보겠습니다.

    MACRO   : test1.o test2.o test3.o

    test    : $(MACRO)

              gcc -o $(MACRO)

    test1.o : stdio.h test1.c

              gcc -c test1.c

    test2.o : stdio.h test2.c

              gcc -c test2.c

    test3.o : stdio.h test3.c

              gcc -c test3.c

여러 가지 반복되는 것을 하나로 표현 하게 됩니다.


# make test 이렇게 하면 실행파일 test를 만들고,

# make clean 이렇게 하면 파일 test1.o test2.o test3.o을 모두 지우는 기능을 하도록

Makefile을 만들어 보면

    MACRO   : test1.o test2.o test3.o

    test    : $(MACRO)

              gcc -o $(MACRO)

    test1.o : stdio.h test1.c

              gcc -c test1.c

    test2.o : stdio.h test2.c

              gcc -c test2.c

    test3.o : stdio.h test3.c

              gcc -c test3.c

    clear   : rm $(MACRO)


make내부에 정의된 메크로가 있으나 신경 쓸 필요가 없습니다. 리눅스 콘솔에서 make -p 라고 타이핑하면 정의된 메크로가 아주 많이 나옵니다. 하지만 신경쓰지 마십시오.

메크로를 더 많이 사용해서 Makefile을 만들어 보면 아래와 같습니다.

    MACRO = test1.o test2.o test3.o

    CC = gcc

    CFLAGS = -g -c

    TARGET = test

    $(TARGET) : $(MACRO)

    $(CC) -o $(TARGET) $(MACRO)

    clean   : rm -rf $(MACRO) $(TARGET)

    test1.o : stdio.h test1.c

    test2.o : stdio.h test2.c

    test3.o : stdio.h test3.c


ifeq명령어를 사용해 봅시다.

    PLATFORM = PC386    

    #PLATFORM = ARM

    ifeq ($(PLATFORM),PC386)

               gcc test.c

    endif

    ifeq ($(PLATFORM),ARM)

               gccarm test.c

    endif


위의 예제는 PC386 의 gcc를 이용해서 컴파일이 되는 것 이구요. arm으로 크로스컴파일을 할 경우

    #PLATFORM = PC386    

    PLATFORM = ARM

이렇게 하면 됩니다.



일반적인 make

#make clean      만들어진 파일을 모두 지움

#make mrproper   설정된 컴파일 옵션을 모두 지우고 다시한다. make xconfig 안의 설정 

#make menuconfig  터미널에서 make config

#make xconfig   엑스윈도우에서 config