목표
Level : 4
학습 목표 : 패턴 Rule을 사용할 수 있다.
---------
< 문제 >
.c 파일들을 .o 파일로 컴파일한 뒤, ft라는 이름의 정적라이브러리 파일(libft.a)로 만드시오.
< 제한 사항 >
- 패턴 Rule을 사용하여 오브젝트 파일 생성 규칙을 정의하시오 - Rule의 Recipe 작성 시 Target과 Dependency를 적절한 자동 변수(Automatic Variables)를 사용하여 작성하세요.
- Rule을 변수만으로 작성하시오.
- 적절한 변수를 할당하시오.
- ar 유틸리티를 사용하여 archive 하시오.
- 리링크되지 않아야 합니다.
코드
NAME := libft.a
SRCS := first.c second.c third.c
OBJS := first.o second.o third.o
AR := ar
ARFLAGS := -rc
$(NAME) : $(OBJS)
$(AR) $(ARFLAGS) $@ $?
%.o : %.c
$(CC) $(CFLAGS) -c $<
설명
변수 설명
NAME := libft.a: 생성할 정적 라이브러리의 이름을 NAME 변수에 할당합니다.
SRCS := first.c second.c third.c: 컴파일할 소스 파일들의 목록을 SRCS 변수에 할당합니다.
OBJS := first.o second.o third.o: 컴파일된 오브젝트 파일들의 목록을 OBJS 변수에 할당합니다.
AR := ar: 아카이브 유틸리티의 이름을 AR 변수에 할당합니다.
ARFLAGS := -rc: ar 명령어에 전달할 플래그를 ARFLAGS 변수에 할당합니다.
패턴 Rule과 자동 변수(Automatic Variables) 설명
%.o : %.c: 이것은 패턴 Rule입니다. .c 파일이 .o 파일로 변환되는 일반적인 규칙을 정의합니다.
$<: 현재 타겟의 첫 번째 의존성을 나타냅니다. 여기서는 각각의 .c 파일이 됩니다.
$@: 현재 타겟의 이름을 나타냅니다. 여기서는 $(NAME)에 해당하는 libft.a가 됩니다.
$?: 타겟보다 더 최근에 업데이트된 모든 의존성 파일들의 목록을 나타냅니다. 여기서는 $(OBJS)에 해당하는 first.o, second.o, third.o 중 변경된 파일이 있으면 그것을 나타냅니다.
룰과 명령어
$(NAME) : $(OBJS): 이 룰은 $(NAME) (여기서는 libft.a)라는 타겟이 $(OBJS) (여기서는 first.o, second.o, third.o)라는 의존성을 가진다고 명시합니다.
$(AR) $(ARFLAGS) $@ $?: 이 명령어는 자동 변수를 사용하여 ar -rc libft.a first.o second.o third.o와 동일하게 작동하되, 변경된 오브젝트 파일만을 대상으로 합니다.
$(CC) $(CFLAGS) -c $<: 이 명령어는 각 .c 파일을 .o 파일로 컴파일합니다. 여기서 $(CC)는 C 컴파일러(일반적으로 gcc)를, $(CFLAGS)는 컴파일러 플래그를 나타냅니다. 이 예제에서는 $(CFLAGS)가 명시되지 않았으므로 기본값이 적용됩니다.