Makefile을 쉽게 이해하기 위해 내장함수를 많이 알아 둘 필요가 있다.
간단히 몇가지만 정리하면 아래와 같다.
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# bar is now `a,b,c'.
여기서 subst 함수는 foo의 값 전체에서 각 스페이스를 콤머로 변경하고 그 결과를 이 값에 대입한다
$(patsubst pattern,replacement,text)
text 안에서 공백문자로 분리된 단어들 중 pattern와 매치되는 단어를 찾아서 그것들을 replacement로 변경한다.
(patsubst %.c,%.o,x.c.c bar.c)
$(var:suffix=replacement) == $(patsubst %suffix,%replacement,$(var))
ex)
objects = foo.o bar.o baz.o
이에 대응하는 소스 파일들의 리스트를 얻기 위해서 다음과 같이 쉽게 작성할 수 있다:
$(objects:.o=.c)
동일한 표현
$(patsubst %.o,%.c,$(objects))
$(strip string)
이 함수는 string의 앞뒤에 있는 공백문자들을 제거하고 내부에 있는 하나 이상의 공백문자들을 단일 스페이스로 교체한다. 그래서 `$(strip a b c )'의 결과는 `a b c'가 된다.
strip 함수는 조건과 함께 사용될 때 아주 유용함.
.PHONY: all
ifneq "$(needs_made)" ""
all: $(needs_made)
else
all:;@echo 'Nothing to make!'
endif
ifneq 지시어에서 변수 참조 `$(needs_made)' 를 함수 호출 `$(strip $(needs_made))' 로 바꿈으로써 robust하게 만들 것이다.
$(findstring find,in)
이 함수는 in에서 find를 찾는다. 있다면 그 값은 find가 된다; 그렇지 않다면 그 값은 빈 것이 된다. 이 함수를 조건에서 사용해서 주어진 문자열 안에서 특정 문자열의 존재 여부를 검사할 수 있다.
ex)
$(findstring a,a b c)
$(findstring a,b c)
`a'와 `' (빈 문자열) 각각을 만든다.
$(filter pattern...,text)
이 함수는 pattern 단어들 중의 임의의 것과 일치하지 않는 text 내의 공백문자로 분리된 단어들을 모두 제거하고 일치하는 단어들만을 리턴한다.
ex)
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
$(filter-out pattern...,text)
이 함수는 text에서 pattern 단어들과 일치하는, 공백문자들로 분리된 단어들을 모두 제거하고 일치하지 않는 단어들만을 리턴한다. filter의 반대이다.
ex)
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
다음은 `mains'에 있지 않는 오브젝트 파일들 모두를 담고 있는 리스트를 생성한다:
$(filter-out $(mains),$(objects))
$(dir names...)
이것은 names에 있는 각 파일 이름에서 디렉토리-파트를 추출한다. 파일 이름의 디렉토리-파트는 그 안에 있는 마지막 슬래쉬까지의 (그리고 이 마지막 슬래쉬를 포함한) 모든 것이다. 그 파일 이름이 슬래쉬가 없으면 디렉토리 파트는 문자열 `./'가 된다.
ex)
$(dir src/foo.c hacks)는 `src/ ./'라는 결과를 만든다.
$(notdir names...)
이 함수는 names에 있는 각 파일 이름의 디렉토리-부분을 제외한 모든 것을 추출한다. 파일 이름에 슬래쉬가 없으면 변화되지 않는다. 그렇지 않는 경우 마지막 슬래쉬까지 모든 것이 그것으로부터 제거된다.
ex)
$(notdir src/foo.c hacks)는 `foo.c hacks'라는 결과를 만든다.
$(suffix names...)
파일 이름이 소숫점(period)를 갖고 있다면 접미사는 마지막 소숫점부터 시작한 모든 것이다
ex)
$(suffix src/foo.c src-1.0/bar.c hacks) 는 `.c .c'라는 결과를 만든다.
$(basename names...)
이 함수는 names에 있는 각 파일 이름의 접미사를 제외한 모든 것을 추출한다.
ex)
$(basename src/foo.c src-1.0/bar hacks) 는 `src/foo src-1.0/bar hacks' 라는 결과를 만든다.
$(addsuffix suffix,names...)
suffix의 값은 각 개별 이름의 끝에 더해지고 그들 사이에 단일 스페이스들을 추가한 더 큰 이름들이 그 결과이다.
ex)
$(addsuffix .c,foo bar)는 `foo.c bar.c'라는 결과를 만들어낸다.
$(addprefix prefix,names...)
ex)
$(addprefix src/,foo bar)는 `src/foo src/bar'라는 결과를 만든다.
$(wildcard pattern)
pattern 매개변수는 파일 이름 패턴이다. 전형적으로 와일드 카드 문자들 (쉘 파일 이름 패턴과 동일한) 을 담고 있다. wildcard 함수의 결과는 패턴과 일치하는 현존하는 파일들의 이름들을 스페이스로 분리한 리스트이다.
shell 함수(The shell Function)
ex)
contents := $(shell cat foo)
files := $(shell echo *.c)
출처: http://korea.gnu.org/manual/4check/make-3.77/ko/make_8.html
아래의 내용은 숙지할 필요가 있다.
Make에 대해 알아야할 7가지
http://www.mimul.com/pebble/default/2014/12/26/1419569926542.html
'linux' 카테고리의 다른 글
top 명령어 세부사항 (0) | 2018.07.02 |
---|---|
표준입출력 redirect (0) | 2018.06.25 |
ubuntu default /bin/sh is dash (0) | 2018.06.22 |
ubuntu samba 설정하기 (0) | 2018.06.21 |
useful linux system info commands (0) | 2018.06.20 |