Search
Duplicate
🔀

GNU Make 함수 간단히 알아보기

간단소개
.o 임시폴더에 만들기 포함!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Makefile
Scrap
태그
makefile
9 more properties

함수의 문법

함수를 사용하는 문법은 변수와 비슷합니다.
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 응용 - 임시 폴더

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)
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를 적극적으로 활용해보시길 추천합니다!
같이 보면 좋은 글