목표
Level : 8
학습 목표
- 디렉토리에 정리된 소스코드로 메이크파일을 만들 수 있다.
---------
< 문제 >
- ./src/*.c 파일들을 ./obj/*.o 파일로 컴파일 한 뒤 ./main을 생성하시오.
- 'make run'을 실행하면 ./main 을 실행하도록 작성하시오.
< 제한 사항 >
- .c 파일들을 할당한 변수를 함수로 치환하여 .o 파일을 할당할 변수로 정의하시오.
- 패턴 Rule을 사용하여 오브젝트 파일 생성 규칙을 정의하시오 - Rule의 Recipe 작성 시 Target과 Dependency를 적절한 자동 변수(Automatic Variables)를 사용하여 작성하세요.
- Rule을 변수만으로 작성하시오.
- 적절한 변수를 할당하시오.
- 리링크되지 않아야 합니다.
코드
NAME := main
SRC_DIR = ./src/
SRC_NAME = main.c \
first.c \
second.c \
third.c
SRC = $(addprefix $(SRC_DIR),$(SRC_NAME))
OBJ_DIR = ./obj/
OBJ_NAME = $(SRC_NAME:.c=.o)
OBJ = $(addprefix $(OBJ_DIR),$(OBJ_NAME))
CC := gcc
CFLAGS := -Wall -Wextra -Werror
INCLUDE := -I./include
all : $(NAME)
clean :
rm -f $(OBJ)
fclean : clean
rm -f $(NAME)
re : fclean all
run : all
./$(NAME)
$(NAME) : $(OBJ)
$(CC) $(CFLAGS) -o $@ $^
$(LIBFT) : $(LIB_OBJS)
$(AR) $(ARFLAGS) $@ $?
$(OBJ_DIR)%.o : $(SRC_DIR)%.c
@mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
.PHONY : all clean fclean
설명
변수 설명
NAME := main: 생성할 실행 파일의 이름을 NAME 변수에 할당합니다.
SRC_DIR = ./src/: 소스 파일이 위치한 디렉토리를 SRC_DIR 변수에 할당합니다.
SRC_NAME = main.c first.c second.c third.c: 컴파일할 소스 파일들의 이름을 SRC_NAME 변수에 할당합니다.
SRC = $(addprefix $(SRC_DIR),$(SRC_NAME)): 소스 파일의 전체 경로를 SRC 변수에 할당합니다.
OBJ_DIR = ./obj/: 오브젝트 파일이 저장될 디렉토리를 OBJ_DIR 변수에 할당합니다.
OBJ_NAME = $(SRC_NAME:.c=.o): 소스 파일 이름에서 확장자를 .o로 변경하고, 그 결과를 OBJ_NAME 변수에 할당합니다.
OBJ = $(addprefix $(OBJ_DIR),$(OBJ_NAME)): 오브젝트 파일의 전체 경로를 OBJ 변수에 할당합니다.
CC := gcc: C 컴파일러를 CC 변수에 할당합니다.
CFLAGS := -Wall -Wextra -Werror: 컴파일러 플래그를 CFLAGS 변수에 할당합니다.
INCLUDE := -I./include: 헤더 파일이 위치한 디렉토리를 지정합니다.
룰과 명령어
all : $(NAME): make all 또는 make 명령을 실행하면 $(NAME) (여기서는 main) 타겟이 생성됩니다.
clean :: make clean 명령을 실행하면 모든 .o 파일이 삭제됩니다.
fclean : clean: make fclean 명령을 실행하면 clean 타겟이 먼저 실행되고, 그 후에 $(NAME) (여기서는 main) 파일이 삭제됩니다.
re : fclean all: make re 명령을 실행하면 fclean과 all 타겟이 순차적으로 실행됩니다.
run : all: make run 명령을 실행하면 all 타겟이 먼저 실행되고, 그 후에 ./main 실행 파일이 실행됩니다.
$(NAME) : $(OBJ): $(NAME) 타겟은 $(OBJ) 의존성을 가집니다. 이 의존성을 만족시킨 후에 실행 파일을 생성합니다.
$(OBJ_DIR)%.o : $(SRC_DIR)%.c: 패턴 Rule을 사용하여 .c 파일을 .o 파일로 컴파일하는 일반적인 규칙을 정의합니다. 이 때, 오브젝트 파일은 ./obj/ 디렉토리에 저장됩니다.