File Name Functions
$( dir names... )
space 로 분리된 names 에서 디렉토리 부분만 출력합니다.
( 값은 /
문자로 끝납니다.)
names := lib/foo.c lib/time/bar.o zoo.o
$(dir $(names))
결과: lib/ lib/time/ ./
$( notdir names... )
space 로 분리된 names 에서 디렉토리 부분을 제외하고 파일명만 출력합니다.
끝이 /
문자로 끝날 경우 값은 empty 가 됩니다.
names := lib/time/foo.c zoo.c lib/time/
$(notdir $(names))
결과: foo.c zoo.c # lib/time/ 값은 empty 가된다.
$( suffix names... )
space 로 분리된 names 에서 끝이 .
로 끝나는 확장자 부분만 출력합니다.
names := lib/foo.c lib/time/bar.o zoo
$(suffix $(names))
결과: .c .o # zoo 는 확장자가 없으므로 empty
$( basename names... )
space 로 분리된 names 에서 확장자 부분을 제외하고 출력합니다.
( 주의: shell 의 basename 명령과 실행 결과가 다릅니다. )
names := lib/time/bar.o zoo.aa.xml goo
$(basename $(names))
결과: lib/time/bar zoo.aa goo
$( addprefix prefix , names... )
space 로 분리된 names 리스트에 prefix 를 추가 합니다.
names := aaa.c bbb.c ccc.c
$(addprefix foo/bar/,$(names)) # $(names:%=foo/bar/%)
# 또는
$(addprefix foo/bar/,$(wildcard *.c))
결과: foo/bar/aaa.c foo/bar/bbb.c foo/bar/ccc.c
$( addsuffix suffix , names... )
space 로 분리된 names 리스트에 suffix 를 추가 합니다.
names := foo bar zoo
$(addsuffix .c,$(names)) # $(names:%=%.c)
# 또는
$(addsuffix .c,$(wildcard *))
결과: foo.c bar.c zoo.c
$( join list1 , list2 )
두 리스트를 word by word 로 합칩니다.
$(join foo bar zoo,.c .o .h)
결과: foo.c bar.o zoo.h
$(join foo bar zoo,.c .o) # 한쪽이 리스트 개수가 적을 경우
결과: foo.c bar.o zoo
# 다음과 같이하면 기존 original list 가 생성됩니다.
$(join $(dir),$(notdir))
$( wildcard pattern )
shell 에서 사용되는 globbing 과 같은 기능입니다.
매칭되는 파일이 없을 경우 empty
가 반환됩니다.
SRCS := $(wildcard src/*.c)
wildcard 함수를 이용하여 해당 경로에 파일 존재 여부를 테스트할 수도 있습니다.
$(wildcard ../../foo/./bar//zoo.c) # 파일이 존재할 경우
결과: ../../foo/./bar//zoo.c
$(wildcard ../../foo/./bar//xxx.c) # 파일이 존재하지 않을 경우
결과: # empty
rule 의 prerequisite 부분에 직접 globbing 을 사용할 수도 있지만 매칭되는 파일이 없을 경우 패턴을 그대로 리턴하므로 주의해야 합니다.
# 매칭되는 파일이 있을경우 # 매칭되는 파일이 없을경우 # wildcard 함수는 empty 를반환
foo : *.c foo : *.cpp foo : $(wildcard *.cpp)
@echo $^ @echo $^ @echo $^
.DEFAULT: ; .DEFAULT: ; .DEFAULT: ;
#### 실행 결과 #### #### 실행 결과 #### #### 실행 결과 ####
read.c write.c *.cpp
$( realpath names... )
경로 이름에 포함되는 .
, ..
, //
을 모두 해석하고 symbolic links 도 추적하여
최종 canonical absolute 경로를 출력합니다.
해당 경로에 파일이 존재하지 않으면 empty 가 반환됩니다.
$(realpath ../../foo/./bar//zoo.c) # bar 는 bar-123 의 symbolic link 일경우
결과: /home/mug896/foo/bar-123/zoo.c
$( abspath names... )
경로 이름에 포함되는 .
, ..
, //
을 모두 해석하여 최종 absolute 경로를 출력합니다.
realpath
함수와 달리 symbolic links 는 추적하지 않으며 해당 경로에 파일이 존재하지 않아도
결과가 출력됩니다.
$(abspath ../../foo/./bar//xxx.c) # bar 는 bar-123 의 symbolic link 일경우
결과: /home/mug896/foo/bar/xxx.c # xxx.c 파일이 존재하지 않아도 값이 출력된다.