Makefile에 대해서 알아보기 전에 프로그램의 빌드가 어떻게 이루어지는지 먼저 알아보도록 하자.
애초에 소스코드는 인간이 이해하고 작성하기 위해서 만들어진 언어로 작성된거지 컴퓨터가 이를 알리가 없다. 그래서 빌드 과정을 통해 컴퓨터에서 이해할 수 있는 기계어로 해석하고 실행 가능한 파일로 만드는 과정을 빌드(Build)라고 한다.
source -> build -> exe 식으로 말이다.
C와 C++이나 대부분의 언어는 다음과 같은 빌드 과정을 가진다.
프리프로세싱 -> 컴파일링 -> 어셈블링 -> 링킹
이렇게 간단하게 프로그램의 빌드 과정에 대해 설명했는데 나중에 한번 자세하게 다루는 내용을 작성해보도록 하겠다.
'make'는 파일을 관리해주는 유틸리티로, 수정된 소스파일의 'recompile'을 용이하게 해주는 기능이다.
이말은 즉, 반복되는 컴파일 속에서 수정된 파일과 의존성(Dependency)이 있는 대상들만 추려서 컴파일을 다시 진행하는 것을 의미한다.
다음은 Makefile의 구조다.
<target> : <dependency>
(tab)<Recipe>
예시 Makefile을 먼저 보도록 하자.
NAME = phonebook
CC = clang++
RM = rm -rf
WFLAGS = -Wall -Wextra -Werror
CFLAGS = $(WFLAGS)
SRCS = personinfo.cpp \
phonebook.cpp \
main.cpp
OBJS = ${SRCS:.cpp=.o}
${NAME}: ${OBJS}
$(CC) $(CFLAGS) $(OBJS) -o $(NAME)
all: ${NAME}
clean:
${RM} ${OBJS}
fclean: clean
${RM} ${NAME}
re: fclean all
.PHONY: all clean fclean re
위의 Makefile은 단순 예시 중 하나이며 하나하나 설명해보도록 하겠다.
우선 'NAME', 'CC', 'RM' 그리고 'WFLAGS' 등은 '변수'를 선언한 것이다. Makefile은 이렇듯 변수를 사용할 수 있고 확장성을 용이하게 해 주는 '자동 변수' ($@, $< 등)도 있다.
https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
Automatic Variables (GNU make)
10.5.3 Automatic Variables Suppose you are writing a pattern rule to compile a ‘.c’ file into a ‘.o’ file: how do you write the ‘cc’ command so that it operates on the right source file name? You cannot write the name in the recipe, because the
www.gnu.org
그리고 변수들을 이용하여 'target'과 'dependency' 그리고 'recipe'에 맞게 작성하고 bash에서 다음과 같은 명령을 사용하면 완성이다.
make
make all
make clean
make fclean
make re
이 외에도 본인의 편의상 마음대로 작성할 수 있다.