Make build system

Hyungseop Lee·2023년 10월 14일
0

Motivation

  • program이 작다면 하나의 file에 모든 소스코드를 담아서 작성할 수 있다.
    program이 커지게 된다면, 코드의 line이 많아지고 더많은 모듈과 component가 필요.

  • 큰 program을 하나의 file에 담았을 경우,
    어떤 func? component? 호출관계?를 파악하는게 매우 어렵다.
    또한 아주 작은 부분만 고쳐도 파일 전체를 새로 컴파일해야 한다.
    컴파일 시간이 오래 걸린다. 여러 명이 동시에 그 파일에 변경을 가하기가 어렵다.
    따라서 components를 여러 부분으로 나누는 것이 필요함.


Using make in compilation

  • (정리) 대규모 project를 여러 file에 나누어 관리하는 것이 바람직하다.

    1. 각각의 파일들을 compilation해야 하는데 그 명령어를 계속해서 하는 것이 어렵다.
    2. 어떤 파일이 어떻게 변경되었는지 알아야 하고 관리하는 것이 어렵다
    3. 파일들 간의 의존성 관리도 어렵다.
  • 위와 같은 일들을 자동화하여 compile해줄 수 있는 것이 make 명령어이다.
    make는 UNIX에서 사용하는 명령어이다.
    make 명령어는 Makefile을 해석하여 수행시켜준다.

  • [Mm]akefile은 compile에 필요한 rules와 command가 기입된 script file이다.


linux kernel


How make works?

  • 최종적으로 만들고 싶은 프로그램인 가장 상위의 target을 만든다.
    그 target을 만들기 위한 sub file들(object file)을 사용하면 된다.
    하지만 sub file들이 존재하지 않다면 다시 만들어야 한다.

    이렇게 target을 만들기 위해 target이 의존하는 file들을 recursive하게 만들어 간다.
    target이 만들어졌다면, 그 target이 의존하는 file들보다 오래되었을 경우(file 시간 check)만 compile을 새로 한다.

Example

--

makefile의 Rule

  • '#' : 주석
  • '\' : 해당 라인이 끊어지지 않고 다음 라인으로 연결

Dependency Lines

  • 제일 마지막에 생성되어야 하는 target을 첫번째로 작성해야 한다.

  • main.o와 this.o가 둘 다 funcs.h를 의존한다면, target에 두 file을 작성한다
    main.o this.o : funcs.h

Shell Lines

  • indented lines must have TAB.

Macros(variable)

  • Assignment : MACRONAME = marco_value

  • Usage : ${MACRONAME} or $(MACRONAME)

  • example : HOME=/home/seop

Predefined Macros

  • $@ : Full target name
    $* : Name of the target, without suffix(확장자)
    $< : First dependency
    $^ : Name of all dependency
    $? : target보다 최근에 생성된 파일들

  • example :

.Phony target

  • Phony target : target이 file이 아니라 해당되는 action을 호출하기 위해 사용되는 경우가 있다.

  • all : 이 makefile에 있는 모든 규칙들을 적용하라
    install : compile의 결과를 해당 directory에 설치하라
    clean : compile과정 중에서 생성된 여러가지 file들(object file, binary file)을 지워라
    distclean : 실행파일 말고 중간에 생성되는 여러 파일들이 있는데, 그것들을 삭제해라

  • 보통 makefile을 부르는 순서 :
    make (all) -> 전체 compile
    make install -> compile결과가 재위치에 설치됨
    make clean -> 필요없는 file들 지워짐

Example

  • 1:
  • 2 : Predefined Macros
  • 3-1 : 반복되는 단어들에 대해서 Macro 사용
  • 3-2 : 반복되는 단어들에 대해서 Macro 사용
  • 4 : dependency file 만들기

static library linking

  • static library linking :

shared library linking

  • shared library linking :

Recursive make

  • 규모가 있는 project의 경우, 각각의 directory에 make file이 있다.
    각각의 make file은 하위 디렉터리에 있는 make file을 호출해주는 역할 또는
    하위 디렉터리에서 생성된 결과물을 linking해주는 역할만 한다.
    그 하위에 있는 디렉터리의 make file도 그 하위에 있는 디렉터리의 ...
    (recursive)
    그래서 각각의 directory의 makefile들은 self-contained하게 만들고
    상위 디렉터리의 makefile은 그것들을 recurisve하게 호출하도록 만든다.
    '$$d' :
    makefile이 shell에 넘겨줄 때, d를 해석하지 말고 넘겨주라는 escape의미로 사용.
    따라서 shell line에서 variable을 참조할 때 $를 2개 사용.

order-only prerequisite

  • 만약 foo.c를 수정해서 재컴파일하기 위해 make를 했는데, 수정사항이 없는 goo.c와 main.c까지 컴파일이 되어 불필요한 컴파일이 진행되는 것을 막고자 order-only prerequisite를 사용한다.
  • 만약 foo.c만 수정을 해서 make를 했을 때, foo.o만 만들어지도록 하기 위해서는 다음과 같이 한다.
    (foo.c 내용만 수정)
profile
Efficient Deep Learning Model

0개의 댓글