Makefile, make 기초 글을 먼저 읽을 것을 강력 권장합니다!
함수의 문법
함수를 사용하는 문법은 변수와 비슷합니다.
NAME 변수를 사용한다면 $(NAME)으로 쓰는데요,
subst 함수에 a, b, c를 인자로 넘겨서 함수를 호출하는 것은 $(subst a,b,c)로 씁니다.
간단 예시 - subst
subst는 세번째 인자에서 첫번째 인자를 모두 찾아 두번째 인자로 치환 함수입니다.
예를 들어 $(subst a,b,foo bar)는 foo bbr가 됩니다.
간단 예시 - 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 응용 - 임시 폴더
shell과 patsubst 함수를 활용해 임시 파일을 모두 임시 폴더에 만드는 예시를 보겠습니다.
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)
Makefile
복사
임시 .o 파일들을 임시 폴더 obj에 만드는 Makefile 예시
기타 함수
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를 적극적으로 활용해보시길 추천합니다!
같이 보면 좋은 글