글
기술파일(Makefile) 내에 매크로는 C와 마찬가지로 사용자 정의 변수에 특정한 문자열을 정의하고 표현하는 것을 의미한다.
(1) 매크로 작성 기본 규칙
1. 매크로의 정의는 '='를 포함하는 하나의 문장이다.
NAME = string |
2. '#'은 주석문의 시작이다.
NAME = string # 주석 |
3. 여러 행을 사용할 때는 '\'를 사용한다.
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 |
6. 중복된 정의는 최후에 정의된 값을 사용한다.
NAME = stringA NAME = stringB $(NAME) # stringB |
7. 매크로 정의 시 이전에 정의된 매크로를 참조해 정의할 수 있다.
NAME = string NAME2 = my $(NAME) |
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 $@ $^ |
'L inux > Compile' 카테고리의 다른 글
리눅스 프로젝트 빌드(Make/Makefile) - 더미 타겟의 사용 (0) | 2012.10.23 |
---|---|
리눅스 프로젝트 빌드(Make/Makefile) - 확장자 규칙의 사용 (0) | 2012.10.22 |
리눅스 프로젝트 빌드(Make/Makefile) - Make의 이해 (0) | 2012.10.22 |
'__open_missing_mode' declared with attribute error - compile error (3) | 2012.03.22 |
컴파일(Compile)과정 - collect2에 의한 링킹 과정 (0) | 2012.03.22 |
RECENT COMMENT