Makefile 만들기 공부

조병화·2022년 7월 12일
0

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 .

-> $< 와 $^ 의 차이는 무엇일까?
$^로 하게되면 파일들의 제일
$< 는 수정 시간이 가장 최근인 것만 적용한다! (변경사항이 있는것)

profile
yback주인님 미피킹!

0개의 댓글