본문 바로가기

Build/Make

05. Rule 의 구성

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