목표
Level : 3
학습 목표 : 자동 변수(Automatic variables)를 사용할 수 있다.
---------
< 문제 >
.c 파일들을 .o 파일로 컴파일한 뒤, ft라는 이름의 정적라이브러리 파일(libft.a)로 만드시오.
< 제한 사항 >
- 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) $@ $?
설명
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 변수에 할당합니다.
자동 변수(Automatic Variables) 설명
$@: 현재 타겟의 이름을 나타냅니다. 여기서는 $(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와 동일하게 작동하되, 변경된 오브젝트 파일만을 대상으로 합니다.