<aside> ⚠️ Makefile, make 기초 글을 먼저 읽을 것을 강력 권장합니다!

</aside>

함수의 문법

함수를 사용하는 문법은 변수와 비슷합니다.

NAME 변수를 사용한다면 $(NAME)으로 쓰는데요,

subst 함수에 a, b, c를 인자로 넘겨서 함수를 호출하는 것은 $(subst a,b,c)로 씁니다.

간단 예시 - subst

subst는 세번째 인자에서 첫번째 인자를 모두 찾아 두번째 인자로 치환 함수입니다.

예를 들어 $(subst a,b,foo b**a**r)foo b**b**r가 됩니다.

간단 예시 - shell

shell은 이름 그대로 주어진 인자를 쉘로 실행하는 함수입니다.

예를 들어 $(shell echo Hello world)의 결과는 Hello world가 됩니다.

patsubst 함수

patsubst는 subst 함수와 비슷하지만 패턴을 치환할 수 있습니다.

예를 들어 $(patsubst ./%.c,./obj/%.o,**./foo.c**)./obj/foo.o가 됩니다.

이들 활용하면 컴파일 과정에서 발생하는 임시 파일을 임시 폴더 안에 몰아넣을 수 있습니다.

patsubst 줄여 쓰기

두 패턴이 모두 %로 시작하는 경우 patsubst의 경우에는 특별히 줄여서 쓸 수 있습니다.

예를 들어 $(patsubst %.c,%.o,$(SRCS))$(SRCS:.c=.o)로 쓸 수 있습니다.

shell, patsubst 응용 - 임시 폴더

shellpatsubst 함수를 활용해 임시 파일을 모두 임시 폴더에 만드는 예시를 보겠습니다.

NAME := a.out
SRCS := $(shell find . -name "*.c")
OBJS := $(patsubst ./%.c,./obj/%.o,$(SRCS))

./obj/%.o: ./%.c | ./obj
    $(CC) -c $< -o $@

$(NAME): $(OBJS)
    $(CC) -o $@ $(OBJS)

기타 함수

patsubst 외에도 앞에 문자열을 이어붙이는 addprefix 함수 등 여러가지 문자열 관련 함수가 있습니다.

문자열을 다루는 함수 외에도 if, and/or, foreach 처럼 흐름을 제어할 수 있는 함수도 있습니다.

그 외에도 사용자 정의 함수를 호출하는 call 함수, 인자를 Makefile의 일부처럼 해석하는 eval 함수 등 정말 다양한 함수가 있습니다.

어떤 함수가 있는지는 GNU Make의 매뉴얼을 참고하면 됩니다. (https://www.gnu.org/software/make/manual/html_node/Functions.html)

하지만 제 개인적인 경험상 patsubst, shell 외에는 쓸 일이 거의 없었습니다.

마무리

make는 안 그래도 강력한데, GNU Make는 함수를 통해 더 다양한 작업을 편하게 할 수 있습니다.

작업 환경을 설정하는 데 make를 적극적으로 활용해보시길 추천합니다!