Rule
Rule 이란 타겟을 빌드하기 위한 그룹이며 보통 아래의 3가지 요소로 구성된다.
Target 은 실행 가능한 파일이나 오브젝트 파일이 되며
Prerequiste 는 Target 을 구성하기 위한 소스 파일이나 오브젝트 파일인 경우가 많다.
그리고 Rule은 Prerequiste 를 통해 Target 을 만들기 위한 Command 명령이 위치한다.
그래서 전형적인 Makefile 의 모습은 보통 아래와 같다고 보면 된다.
Target
Recipe 에 의해 만들어지는 결과물이다.
Prerequisite (Dependency)
Target 이 생성되기 위해 필요한 파일이다.
바꿔말하면 해당 파일이 변경되면 관련된 Target 은 재생성되어야 한다는 것도 의미한다.
Prerequisite type 에는 Normal-Prerequisite 와 Order-only Prerequisite 의 두 종류가 있다.
Normal-Prerequisite
Target 의 Command 가 실행되기 전에
Dependencies 를 위한 Command 들이 먼저 실행된다.
Order-only Dependencies
Prerequisite 를 위한 Recipe 들이 먼저 실행만 하고
Target 자체는 갱신되지 않기를 바라는 경우 아래 사용한다.
targets : normal-Dependencies | Order-only-Dependencies
Normal-Dependencies 가 없다면 "|" 왼쪽은 빈공간으로 남기면 된다.
Recipe (Command)
선행조건이 만족될 때 수행될 명령이며 보통 한줄씩 실행되는 쉘 명령 라인들로 이루어진다.
개행 형태로 사용시 Recipe 앞에는 반드시 <TAB> 문자를 넣거나 ; 으로 Recipe 를 연달아 써야 한다.
이외에 아래와 같은 일반적인 특징이 있다.
-
빈 라인들과 주석뿐인 라인들은 Command 의 사이에 올 수 있다.
-
빈 라인들의 경우도 Tab 으로 시작하면 Empty Commands 로 해석된다.
-
다른 쉘 명령들을 사용할 수 있지만 makefile 이 다른 경우를 지정하지 않았다면 항상 '/bin/sh' 에 의해 해석된다.
-
변수 정의시에도 tab 문자가 들어가면 변수가 아닌 command 로 해석된다.
-
조건식의 정의시에도 앞에 tab 문자가 들어가면 조건식이 아닌 command 로 해석된다.
Rule 의 처리
Makefile 에서 Rule 의 처리는 아래의 규칙을 따른다.
1. Prerequisite 이 모두 있으면, Recipe 들을 실행한다.
1. Prerequisite 이 아예 없으면 , Recipe 들을 실행한다.
2. Prerequisite 중 일부만 있으면, 없는 Prerequisite 을 Target 을 처리후 현재 Rule 을 처리한다.
여기서 Prerequisite 이 없다는 건 아무것도 넣지 않은 것을 의미하고
Prerequisite 이 없다는건 해당 파일이 아직 없다는 것을 말한다.
Test
이를 이해하기 위한 아주 간단한 Makefile 을 살펴보자.
사용자가 make 유틸리티로 Makefile 을 로드하면 make 유틸리티는 all : test 라는 Rule 을 만난다.
Prerequisite 중 일부만 있으면, 없는 Prerequisite 을 Target 을 처리후 현재 Rule 을 처리한다.
위 규칙중 의해 존재하지 않는 Prerequisite 인 test 가 있으므로 이 test 에 해당하는 Rule 이 있는지 확인한다.
그럼 아래 Rule 을 찾을 것이다.
test : test.c
gcc test.c -o test
Prerequisite 이 모두 있으면, Recipe 들을 실행한다.
test.c 가 파일이 있다면 위 조건에 의해 Recipe 인 gcc test.c -o test 를 실행하여
Target 인 test 를 생성하고 이 Rule 에 대한 처리는 끝이나게 되며 애초에 이 Rule 을 처리하게 보낸
all : test 라는 Rule 이 이 결과를 받아 all 이라는 Target 을 만들고 빌드 과정이 끝나게 된다.
아래 실습 내용을 확인하자.
'Build > Make' 카테고리의 다른 글
07. Wildcard (0) | 2020.01.22 |
---|---|
06. Variable (0) | 2020.01.22 |
04. Makefile 의 구성 (0) | 2020.01.22 |
03. make 유틸리티 사용 (0) | 2020.01.22 |
02. Build 과정 (0) | 2020.01.22 |