Makefile 작성법
Macro 구문 규칙
# - > 주석처리
\ -> 여러행 사용시
${ } 매크로 사용시 : 정의되지 않은 매크로 사용시 null 문자열로 치환
중복된 정의는 최후에 정의된 매크로를 사용한다.
NAME = stringA
NAME = stringB
${NAME} #string B로 치환
재귀적 확장 매크로
A = $(B) BB
B = $(C) CC
C = D
@echo ${A} #D CC BB 를 출력
단순 확장 매크로
a := $(b) bb
b := $(c) cc
c := d
@echo ${a} #bb를 출력
주의 사항
문자열에 " "를 포함하면 문자열의 일부로 인식
NAME = "string"
${NAME} #string이 아니라 "string"을 의미한다.
매크로 이름 앞에 tab, = , : 을 두어서는 안된다.
매크로는 반드시 사용할 항목보다 먼저 정의해야 한다.
매크로는 관습적으로 대문자로 표기
\, <, > 같은 shell 메타 문자는 사용을 자제한다.
내부적으로 정의되어 있는 macro
${CC} : 내부적으로 C컴파일러인 cc로 정의 되어 있다.
${LD} : ld로 정의되어 있다.
$? : 현재의 target보다 최근에 변경된 필요 항목 리스트(확장자 규칙에서 사용불가)
$@ : 현재 target의 이름
$< : 현재 target보다 최근에 변경된 필요 항목 리스트(확장자 규칙에서만 사용가능)
$* : 현재 target보다 최건에 변경된 현재 필요항목의 이름(확장자 제외, 확장자 규칙에서만 사용가능)
$% : 현재의 target이 라이브러리 모듈일 때 .o에 대응되는 이름.
(예제) /temp/target : usr/local/c/test.c
${$F} : 현재 target의 파일부분(target)
${<F} : 현재 필요 항목의 파일 부분(test.c)
${@D} : 현재 target의 디렉토리 부분(/temp)
${<D} : 현재 필요 항목의 디렉토리 부분 (/usr/local/c)
확장자 규칙이란?
미리 확장자에 따라 정의된 기술 파일 목록
ex) C 언어 소스 파일은 항상 확장자가 .c이다. 이것은 C컴파일러의 필수 요구사항이다. 이러한 확장자 규칙에 따라 make는 여러 동작을 수행할 수 있다.
확장자 규칙을 사용하는 이유
기술 파일을 단순, 명료하게 만들 수 있다.
Makefile (module) - mudule
obj-m = dot.o
KDIR = $(ARM_KDIR)
all:
make -C $(KDIR) SUBDIRS=$(PWD) modules
cp -i *.ko $(NFS_DIR)/ldd
clean:
rm -rf *.o *.ko *.mod.* .*.cmd
- Makefile (app) - app
-
- SRCS =$(wildcard *.c)
- OBJECTS =$(SRCS:.c=)
- CC =$(ARM_GCC)
- NDIR =$(NFS_DIR)
- .SUFFIXES: .c
- .c:
- $(CC) -o $@ $<
- all: $(OBJECTS)
- cp -i $^ $(NDIR)/ldd/app_lyj
- dot.tar.gz - dot 예제 파일
- source 로 환경파일 실행해주고 해야함. ($ARM_GCC, $NFS_DIR 등 경로 때문에)
이 글은 스프링노트에서 작성되었습니다.
'Study' 카테고리의 다른 글
Linux Kernel source 분석 기법 (0) | 2008.11.27 |
---|---|
vim 설정 (0) | 2008.11.24 |
Autotools (0) | 2008.11.24 |
Linux Device Driver (0) | 2008.11.24 |
device driver (0) | 2008.11.24 |