목표
Level : 6
학습 목표
- Phony target 을 사용할 수 있다.
---------
< 문제 >
-.c 파일들을 .o 파일로 컴파일한 뒤, ft라는 이름의 정적라이브러리 파일(libft.a)로 만드시오.
- 'make all' 실행 시 'libft.a' 파일을 생성되도록 작성하시오.
- 'make' 실행 시 'make all'이 실행되게 하시오.
- 'make clean' 명령 실행 시 오브젝트파일이 삭제될 수 있게하시오.
- 'make fclean' 명령 실행 시 'libft.a' 파일이 삭제되도록하시오.
- 'make re' 명령 실행 시 'make fclean' 'make all' 을 연속으로 실행한 것과 같은 결과가 되게 하시오.
< 제한 사항 >
- .c 파일들을 할당한 변수를 함수로 치환하여 .o 파일을 할당할 변수로 정의하시오.
- 패턴 Rule을 사용하여 오브젝트 파일 생성 규칙을 정의하시오 - Rule의 Recipe 작성 시 Target과 Dependency를 적절한 자동 변수(Automatic Variables)를 사용하여 작성하세요.
- Rule을 변수만으로 작성하시오.
- 적절한 변수를 할당하시오.
- ar 유틸리티를 사용하여 archive 하시오.
- 리링크되지 않아야 합니다.
코드
NAME := libft.a
SRCS := first.c second.c third.c
OBJS := $(SRCS:.c=.o)
AR := ar
ARFLAGS := -rc
CC := gcc
CFLAGS := -Wall -Wextra -Werror
all : $(NAME)
clean :
rm -f *.o
fclean : clean
rm -f $(NAME)
re : fclean all
$(NAME) : $(OBJS)
$(AR) $(ARFLAGS) $@ $?
%.o : %.c
$(CC) $(CFLAGS) -c $<
.PHONY : all clean fclean
설명
변수 설명
NAME := libft.a: 생성할 정적 라이브러리의 이름을 NAME 변수에 할당합니다.
SRCS := first.c second.c third.c: 컴파일할 소스 파일들의 목록을 SRCS 변수에 할당합니다.
OBJS := $(SRCS:.c=.o): 함수를 사용하여 .c 파일들을 .o 파일로 치환하고, 그 결과를 OBJS 변수에 할당합니다.
AR := ar: 아카이브 유틸리티의 이름을 AR 변수에 할당합니다.
ARFLAGS := -rc: ar 명령어에 전달할 플래그를 ARFLAGS 변수에 할당합니다.
CC := gcc: C 컴파일러를 CC 변수에 할당합니다.
CFLAGS := -Wall -Wextra -Werror: 컴파일러 플래그를 CFLAGS 변수에 할당합니다.
Phony Target 설명
.PHONY : all clean fclean: 이것은 Phony Target을 정의합니다. all, clean, fclean은 실제 파일이 아니라 명령어로만 작동하게 됩니다.
룰과 명령어
all : $(NAME): make all 또는 make 명령을 실행하면 $(NAME) (여기서는 libft.a) 타겟이 생성됩니다.
clean :: make clean 명령을 실행하면 모든 .o 파일이 삭제됩니다.
fclean : clean: make fclean 명령을 실행하면 clean 타겟이 먼저 실행되고, 그 후에 $(NAME) (여기서는 libft.a) 파일이 삭제됩니다.
re : fclean all: make re 명령을 실행하면 fclean과 all 타겟이 순차적으로 실행됩니다. 이는 make fclean과 make all을 연속으로 실행한 것과 같은 결과를 가져옵니다.
$(NAME) : $(OBJS): $(NAME) (여기서는 libft.a) 타겟은 $(OBJS) (여기서는 first.o, second.o, third.o) 의존성을 가집니다.
$(AR) $(ARFLAGS) $@ $?: ar 명령어와 플래그, 그리고 자동 변수를 사용하여 정적 라이브러리를 생성합니다.
%.o : %.c: 패턴 Rule을 사용하여 .c 파일을 .o 파일로 컴파일하는 일반적인 규칙을 정의합니다.
$(CC) $(CFLAGS) -c $<: 각 .c 파일을 .o 파일로 컴파일합니다.
제한 사항에 대한 해석
.c 파일들을 할당한 변수를 함수로 치환하여 .o 파일을 할당할 변수로 정의하시오: $(SRCS:.c=.o) 함수를 사용하여 이를 충족시켰습니다.
패턴 Rule을 사용하여 오브젝트 파일 생성 규칙을 정의하시오: %.o : %.c 패턴 Rule을 사용하여 일반적인 오브젝트 파일 생성 규칙을 정의했습니다.
Rule의 Recipe 작성 시 Target과 Dependency를 적절한 자동 변수(Automatic Variables)를 사용하여 작성하세요: $@와 $< 자동 변수를 사용하여 명령어를 추상화했습니다.
Rule을 변수만으로 작성하시오: 모든 룰과 명령어에 변수를 사용하여 추상화를 실현했습니다.
적절한 변수를 할당하시오: 각각의 목적에 맞는 적절한 이름의 변수를 할당하여 코드의 가독성과 유지보수성을 높였습니다.
ar 유틸리티를 사용하여 archive 하시오: ar 유틸리티와 그에 대한 플래그 -rc를 사용하여 오브젝트 파일을 아카이브했습니다.
리링크되지 않아야 합니다: $? 자동 변수를 사용하여 변경된 오브젝트 파일만을 대상으로 하므로, 불필요한 리링크는 발생하지 않습니다.