🏷️매크로
📌개념
- Makefile내에서 매크로를 정의하여 사용 할 수 있다.
- 매크로를 사용하면 이식성을 높여준다.
🏷️매크로 작성 규칙
- 매크로를 작성할 때, 지켜야 할 규칙이 몇가지 있다.
📌1. 매크로 정의는 =를 포함하는 하나의 문장이다.
TEST = Hello World
- 매크로명은 관습적으로 C언어처럼 대문자를 사용한다.
" "(큰따옴표)로 문자열을 감싸줘선 안된다.
📌2. #은 주석 기호다.
TEST = Hello World # comments
📌3. 여러 행을 사용해서 정의할 때는 \를 사용한다.
TEST = Hello\
World
📌4. 매크로를 참조할 때는 ( )(소괄호)를 사용한다.
TEST = Hello World
$(TEST)
$(TEST)!
{ }(중괄호)를 사용해도 되지만, 셸 환경 변수와 구분을 위해서 ( )를 사용하는 것이 좋다.
📌5. 정의되지 않은 매크로를 참조하면, NULL문자열로 치환된다.
$(TEST)!
- TEST가 정의되지 않아, NULL문자열로 치환되기에 최종적으로
!가 된다.
📌6. 중복된 정의는 마지막에 정의된 값을 사용한다.
TEST = Hello World
TEST = Bye World
$(TEST)
$(TEST)는 Bye World로 치환된다.
📌7. 매크로 정의 시, 이전에 정의된 매크로를 참조해서 정의할 수 있다.
TEST = Hello World
TEST2 = Second ${TEST}
- 매크로
TEST2는 Second Hello World로 정의된다.
📌8. 여려 대입 기법이 존재한다.
TEST = Hello World
TEST2 := Hello World
TEST3 += Hello World
TEST4 ?= Hello World
=와 :=
=는 재귀적 확장 매크로 라고 하고 :=는 단순 확장 매크로라고 한다.
=는 매크로 정의 위치와 상관없이, 타 매크로를 참조해서 정의할 수 있다.
:=는 매크로 정의 순서에 종속적이어서, 아래에 선언된 매크로를 위에서 참조하여 정의할 수 없다.
- 실습을 진행해보면 바로 알 수 있다.
A = Ice $(B)
B = Candy
C := Pine $(D)
D = Apple
all :
echo $(A)
echo $(B)
echo $(C)
echo $(D)
.SILENT:
Ice Candy
Candy
Pine
Apple
- 🖇️cf.
.SILENT는 실행되는 명령을 화면에 출력하지 않게 해주는 특수 타겟으로, 나중에 설명한다.
+=
TEST = Hello
TEST += World
all :
echo $(TEST)
.SILENT:
?=
- 현재 정의하는 매크로가 정의되어 있지 않을 때, 정의한다.
TEST ?= Bye World
TEST2 = Hello World
TEST2 ?= Bye World
all :
echo $(TEST)
echo $(TEST2)
.SILENT:
TEST는 정의되어 있지 않기 때문에, TEST ?= Bye World에서 Bye World로 정의된다.
- 반면
TEST2는 이미 Hello World 문자열로 정의되어 있었기 때문에, TEST2 ?= Bye World는 무시된다.
- 따라서 결과는 다음과 같다.
Bye World
Hello World