본문 바로가기
Language/C언어

C042_Makefile 만들기

by OdOp 관리자 2023. 12. 29.
반응형

makefile에 대해 설명하기에 앞서서 컴파일에 대해 조금은 알아야 할 필요가 있습니다. 

 

컴파일이란?

저희가 작성하는 프로그래밍언어를 기계어로 바꾸어 Object(오브젝트) 파일을  만드는 것입니다. 

 

Makefile은 왜 만드는 것일까요?

여러 개의 c파일들을 한꺼번에 컴파일을 할 경우가 가끔 생깁니다. 그때 Makefile을 만드면 make명령어 한 번으로 필요한 모든 c파일들을 Object(오브젝트) 파일로 만들 수 있습니다.

 

makefile의 사용 이유를 알았으니 어떻게 작성하는지 알아보도록 하겠습니다. 

 

변수 만들기

변수 이름은 대문자로 설정해야 합니다. 

CC = cc
FLAG = -Wall -Wextra -Werror -c
NAME = finish.a
SOURCE = ./test1.c ./test2.c ./test3.c ./test4.c
INC = ./
OBJS = $(SOURCE:.c=.o)

위와 같이 변수를 만들어 저장하고 Makefile에서 지정한 변수를 사용할 수 있습니다. 

  • CC : 컴파일러
  • FLAGS : 컴파일 옵션
  • NAME : Makefile의 목적
  • SOURCE : 컴파일할 c파일들
  • INC : 헤더 파일 저장 위치
  • OBJS : 만들어진 모든 목적 파일
$(SOURCE:.c=.o)

c파일들의 모든 목적 파일들을 불러오는 명령어입니다. 

 

기본 문법

Target : Dependency
    command
  • Target : 말 그대로 목적, 만들고 싶은 것입니다.
  • Dependency : Target을 만들 때에 필요한 것입니다.
  • command : Target을 만드는데 필요한 코드입니다. Dependency가 만약에 변경되게 된다면 command명령을 다시 실행하게 합니다. 
%.o : %.c $(INC)
    $(CC) $(FLAG) $< -o $@ -I $(INC)

위에서 설정한 변수를 사용하여 진행을 했습니다. 

변수를 사용하기 위해서는 '$(변수 이름)'통해 사용할 수 있습니다. 

  • %.o : 모든 목적 파일을 나타냅니다. 
  • %.c : 모든 .c파일을 나타냅니다. 
  • $(CC) : cc 
  • $(FLAG) : -Wall -Wextra -Werror -c
  • $(INC) : ./
  •  $@ : Target 즉, %.o를 나타냅니다. 
  • $< : 의존 파일 목록에 첫 번째 파일을 나타냅니다. 즉, %.c
  • $^ : 의존 파일 목록 전체를 나타냅니다. 즉, %.c $(INC)

command의 변수 부분을 풀어서 적으면 아래와 같은 명령이 됩니다. 

cc -Wall -Wextra -Werror -c ./test1.c ./test2.c ./test3.c ./test4.c -o ./test1.o ./test2.o ./test3.o ./test4.o -I ./

 

all : $(NAME)

$(NAME) : $(OBJS)
    ar rcs $(NAME) $(OBJS)

all은 Makefile의 목적을 나타냅니다. 즉, make 명령어를 실행하게 된다면 $(NAME)을 만들게 됩니다. 

  • $(NAME) : finish.a
  • $(OBJS) : ./test1.o ./test2.o ./test3.o ./test4.o

마찬가지로 command의 변수 부분을 풀어서 적으면 아래와 같은 명령이 됩니다. 

ar rcs finish.a ./test1.o ./test2.o ./test3.o ./test4.o

ar명령어는 아카이브 파일을 만드는 명령어입니다. 

아카이브 파일은 목적 파일들을 하나로 합쳐 놓은 파일입니다. 

 

rcs는 무엇일까요??

  • r : 새로운 목적 파일이면 추가하고 기존 파일이면 치환합니다. 
  • c : 처음으로 아카이브 파일을 만들 때에 오류 메시지가 출력이 되는데 출력이 되지 않도록 해줍니다. 
  • s : 오브젝트 파일의 인덱스 번호를 할당해 줍니다. s옵션을 추가하지 않을 경우에 속도가 느려질 수 있습니다. 

 

Makefile 만들기

CC = cc
FLAG = -Wall -Wextra -Werror -c
NAME = finish.a
SOURCE = ./test1.c ./test2.c ./test3.c ./test4.c
INC = ./
OBJS = $(SOURCE:.c=.o)
all : $(NAME)

%.o : %.c $(INC)
	$(CC) $(FLAG) $< -o $@ -I $(INC)

$(NAME) : $(OBJS)
	ar rcs $(NAME) $(OBJS)

.PHONY : clean fclean re all
clean :
	rm -f $(OBJS)

fclean :
	rm -f $(OBJS)
	rm -f $(NAME)

re :
	rm -f $(OBJS)
	rm -f $(NAME)
	make all

 

위의 예시에서 clean?? fclean?? re?? .PHONY?? 이건 무엇일까요?

 

쉽게 설명을 해드리면 make의 옵션을 만드는 것이라고 생각하면 좋을 것 같습니다. 

 

make clean

'rm -f $(OBJS)'을 명령을 실행하게 됩니다.

make fclean

'rm -f $(OBJS)' 'rm -f $(NAME)'을 명령을 실행하게 됩니다.

make re

'rm -f $(OBJS)' 'rm -f $(NAME)''make all'을 명령을 실행하게 됩니다. 

 

그러면 '.PHONY'는 무엇일까요?

make 옵션을 진행할 때에 디렉토리 안에 clean fclean re와 같은 파일이 있다면 make의 옵션이 진행되지 않을 수 있습니다. 이부분을 방지하는 것이 '.PHONY'입니다. 

반응형

'Language > C언어' 카테고리의 다른 글

C044_malloc 사용하기  (0) 2024.01.02
C043_가변인자 사용하기  (0) 2023.12.30
C041_read함수 사용하기  (0) 2023.12.28
C040_strlen 함수 구현해서 사용하기  (0) 2023.12.08
C039_putnbr만들기  (0) 2023.12.06