본문 바로가기

Build/Make

(20)
20. Recipe - SubMake SubMake 를 구성하고자 하는 경우 $(MAKE) 매크로를 사용한다. 다른 Makefile 을 Sub Make 로 돌리는 것이므로 보통 특정 폴더로 들어가서 make 명령을 실행하게 되므로 해당 폴더명을 cd [폴더명] && $(MAKE) 와 같은 형식으로 사용해야 하지만 이는 가독성이 떨어지므로 옵션 -C [폴더명] 으로 cd 명령을 날릴수 있다. SubMake 로 인자전달 $(MAKE) 매크로를 사용하는 경우 MAKEFLAGS 변수가 SubMake 로 자동 전달된다. 예를들어 사용자가 `make -ks' 라고 하면 MAKEFLAGS는 값 `ks' 값을 저장하고 있으며 SubMake 도 이 옵션으로 동작한다. 이때 일부 옵션만 사용하고자 하는 경우 아래와 같이 사용한다. 위와 같이 $(MAKE) M..
19. Recipe - Interrupts Recipe 수행중 인터럽트가 일어나면 make 는 target file 을 삭제한다. 이렇게 타겟을 삭제하는 목적은 make가 다음에 실행될 때 처음부터 다시 만들어 져서 다음번에 빌드시에 다시 Target 을 만들도록 하여 불완전한 Target 파일을 사용하지 않도록 하기 위해서이다.
18. Recipe - Error Recipe 는 앞서 "Rule 의 구성" 에서 살펴본 바와 같이 선행조건이 만족될 때 수행될 명령이며 보통 한줄씩 실행되는 쉘 명령 라인들로 이루어진다. Syntax 각 쉘 명령이 리턴한 후, make는 그것의 종료 상태값을 조사하고 exit code 가 0 이 아니면 강제 종료한다. 강제 종료하지 않고 진행하고자 한다면 보통 `-i` 혹은 `-k` 옵션을 많이 사용하여 make 유틸리티가 중간에 멈추지 않고 계속해서 빌드를 수행하도록 한다. Makefile 내부의 특정 쉘 커맨드에 대해서만 에러를 무시하도록 하고자 한다면 `-` 를 사용한다.
17. Recipe - ECHO Recipe 는 앞서 "Rule 의 구성" 에서 살펴본 바와 같이 선행조건이 만족될 때 수행될 명령이며 보통 한줄씩 실행되는 쉘 명령 라인들로 이루어진다. Syntax command 를 확인하기 위한 shell echo 명령시 쉘 커맨드가 '@' 로 시작하는 echo 를 입력하는 경우 명령이 쉘에 전달되기 전에 버려져 화면에 출력되지 않는다. make는 `-n' 또는 `--just-print' 플래그를 받으면 실행 없이 echo 만 하고 이련 경우 '@' 로 시작하는 명령들도 실행한다. make는 `-s` 또는 `--silent` 플래그를 받으면 실행된 command 를 표시하지 않는다.
16. Recipe - Variable Recipe 는 앞서 "Rule 의 구성" 에서 살펴본 바와 같이 선행조건이 만족될 때 수행될 명령이며 보통 한줄씩 실행되는 쉘 명령 라인들로 이루어진다. Syntax 변수를 사용시에는 ${변수명}, 혹은 $(변수명) 을 사용할 수 있다. for 루프를 사용시 item 변수는 $$ 를 사용해야 한다.
15. Recipe - BACK SLASH Recipe 는 앞서 05. Rule 의 구성 에서 살펴본 바와 같이 선행조건이 만족될 때 수행될 명령이며 보통 한줄씩 실행되는 쉘 명령 라인들로 이루어진다. Syntax 백슬러시 기호를 사용하면 하나의 쉘 명령 라인을 여러 라인으로 분할 할수 있다. ( Continuation ) 예를 들어 아래의 경우 두줄에 걸친 쉘 명령 라인이 echo continuation line 와 같이 하나의 쉘 명령 라인으로 인식된다. ( 마지막 서브라인만 제외하고 모든 라인의 마지막에다 역슬래쉬를 사용해야 한다.)
14. Recipe - TAB Recipe 는 앞서 "Rule 의 구성" 에서 살펴본 바와 같이 선행조건이 만족될 때 수행될 명령이며 보통 한줄씩 실행되는 쉘 명령 라인들로 이루어진다. Syntax 개행시 TAB 문자로 시작하며 (개행 없을시 ; 로 구분) 하며 Shell 의 문법을 따른다. makefile 실행시 다른 경우를 지정하지 않았다면 항상 '/bin/sh' 에 의해 해석된다. 빈 라인들도 Command 의 사이에 올 수 있으며 빈 라인들의 경우도 Tab 으로 시작하면 Empty Commands 로 해석된다. Comment 들도 Command 사이에 올 수 있으며 Shell 에 그대로 전달된다. 변수 정의시에도 tab 문자가 들어가면 변수가 아닌 command 로 해석된다.
13. define define Variable 설정시 일반 할당에서의 값은 개행을 가지지 못한다. 그러나 define 지시어(directive)는 안의 값들의 라인을 나누는 개행들은 그 변수의 값이 된다 즉 아래와 같이 define 지시어 를 사용해서 변수 값을 할당하게 되면 define test = echo foo echo $(bar) endef 이는 기능적으로 아래와 동일하다. test = echo foo; echo $(bar) 즉 각 라인별로 쉘을 호출하게 된다.