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 파일이 존재하지 않아도 값이 출력된다.