Study

Makefile

슈라。 2008. 11. 24. 21:52

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
 

 

    • 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