Makefile 만드는건 너무 어렵다. 그래서 이번에 한번 주워들어 만들어본 김에 정리를 한 번 해볼까 한다.
NAME = libft.a
SRCS = ft_atoi.c \
ft_bzero.c \
ft_calloc.c \
ft_isalnum.c \
ft_itoa.c \
ft_isalpha.c \
ft_isascii.c \
ft_isdigit.c \
ft_isprint.c \
ft_memchr.c \
ft_memcmp.c \
ft_memcpy.c \
ft_memmove.c \
ft_memset.c \
ft_split.c \
ft_strchr.c \
ft_strdup.c \
ft_striteri.c \
ft_strlcat.c \
ft_strlcpy.c \
ft_strlen.c \
ft_strncmp.c \
ft_strnstr.c \
ft_strrchr.c \
ft_strjoin.c \
ft_strtrim.c \
ft_strmapi.c \
ft_substr.c \
ft_tolower.c \
ft_toupper.c \
ft_putchar_fd.c \
ft_putstr_fd.c \
ft_putendl_fd.c \
ft_putnbr_fd.c
BNS_SRCS = ft_lstsize.c \
ft_lstadd_front.c \
ft_lstclear.c \
ft_lstdelone.c \
ft_lstiter.c \
ft_lstlast.c \
ft_lstmap.c \
ft_lstadd_back.c \
ft_lstnew.c
OBJS = $(SRCS:%.c=%.o)
BNS_OBJS = $(BNS_SRCS:%.c=%.o)
FLAGS = -Wall -Wextra -Werror
ifdef FLAG_BONUS
TOTAL_OBJS = $(OBJS) $(BNS_OBJS)
else
TOTAL_OBJS = $(OBJS)
endif
$(NAME) : $(TOTAL_OBJS)
ar rc $@ $^
%.o : %.c
$(CC) $(FLAGS) -c $< -o $@ -I .
all : $(NAME)
bonus : $(BNS_OBJS)
ar rcs $(NAME) $^
clean :
rm -f $(OBJS) $(BNS_OBJS)
fclean : clean
rm -f $(NAME)
re : fclean all
.PHONY : all clean fclean re
코드를 입력하세요
이번 libft 를 하면서 만들어 본 makefile이다.
ifdef FLAG_BONUS
TOTAL_OBJS = $(OBJS) $(BNS_OBJS)
else
TOTAL_OBJS = $(OBJS)
endif
flag_bonus 변수를 만들어 flag가 서있으면 total objs 에 bonus objects 들도 포함이 된다.
%.o : %.c
$(CC) $(FLAGS) -c $< -o $@ -I .
이 코드에서 $< 는 %.c, $@는 %.o 를 의미한다. 즉
gcc wextra wall. .. 모든 -c파일 -o파일 이라는 뜻이다.
bonus :
make FLAG_BONUS=1 all
make bonus를 했을 때 FLAG_BONUS가 1로 세팅된다.
$(NAME) : $(TOTAL_OBJS)
ar rc $@ $^
$@가 (NAME) , 즉 libft.a 이므로 Libft.a 라는 이름의 아카이브를 만들겠다는 의미이고, $^ 는 TOTAL_OBJS 로 이것들을 이용해 아카이브를 만들겠다는 의미가 된다!
추가 :
.PHONY : all clean fclean re -> phony가 뭘까?
phony 로 저렇게 안하면 만약에 이름이 all, clean fclean, re 같은 이름을 가진 폴더, 타겟이 있으면 에러가 생기노! 그렇기 때문에 phony로 저렇게 해준다.
%.o : %.c
$(CC) $(FLAGS) -c $< -o $@ -I .
-> $< 와 $^ 의 차이는 무엇일까?
$^로 하게되면 파일들의 제일
$< 는 수정 시간이 가장 최근인 것만 적용한다! (변경사항이 있는것)