makefile에 대해 설명하기에 앞서서 컴파일에 대해 조금은 알아야 할 필요가 있습니다.
컴파일이란?
저희가 작성하는 프로그래밍언어를 기계어로 바꾸어 Object(오브젝트) 파일을 만드는 것입니다.
Makefile은 왜 만드는 것일까요?
여러 개의 c파일들을 한꺼번에 컴파일을 할 경우가 가끔 생깁니다. 그때 Makefile을 만드면 make명령어 한 번으로 필요한 모든 c파일들을 Object(오브젝트) 파일로 만들 수 있습니다.
makefile의 사용 이유를 알았으니 어떻게 작성하는지 알아보도록 하겠습니다.
변수 만들기
변수 이름은 대문자로 설정해야 합니다.
CC = cc
FLAG = -Wall -Wextra -Werror -c
NAME = finish.a
SOURCE = ./test1.c ./test2.c ./test3.c ./test4.c
INC = ./
OBJS = $(SOURCE:.c=.o)
위와 같이 변수를 만들어 저장하고 Makefile에서 지정한 변수를 사용할 수 있습니다.
- CC : 컴파일러
- FLAGS : 컴파일 옵션
- NAME : Makefile의 목적
- SOURCE : 컴파일할 c파일들
- INC : 헤더 파일 저장 위치
- OBJS : 만들어진 모든 목적 파일
$(SOURCE:.c=.o)
c파일들의 모든 목적 파일들을 불러오는 명령어입니다.
기본 문법
Target : Dependency
command
- Target : 말 그대로 목적, 만들고 싶은 것입니다.
- Dependency : Target을 만들 때에 필요한 것입니다.
- command : Target을 만드는데 필요한 코드입니다. Dependency가 만약에 변경되게 된다면 command명령을 다시 실행하게 합니다.
%.o : %.c $(INC)
$(CC) $(FLAG) $< -o $@ -I $(INC)
위에서 설정한 변수를 사용하여 진행을 했습니다.
변수를 사용하기 위해서는 '$(변수 이름)'통해 사용할 수 있습니다.
- %.o : 모든 목적 파일을 나타냅니다.
- %.c : 모든 .c파일을 나타냅니다.
- $(CC) : cc
- $(FLAG) : -Wall -Wextra -Werror -c
- $(INC) : ./
- $@ : Target 즉, %.o를 나타냅니다.
- $< : 의존 파일 목록에 첫 번째 파일을 나타냅니다. 즉, %.c
- $^ : 의존 파일 목록 전체를 나타냅니다. 즉, %.c $(INC)
command의 변수 부분을 풀어서 적으면 아래와 같은 명령이 됩니다.
cc -Wall -Wextra -Werror -c ./test1.c ./test2.c ./test3.c ./test4.c -o ./test1.o ./test2.o ./test3.o ./test4.o -I ./
all : $(NAME)
$(NAME) : $(OBJS)
ar rcs $(NAME) $(OBJS)
all은 Makefile의 목적을 나타냅니다. 즉, make 명령어를 실행하게 된다면 $(NAME)을 만들게 됩니다.
- $(NAME) : finish.a
- $(OBJS) : ./test1.o ./test2.o ./test3.o ./test4.o
마찬가지로 command의 변수 부분을 풀어서 적으면 아래와 같은 명령이 됩니다.
ar rcs finish.a ./test1.o ./test2.o ./test3.o ./test4.o
ar명령어는 아카이브 파일을 만드는 명령어입니다.
아카이브 파일은 목적 파일들을 하나로 합쳐 놓은 파일입니다.
rcs는 무엇일까요??
- r : 새로운 목적 파일이면 추가하고 기존 파일이면 치환합니다.
- c : 처음으로 아카이브 파일을 만들 때에 오류 메시지가 출력이 되는데 출력이 되지 않도록 해줍니다.
- s : 오브젝트 파일의 인덱스 번호를 할당해 줍니다. s옵션을 추가하지 않을 경우에 속도가 느려질 수 있습니다.
Makefile 만들기
CC = cc
FLAG = -Wall -Wextra -Werror -c
NAME = finish.a
SOURCE = ./test1.c ./test2.c ./test3.c ./test4.c
INC = ./
OBJS = $(SOURCE:.c=.o)
all : $(NAME)
%.o : %.c $(INC)
$(CC) $(FLAG) $< -o $@ -I $(INC)
$(NAME) : $(OBJS)
ar rcs $(NAME) $(OBJS)
.PHONY : clean fclean re all
clean :
rm -f $(OBJS)
fclean :
rm -f $(OBJS)
rm -f $(NAME)
re :
rm -f $(OBJS)
rm -f $(NAME)
make all
위의 예시에서 clean?? fclean?? re?? .PHONY?? 이건 무엇일까요?
쉽게 설명을 해드리면 make의 옵션을 만드는 것이라고 생각하면 좋을 것 같습니다.
make clean
'rm -f $(OBJS)'을 명령을 실행하게 됩니다.
make fclean
'rm -f $(OBJS)'와 'rm -f $(NAME)'을 명령을 실행하게 됩니다.
make re
'rm -f $(OBJS)'와 'rm -f $(NAME)'와 'make all'을 명령을 실행하게 됩니다.
그러면 '.PHONY'는 무엇일까요?
make 옵션을 진행할 때에 디렉토리 안에 clean fclean re와 같은 파일이 있다면 make의 옵션이 진행되지 않을 수 있습니다. 이부분을 방지하는 것이 '.PHONY'입니다.
'Language > C언어' 카테고리의 다른 글
C044_malloc 사용하기 (0) | 2024.01.02 |
---|---|
C043_가변인자 사용하기 (0) | 2023.12.30 |
C041_read함수 사용하기 (0) | 2023.12.28 |
C040_strlen 함수 구현해서 사용하기 (0) | 2023.12.08 |
C039_putnbr만들기 (0) | 2023.12.06 |