기술파일(Makefile) 내에 매크로는 C와 마찬가지로 사용자 정의 변수에 특정한 문자열을 정의하고 표현하는 것을 의미한다.


(1) 매크로 작성 기본 규칙

1. 매크로의 정의는 '='를 포함하는 하나의 문장이다.
 NAME = string
: NAME는 매크로의 이름이고, string은 정의 문자열이다. 관습적으로 매크로의 이름은 대문자를 사용한다.

2. '#'은 주석문의 시작이다.
 NAME = string # 주석

3. 여러 행을 사용할 때는 '\'를 사용한다. 
 NAME = -D__KERNEL___ -DMODULE -W -Wall \
             -DNO_DEBUG 
: 위 문장은 NAME = -D__KERNEL___ -DMODULE -W -Wall -DNO_DEBUG 과 동일하다.

4. 매크로를 참조할 때는 괄호나 중괄호를 둘러싸고 앞에 '$'를 붙인다.
 NAME = string
 ${NAME}                       # string
 $(NAME)                       # string
 $(NAME).c                    # string.c
 macro_$(NAME)            # macro_string 
: 중괄호나 괄호 모두 사용 가능하지만, 중괄호는 셸 환경 변수 치환에도 사용되기 때문에 구분을 위해 괄호의 사용을 권장한다.

5. 정의되지 않은 매크로를 참조할 때는 null 문자열로 치환된다.
 NAME = string
 my $(NAME)                 # my string
 my $(NAME2)               # my 
: NAME2 는 정의되지 않아 null로 치환된다.

6. 중복된 정의는 최후에 정의된 값을 사용한다.
 NAME = stringA
 NAME = stringB
 $(NAME)                      # stringB 
 
7. 매크로 정의 시 이전에 정의된 매크로를 참조해 정의할 수 있다.
 NAME = string
 NAME2 = my $(NAME)
: NAME2는 my string으로 정의된다.

8. 여러 대입 기법을 사용할 수 있다.
 NAME1 = string              # (1)
 NAME2 := string             # (2)
 NAME3 += string            # (3)
 NAME4 ?= string            # (4) 
: 대입 기법에 따라 다른 결과가 나온다.
(1) 재귀적 확장 매크로로 여러번 스캔하며 재귀적으로 확장이 일어나 아래에서 정의한 내용을 위에서 참조가 가능하다.
(2) 단순 확장 매크로로 단 한 번 위에서 아래로 스캔되면서 확장이 일어나 아래에서 정의한 내용은 위에서 참조가 불가능하다.
(3) 기존 매크로에 공백을 두고 현재의 문자열을 덧붙인다.
(4) 현재 정의하는 매크로가 정의되지 않았을 때 정의한다.


(2) 매크로 사용 시 주의사항 
 
1. 구분을 위해 문자열에 따옴표를 넣으면 따옴표 또한 무자열의 일부로 인식한다.
2. 매크로의 이름에는 ':', '=", '#'이 들어가서는 안되고, TAB으로 시작해서도 안된다.
3. 매크로는 반드시 치환될 위치보다 먼저 정의되어야 한다.
4. '\'나 '<', '>'과 같은 셸 메타 문자는 사용을 자제해야 한다.


(3) 내부적으로 정의되어 있는 매크로의 사용
: 매크로 사용에 있어 좀 더 간결하고 자주 사용되는 방법이 있는데, make 내부적으로 미리 정의되어 있는 매크로를 사용하는 방법이다.

1. 사전 정의 매크로 (Pre-defined)
: make -p 명령을 셸에서 내리면 make 내부에 정의된 매크로 리스트들이 나열된다.
(ex) CC, CXX, CPP, LD, CFLAGS, LDFLAGS, 등

- CFLAGS : cc와 gcc의 옵션을 지정한다.
- CC : C 컴파일러를 지정한다. (CC = gcc)
- CPPFLAGS : c++과 g++의 옵션을 지정한다.
- CXX : C++ 컴파일러를 지정한다. (CXX = g++)
- LDFLAGS : ld의 옵션을 지정한다.
- LD : ld 프로세스를 지정한다. (LD = ld)

2. 내부 매크로
: 내부적으로 정의되어 있지만 make -p 명령으로 확인할 수 없는 매크로(의미수정 불가)
(ex) $?, $^, $@, $<, $*, $%

- $@ : 현재 타겟의 이름
- $^ : 현재 타겟의 종속 항목 리스트
- $* : 현재 타겟 파일의 확장자를 뺀 것
- $< : 현재 타겟 파일보다 더 최근에 업데이트한 파일명(즉, 소스파일)

(Example)
 target : dependency1.c dependency2.c
           gcc -o $@ $^ 



by 민트앤라떼 2012. 10. 22. 18:51