BACK/리눅스

Makefile 공부

혀니리리 2021. 6. 13. 16:07
728x90

<makefile 공부>

make : 파일 간의 종속 관계를 파악하여 Makefile(기술파일)에 적힌 대로 컴파일러에 명령하여 SHELL명령이 순차적으로 실행될 수 있게 함.

 

Makefile 장점 : 1. 각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약

2. 프로그램의 종속 구조를 빠르게 파악할 수 있으며 관리가 용이

3. 단순 반복 작업 및 재작성을 최소화

 

Makefile 구조: 1. 목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일

2. 의존성(Dependency): 목적파일을 만들기 위해 필요한 재료 ( : 에서 : 뒤에 오는 애들. )

3. 명령어(Command): 실행되어야 할 명령어들

4. 매크로(macro): 코드를 단순화시키기 위한 방법 (TARGET = libft.a 등…)

+내부 매크로 (ex) $@ : 현재 타겟의 이름/ $^ : 현재 타겟의 종속 항목 리스트)

 

더미 타겟: 파일을 생성하지 않는 파일 (ex) clean, fclean 등…)

 

https://xn--vj5b11biyw.kr/126 =>  library 파일 사용해서 코드 실행하는 방법

 

예제

CC=gcc

CFLAGS = -Wall -Wextra -Werror

TARGET = libft.a

SOURCE_FILE = ft_bzero.c ft_calloc.c ft_memset.c ft_strdup.c

INCLUDE = include/libft.h

OBJS = ${SOURCE_FILE:.c=.o} //SOURCE_FILE 에서 .c 를 찾아 .o 로 변경.

 

.c.o: //사용자가 설정 안해줘도 기본저긍로  gcc해서 변환해줄 수도 있지만 거기에 특별한 규칙을 넣고싶을 때는 .c.o로 gcc 규칙을 변경시켜줌.

    ${CC} ${CFLAGS} -I ${INCLUDE} -c $< -o ${<: .c=.o} // $< : 현재 목표 파일보다 더 최근에 갱신된 파일명, 첫 번째 종속물 이름

//<: : 현재 목표파일보다 최근에 갱신된 파일명에서 두번째 종속물 이름

 

${TARGET} : ${OBJS} //make 만 했을때 만들어지는 결과. OBJS들을 필요로 함.

          ar rc $@ ${OBJS} //ar : library archive 를 만들거나 관리.. -r : 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환함.

                                                                                                        -c : 기본적으로 표준 에러로 기록되어지는 진단 메시지의 출력 제한.

 

All : ${TARGET} //all : 더미타겟이 바로 첫 번째 타겟으로써 작용됨.

 

Clean:

rm -f ${OBJS} //object 파일을 지움

 

Fclean:

rm -f ${OBJS} ${TARGET} //object파일들과 target 파일을 같이 지움 (-f : 삭제할 건지 다시 묻지 않고 바로 삭제)

 

Re: fclean all //fclean 동작 실행 후 all 동작 수행한다는 뜻.

728x90