make 유틸리티의 핵심은 빌드 Target 간의 종속성을 파싱하고 소스 컴파일을 순서에 맞게 처리하는 것이다.
( 여기서 Target 이란 빌드 과정에서 생성되는 모든 결과물을 말한다.
예를 들어 아래 Product 라는 이미지를 만들기 위한 소스 구조를 살펴보면 Target 은
src1.o , src2.o, main.o , libtools.a , Product 가 된다. )
이런 빌드 핵심 처리를 이해하기 위해 간단히 아래의 예를 살펴보도록 하자.
종속성
위 그림중 일부만 설명하자면 src1.h 와 src1.c 는 src1.o 오브젝트 파일을 만들기 위해 사용되며
이는 최종 Product 이미지를 뽑기 위해 사용되고 Product 는
여러 오브젝트들이 합쳐 생성됨을 나타낸 것이다.
이런 상황에서 src2.c 와 main.c 파일이 변경된다면 어떤 오브젝트 파일들을 다시 만들어야 할까?
답은 간단히 연관된 모든 오브젝트 파일 src2.0, main.o 와 최종 Product 이미지가 된다.
하지만 소스는 최대한 중복을 피하고자 여러 오브젝트 파일의 구성에 사용되는 경우가 많다.
예를 들면 tools.h 파일은 main.o 와 libtools.a 오브젝트 파일을 만들때 사용되며 이 파일을 수정하면
결과적으로 main.o , libtools.a 오브젝트 파일 모두 다시 컴파일 되며
Product 이미지도 다시 생성되어야 한다.
이렇듯 최종 빌드 결과물을 만들어내기 위한 과정은 단순하지 않으며 여러 종속성을 포함하게 된다.
컴파일
빌드 명령은 여러 소스 파일과 여러 컴파일러 옵션을 사용해 이루어진다.
예를 들어 아래와 같은데 이런 옵션을 다 기억하고 수동으로 하나 하나 빌드해야 한다거나
소스가 추가되어 해당하는 소스를 임의로 사용자가 추가해야 한다면
하나하나 일일히 비교해서 달라진점을 찾는 것부터 옵션을 설정하는 부분까지 정말 힘들지 않을 수 없을 것이다.
Makefile
Makefile 은 빌드의 핵심인 종속성과 컴파일 과정을 효율적으로 처리하기 위해 고안되었으므로
빌드 프로세스를 반복 작업을 최소화 하면서 설계할 수 있는 다양한 방법들을 제공한다.
물론 다양한 방법들이 쉬운건 아니지만 저 위에 나열한 모든 일을 수작업으로 하는 것보다는 당연히
훨씬 쉬운일이 될 것이다.
'Build > Make' 카테고리의 다른 글
06. Variable (0) | 2020.01.22 |
---|---|
05. Rule 의 구성 (0) | 2020.01.22 |
04. Makefile 의 구성 (0) | 2020.01.22 |
03. make 유틸리티 사용 (0) | 2020.01.22 |
01. make Utility 와 Makefile (0) | 2020.01.22 |