목표
Level : 7
학습 목표
- 좀 더 복잡한 형태의 메이크파일을 만들 수 있다.
---------
< 문제 >
-.c 파일들을 .o 파일로 컴파일한 뒤, ft라는 이름의 정적라이브러리 파일(libft.a)로 만드시오.
- main.c를 main.o 파일로 컴파일한 뒤, libft.a 파일과 링킹하여 실행파일 main을 만드시오.
< 제한 사항 >
- .c 파일들을 할당한 변수를 함수로 치환하여 .o 파일을 할당할 변수로 정의하시오.
- 패턴 Rule을 사용하여 오브젝트 파일 생성 규칙을 정의하시오 - Rule의 Recipe 작성 시 Target과 Dependency를 적절한 자동 변수(Automatic Variables)를 사용하여 작성하세요.
- Rule을 변수만으로 작성하시오.
- 적절한 변수를 할당하시오.
- ar 유틸리티를 사용하여 archive 하시오.
- 리링크되지 않아야 합니다.
코드
NAME := main
SRC = main.c
OBJ = $(SRC:.c=.o)
LIBFT := libft.a
LIB_NAME := ft
LIB_SRCS := first.c second.c third.c
LIB_OBJS := $(LIB_SRCS:.c=.o)
AR := ar
ARFLAGS := -rc
CC := gcc
CFLAGS := -Wall -Wextra -Werror
all : $(NAME)
clean :
rm -f *.o
fclean : clean
rm -f $(LIBFT) $(NAME)
re : fclean all
$(NAME) : $(OBJ) $(LIBFT)
$(CC) $(CFLAGS) -o $@ $^
$(LIBFT) : $(LIB_OBJS)
$(AR) $(ARFLAGS) $@ $?
%.o : %.c
$(CC) $(CFLAGS) -c $<
.PHONY : all clean fclean
설명
변수 설명
NAME := main: 생성할 실행 파일의 이름을 NAME 변수에 할당합니다.
SRC = main.c: 컴파일할 메인 소스 파일을 SRC 변수에 할당합니다.
OBJ = $(SRC:.c=.o): 함수를 사용하여 main.c 파일을 main.o 파일로 치환하고, 그 결과를 OBJ 변수에 할당합니다.
LIBFT := libft.a: 생성할 정적 라이브러리의 이름을 LIBFT 변수에 할당합니다.
LIB_SRCS := first.c second.c third.c: 라이브러리의 소스 파일들을 LIB_SRCS 변수에 할당합니다.
LIB_OBJS := $(LIB_SRCS:.c=.o): 함수를 사용하여 라이브러리의 .c 파일들을 .o 파일로 치환하고, 그 결과를 LIB_OBJS 변수에 할당합니다.
AR := ar: 아카이브 유틸리티의 이름을 AR 변수에 할당합니다.
ARFLAGS := -rc: ar 명령어에 전달할 플래그를 ARFLAGS 변수에 할당합니다.
CC := gcc: C 컴파일러를 CC 변수에 할당합니다.
CFLAGS := -Wall -Wextra -Werror: 컴파일러 플래그를 CFLAGS 변수에 할당합니다.
룰과 명령어
all : $(NAME): make all 또는 make 명령을 실행하면 $(NAME) (여기서는 main) 타겟이 생성됩니다.
clean :: make clean 명령을 실행하면 모든 .o 파일이 삭제됩니다.
fclean : clean: make fclean 명령을 실행하면 clean 타겟이 먼저 실행되고, 그 후에 $(LIBFT) (여기서는 libft.a)와 $(NAME) (여기서는 main) 파일이 삭제됩니다.
re : fclean all: make re 명령을 실행하면 fclean과 all 타겟이 순차적으로 실행됩니다.
$(NAME) : $(OBJ) $(LIBFT): $(NAME) 타겟은 $(OBJ)와 $(LIBFT) 의존성을 가집니다. 이 의존성을 만족시킨 후에 실행 파일을 생성합니다.
$(LIBFT) : $(LIB_OBJS): $(LIBFT) 타겟은 $(LIB_OBJS) 의존성을 가집니다. 이 의존성을 만족시킨 후에 정적 라이브러리를 생성합니다.
$(CC) $(CFLAGS) -o $@ $^: main.o와 libft.a를 링킹하여 실행 파일 main을 생성합니다.
$(AR) $(ARFLAGS) $@ $?: ar 명령어와 플래그, 그리고 자동 변수를 사용하여 정적 라이브러리를 생성합니다.
%.o : %.c: 패턴 Rule을 사용하여 .c 파일을 .o 파일로 컴파일하는 일반적인 규칙을 정의합니다.
$(CC) $(CFLAGS) -c $<: 각 .c 파일을 .o 파일로 컴파일합니다.