linux2018. 6. 19. 10:17


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
Posted by easy16