🏷️매크로
📌개념
- 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