Make 빌드 시스템 1

    Build

    - 한번에 .c 로 빌드하지 말고 각각의 obejct 파일을 만들고 링킹해서 실행파일을 만드는 것이 효율적이다!!

    • object 만들기

    • 실행 파일 만들기


    Make

    • 자동 빌드 도구!!!
    • Makefile 이 있어야 사용 가능 >> Makefile 을 만들 줄 알아야 한다는 뜻
    • 아래 예시는 빌드 후 파일을 수정했을 때 'make' command 만으로 자동 빌드해준 결과

    • make <name>
      • name 만 make 해줌 (name 없이 make 해주면 default 가 실행됨 / default는 첫 target)

    Makefile 만들기

    # 첫 target(default)
    test: test1.o test2.o test3.o #target: prerequisites (만드려는 파일: 만드는데 필요한 의존파일)
    	echo "Linking..."
    	gcc -o test test1.o test2.o test3.o #반드시 tap 으로 command 를 써줘야 함!!
        
    # 아래는 위 파일들이 없는 경우가 있을 수 있으므로 작성하는 내용
    test1.o: test1.c
    	echo "Compile..."
    	gcc -c test1.c
    
    test2.o: test2.c
    	gcc -c test2.c
    
    test3.o: test3.c
    	gcc -c test3.c
    
    # phony target: 선결조건없이 실행하는 target
    clean:
    	-rm test1.o # '-' (ignore) 가 붙는 이유는 test1.o 가 없어도 계속 진행하라는 의미
    	-rm test2.o test3.o
    
    # dependency: 빌드 전에 확인하는 target 으로 정의
    dep:
    	gccmakedep test1.c test2.c test3.c # .c 와 관련된 header 파일을 찾아서 연결해줌
    • makefile 은 필요한 부분들만 실행된다

    • phony target: 항상 실행되는 target

    • dependency: .c 와 관련된 header 등을 check 해준다

                          위처럼 'make dep 를 해주면 Makefile 에 #DO NOT DELETE 를 포함한 아래 부분이 자동으로 추가된다




    Variables & Macro

    Variable 의 이용

    • 이전과 비교하면 'test1.o, test2.o, test3.o' 가 모두 OBJS 라는 변수의 선언과 함께 바뀌었다!!
      (아래 내용을 보면 command 도 대체 가능하다!)
    OBJS = test1.o test2.o test3.o # shell 과 달리 '=' 사이에 공백을 둬도 됨
    
    test: ${OBJS}
    	echo "Linking..."
    	gcc -o test ${OBJS}
    
    test1.o: test1.c
    	echo "Compile..."
    	gcc -c test1.c
    
    test2.o: test2.c
    	gcc -c test2.c
    
    test3.o: test3.c
    	gcc -c test3.c
    
    # pony(dummy) target
    clean:
    	-rm test1.o
    	-rm test2.o test3.o
    
    # dependency
    dep:
    	gccmakedep ${OBJS}

     

    • Internal Macro (Automatic Variables)
    Macro 의미
    $@ 현재의 target 파일명
    $? 현재의 target 보다 더 최근에 갱신된 prerequisites (의존파일)
    $* 현재의 target 보다 더 최근에 갱신된 현재 의존파일 prerequisites (의존파일)명단 (확장자 제외)
    $< prerequisites(의존파일) 중 첫번째 파일명
    $^ 현재 모든 의존파일의 명당
    $+ $^ 와 같으나, 두 번 이상 나열된 전제 조건은 makefile에 나열된 순서대로 복제됨
    $% target 이 library 모듈일 때 멤버에 대응되는 파일명
    Ex) foo.a(bar.o) >> bar.o
    OBJS = test1.o test2.o test3.o
    
    test: ${OBJS}
    	echo "Linking..."
    	gcc -o $@ $^
    
    test1.o: test1.c
    	echo "Compile..."
    	gcc -c $?
    
    test2.o: test2.c
    	gcc -c $*.c
    
    test3.o: test3.c
    	gcc -c $<
    
    # pony(dummy) target
    clean:
    	-rm test1.o
    	-rm test2.o test3.o
    
    # dependency
    dep:
    	gccmakedep ${OBJS}

     

    •  Pre-defined Macro (Variables used by implicit rules)
    Macro 의미
    AR Archive-maintaining program; defalut 'ar'
    ARFLAGS ar 명령어의 옵션 설정
    AS Program for compiling assembly files; default 'as'
    ASFLAGS as 명령어의 옵션 설정
    CC Program for compiling C programs; default 'cc'
    CFLAGS cc 명령어의 옵션 설정
    CXX Program for compiling C++ programs; default 'g++'
    CXXFLAGS g++ 명령어의 옵션 설정
    LD ld
    LDFLAGS 명령어의 옵션 설정
    OBJS = test1.o test2.o test3.o
    #CC = gcc
    #CC = arm-gcc
    CFLAGS = -g -O0 -Wall # flag for compile
    LDFLAGS = -static # flag for linker
    
    test: ${OBJS}
    	echo "Linking..."
    	${CC} -o $@ $^ ${LDFLAGS}
    
    test1.o: test1.c
    	echo "Compile..."
    	${CC} -c ${CFLAGS} $?
    
    test2.o: test2.c
    	${CC} -c ${CFLAGS} $*.c
    
    test3.o: test3.c
    	${CC} -c ${CFLAGS} $<
    
    # pony(dummy) target
    clean:
    	-rm test1.o
    	-rm test2.o test3.o
    
    # dependency
    dep:
    	gccmakedep ${OBJS}

    Tip

    • makefile 의 우선순위
      • GNUmakefile > makefile > Makefile
      • 같은 directory 에 있는 경우에 주의하자!!

     


    참고

    http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html#toc1

    http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-4.html

    '개발자라면? > Linux' 카테고리의 다른 글

    IP 설정, 확인하기  (0) 2022.09.14
    Make 빌드 시스템 2  (0) 2022.09.02
    라이브러리의 동작과 제작  (0) 2022.09.02
    GNU  (0) 2022.09.02
    쉘 & 쉘스크립트  (0) 2022.09.01

    댓글

    Designed by JB FACTORY