2011년 12월 26일 월요일

Makefile - HYYOO

출처 : http://hyyoo.egloos.com/327319

1. 자동 매크로 리스트
$?  현재 타켓보다 최근에 변경된 종속 항목 리스트(확장자 규칙에서 사용 불가)
$^ 현재 타겟의 종속 항목 리스트(확장자 규칙에서 사용 불가)
$@ 현재타겟의 이름
$< 현재 타겟보다 최근에 변경된 종소 항목 리스트(확장자 규칙에서만 사용 가능)
$& 현재 타겟보다 최근에 변경된 종속항목의 이름(확장자 제외) (확장자 규칙에서만 사용 가능)
$% 현재의 타킷이 라이브러리 모듈일 때 .o 파일에 대응되는 이름

gcc -o $@ $^

2. 패스를 가지는 타겟의 정의 항목

ex) /temp/target.o : /usr/local/c/target.c

 $(@F) : target.o 의미 $(<F): target.c 의미
 $(@D): /temp 의미 $(<D): /usr/local/c 의미

3. 확장자 규칙
 .SUFFIXES : .o .c
%.o : %.c
                $(CC) -DDEBUG -c -o $@ $<  

4. wildcard와 대입참조 기법
 SRCS = $(wildcard *.c)  .c를 확장자로 가지는 모든 파일 xxxx.c
 OBJECTS = $(SRC:.c=.o)   대입 참조 기법 xxxx.c를 xxxx.o로 대입 참조

5. 문자열 처리 patsubst
 OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
 세번째 인자로 오는  xxxx.c 파일들을 공백으로 구분된 문자열들 각각에 대하여 첫번째 인자인 %.c와 매칭되는 것을 %.o로 바꾼다.

 6. 더미 타겟
 주로 타겟은 생성될 파일인데, 더미 타겟의 경우 파일이 생성되지 않는 개념적인 타겟이므로 더미 타겟 or Phony Target이라 부른다.
 clean :
             rm -rf *.o xxx


 7. 함수의 사용

 기본: $(함수명 함수 인자들)

셀 명령 함수 $(shell 셸 명령어) - 셸 함수는 ㅁㅇ령 수행 결과를 매크로를 정의하고자 할 때 사용할 수 있는 유일한 방법이다. 

문자열 처리 함수 

$(subst 찾을 문자열, 변경할 문자열, 목표 문자열)
ex)  STR = $(subst like, LIKE, I like you)
       echo:
                @echo $(STR)
 ---------------------------------------
  I LIKE you

$(patsubst 패턴, 변경 문자열, 목표 문자여) :  패턴을 발견하면 변경 문자열로 변경한다. 패턴에는 % 기호가 사용될 수 있는데 % 기호는 공백과 탭을 제외한 모든 문자열을 의미한다.
ex) STR = $(patsubst %.c, %.o, memo.c main.c ABCD)
      echo :
                @echo $(STR)
------------------------------------------
memo.o main.o ABCD

매크로 이용 $(매크로명: 패턴=치환할 문자열) patsubst 함수와 동일한 효과
MACRO - memo.c main.c ABCD
STR = $(MACRO:%.c=%.o)

$(sort 문자열) 문자를 정렬하는 함수
ex) MACRO = bbb aaa ccc aaa ddd
      SR = $(sort $(MACRO))
      echo:
                @echo $(STR)
----------------------------------------
aaa bbb ccc ddd

$(strip 문자열)  공백 문자 제거
ex) CC = gcc [space Bar] [space Bar] [space Bar][Enter]
   @echo  $(strip $(CC)) 
----------------------------------------
gcc 

$(filter 패턴, 문자열) : 패턴과 일치하는 문자열만 걸러준다. 
FILES = memo.c head.h main.c asm.S diary.h
SRCS = $(filter %.c %.S $(FILES))
HEADS = $(filter %.h, $(FILES))

$(filter-out  패턴, 문자열) 패턴과 일치하지 않는 문자열만 걸러준다. 
$(findstring 찾을 문자열, 대상 문자열)
$(dir 문자열) 디렉토리만 추출
$(notdir 문자열) 디렉토리가 아닌 부분 추출
$(suffix 문자열) 확장자만 추출
$(basenmae 문자열) 점과 확장자를 제외한 부분을 추출
$(addsuffix 접미사, 문자열) 문자열의 각 단어 뒤에 접미사를 붙인다.
$(addprefix 접두사, 문자열) 문자열의 각각에 접두어를 붙인다. 

기타 유용한 함수
$(wildcard 패턴) 현재 디렉토리에서 패턴과 일치하는 파일 리스트를 뽑느다. 
ex) $(wildcard *.c) 사용되고 있는 현재 디렉토리에 있는 모든 .c 파일의 리스트를 리턴ㄷ

$(foreach 변수명, 대입 문자열, 확장 문자열)
ex) SRCS=$(foreach str, a b c, $(str).c)
변수명: str, 대입 문자열: a,b,c 확장문자열 $(str).c
변수명에 대입 문자열을 단어별로 대입하여 넣고 그 변수를 확장 문자열에서 사용
a.c b.c c.c 출력
사용 예)
SRCS = $(foreach dir, . memo calendar, $(wildcard $(dir)/*.c))
1) dir = .                     ./ 내의 dir
2) dir = memo
3) dir = calendar

함수 사용시 주의사항
콤마, 공백은 매크로로 사용할 것 comma =, space = $(null) $(null)
함수는 함수르 지원하는 make에서만 사용해야한다.

특수타겟
.DEFAULT  make가 요청된 타겟을 빌드할 룰을 기술 파일 또는 확장자 규칙에서 찾지 못하면 .DEFAULT 타겟에 기술된 명령어를 수행
.IGNORE    명령어 수행시 반환되는 오류 코드르 무시한다. make 명령시 i 옵션을 준 것과 동일하고 기술 파일 내에 모든 명령어 앞에 '-'
                 기호를 붙인것과 동일하다.
.PRECIOUS  .PRECIOUS 타겟에 기술된 파일들은 빌드 중단 신호 또는 명령 행에서 오류가 반환되더라도 지우지 않는다.
.SILENT     명령은 실행하지만 실행되는 명령을 화면에 출력하지 않는다. -s 옵션과 동일하고 모든 명령어 앞에 '@'를 붙인것과 동일하다.
.SUFFIXES   .SUFIXES 타겟에 정의된 확장자들은 중요 확장자들로써 확장자 규칙과 연관될 수 있다.
.EXPORT_ALL_VARIABLES 재귀적 make 사용법에 있어서 export 키워드를 단독으로 기술 파일에서 사용한 것과 마찬가지로 기술 파일내의 모든 매크로들을 하위 기술 파일에 전달한다. 

댓글 없음:

댓글 쓰기