<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 동작 수행한다는 뜻.