다음은 Makefile과 관련하여 linux manual에 나와 있는 내용이다. 프로그램을 관리하는 프로그램이고 특정 프로그램의 일정 부분이 수정돼 재 컴파일이 필요할 경우 이를 용이하게 해주는 파일이다.
make - GNU make utility to maintain groups of programs
The purpose of the make utility is to determine automatically which pieces of a large program need to be recompiled, and issue the commands to recompile them.
target 내용 : prerequisite 내용
command 내용
예제 1-0)
test : main.o read.o write.o
gcc -o test main.o read.o write.o
main.o : main.c
gcc -c main.c
read.o : read.c
gcc -c read.c
write.o : write.c
gcc -c write.c
gcc -c main.c
gcc -c read.c
gcc -c write.c
gcc -o test main.o read.o write.o
또 주목할 것은 make 프로그램은 처음으로 인식한 target의 prerequisite 에 접근하고 해당 내용에 적힌 내용이 target이 된 영역으로 가 꼬리에 꼬리를 물어 command가 실행되는 절차를 볼 수 있다.
다시 말해 test 파일을 만들기 위해 필요한 절차들이 모두 실행된다. 그리고 꼬리에 꼬리를 무는 재귀적 작업을 make 프로그램이 수행하기 위해서는 작성자가 위에서 배운 형식에 맞춰 작성해야 한다.
test : main.o read.o write.o
gcc -o test main.o read.o write.o
main.o : main.c
gcc -c main.c
read.o : read.c
gcc -c read.c
write.o : write.c
gcc -c write.c
main.o : main.c
gcc -c main.c
read.o : read.c
gcc -c read.c
write.o : write.c
gcc -c write.c코드를 입력하세요
test : main.o read.o write.o
gcc -o test main.o read.o write.o
all : test
main.o : main.c
gcc -c main.c
read.o : read.c
gcc -c read.c
write.o : write.c
gcc -c write.c
test : main.o read.o write.o
gcc -o test main.o read.o write.o
Macro makes Makefile happy
이번에는 Macro의 사용을 통해 위에서 작성한 코드를 줄이는 방법에 대해서 알아보자 !
매크로로 CC, TARGET, OBJS를 만들었고 대응하는 값으로 각각 gcc, test, main.o
read.o write.o 값을 넣어주었다. 기본 뼈대 위에 변수 선언 하듯이 먼저 작성해주면 된다.
그 다음 아래에서 사용하기 위해서 매칭되는 부분이 있을 경우 $()안에 매크로명을 넣어주기만 하면
끝!
CC = gcc
TARGET = test
OBJS = main.o read.o write.o
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $(TARGET) $(OBJS)
main.o : main.c
$(CC) -c main.c
read.o : read.c
$(CC) -c read.c
write.o : write.c
$(CC) -c write.c
CC = gcc
TARGET = test
OBJS = main.o read.o write.o
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
main.o : main.c
$(CC) -c main.c
read.o : read.c
$(CC) -c read.c
write.o : write.c
$(CC) -c write.c
CC = gcc
TARGET = test
OBJS = main.o read.o write.o
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
%.o : %.c
$(CC) -c $< -o $@
%o 는 target 영역에 있고 %c는 prerequisite 영역에 있다. %가 의미하는 것은 .o로 끝나는 모든 파일을 의미한다. 전제조건란에는 %.c가 있으므로 .c로 끝나는 모든 파일이 그에 해당한다.
command 란에 $(CC) -c $< -o $@ < 부분을 해석하면 gcc -c (파일이름).c -o (파일이름).o 인데 위에서 작성한 다음 코드부분을 수행시키기 위해 $(OJBS)에 해당하는 목적파일 main.o read.o write.o가 필요하므로 각각을 생성해주어야 한다.
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
따라서 makefile은 main.o를 만들기 위해 main.c를 찾아 gcc -c main.c -o main.o를 수행할 것이고 그다음 gcc -c read.c -o read.o 마지막으로 gcc -c write.c -o write.o를 수행할 것이다.
CC = gcc
TARGET = test
OBJS = main.o read.o write.o
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
.c.o :
$(CC) -c -o $@ $<
clean :
rm -f $(OBJS) $(TARGET)
CC = gcc
TARGET = test
OBJS = main.o read.o write.o
all : $(TARGET)
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
.c.o :
$(CC) -c -o $@ $<
clean :
rm -f $(OBJS) $(TARGET)
.PHONY : clean
TARGET = 최종 만들 파일이름 적는 란
OBJS : 오브젝트 파일 적는 란
CC = 컴파일 적는 란
CFLAGS = gcc의 옵션 적는 란
INC = include 되는 헤더파일의 경로 적는 란
TARGET = libft.a
SRCS = srcs/ft_putchar.c srcs/ft_swap.c srcs/ft_putstr.c srcs/ft_strlen.c srcs/ft_strcmp.c
OBJS = $(SRCS:.c=.o)
INC = includes/ft.h
CC = gcc
CFLAGS = -c -Wall -Wextra -Werror
all : $(TARGET)
$(TARGET) : $(OBJS)
ar -cr $@ $^
%.o: %.c
$(CC) $(CFLAGS) $< -o $@ -I $(INC)
clean :
rm -rf $(OBJS)
fclean : clean
rm -rf $(TARGET)
re : fclean all
.PHONY : all clean fclean re
<매크로 설정 부분>
TARGET = libft.a
SRCS = srcs/ft_putchar.c srcs/ft_swap.c srcs/ft_putstr.c srcs/ft_strlen.c srcs/ft_strcmp.c
OBJS = $(SRCS:.c=.o)
INC = includes/ft.h
CC = gcc
CFLAGS = -c -Wall -Wextra -Werror
-> 현재 디렉토리 내의 디렉토리 srcs와 includes 폴더 내에 있는 *.c와 *.o 파일을 각각 매크로 처리해주었다.
------------------------------------------------------------------------------------------
<그 외>
all : $(TARGET)
$(TARGET) : $(OBJS)
ar -cr $@ $^
%.o: %.c
$(CC) $(CFLAGS) $< -o $@ -I $(INC)
clean :
rm -rf $(OBJS)
fclean : clean
rm -rf $(TARGET)
re : fclean all
.PHONY : all clean fclean re
------------------------------------------------------------------------------------------
-> 라이브러리를 만들기 위한 형식이고 참고링크를 첨부합니다.
1. ar -cr lib(파일이름) (목적파일...)이다.