42SEOUL

[C / Libft] Makefile 만들기

daykim 2022. 1. 21. 18:08

Makefile

반복적으로 발생하는 컴파일을 쉽게 하기 위해 사용하는

make 프로그램의 설정 내용이 작성된 기술파일

 

Makefile 구조

Target : Dependency
(tab) Command

Target

  • 빌드 대상 이름. 명령에 의해 생성되는 파일

Dependency

  • Target 생성 시 사용되는 파일들

Command

  • Target을 생성하는 명령
  • 여러줄로 작성 가능하며, Dependency 파일이 변경됐거나, 대상 파일이 없을 때 실행됨
  • shell에서 사용 가능한 명령어 사용 가능
  • tab 키로 띄운 후 작성

 

라이브러리를 위한 Makefile 만들기

NAME = libft.a

CC = gcc
CFLAGS = -Wall -Wextra -Werror

AR = ar rcs
RM = rm -rf

SRCS = ft_isalpha.c

OBJS = $(SRCS:.c=.o)

all : $(NAME)

.c.o : $(SRCS)
	$(CC) $(CFLAGS) -c $< -o $@ -I.

$(NAME) : $(OBJS)
	$(AR) $@ $^	

clean :
	$(RM) $(OBJS)

fclean : clean
	$(RM) $(NAME)

re : clean all

.PHONY: all clean fclean re bonus
  • re : 작성된 타겟 순차적으로 진행
  • all : 최종적으로 만들어줄 파일
  • clean : 생성된 목적 파일을 삭제해주는 타겟
  • fclean : 생성된 목적 파일, 라이브러리 파일을 삭제해주는 타겟
  • -l 옵션 : 전처리 과정에서 헤더 파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션
    '폴더' 의 경로를 지정해주는 옵션
    'I' 옵션 바로 옆에 헤더파일의 위치 경로를 붙여주면 헤더파일 인식이 가능해진다

 

relink

코드가 바뀌지 않은 상태에서 make 명령어 실행시

최신 파일이라 libft.a를 다시 만들지 않으면 relink가 되지 않은 것

.PHONY

위의 것을 달아주지 않으면 실행 명령어 조합이라도 clean과 fclean, all을 Target 파일로 인식한다.

Makefile과 같은 폴더에 clean이나 fclean의 이름을 가진 파일이 존재시 명령어를 실행하지 않는다.

ar

정적 라이브러리 파일 생성 명령어

파일들을 모아 아카이브 파일(라이브러리)로 압축해주는 명령어

  • 옵션
    • r : 오브젝트 추가
    • c : 아카이브 생성
    • s : 인덱스 생성

Makefile에서 지원하는 변수

$@ 현재 타겟 이름
$^ 현재 타겟의 dependency 항목 리스트
$* 확장자가 없는 현재의 타겟 파일
$< 현재의 타겟 파일보다 더 최근에 갱신된 파일 이름
$? 현재의 타겟 파일보다 더 최근에 갱신된 파일 이름

 

문법

$(addsuffix 접미사, 문자열)
  • $(addsuffix .c, memo main) => memo.c main.c
$(addprefix 접두어, 문자열)
  • $(addprefix src/, memo main) => src/memo src/main

 

Makefile 실행

// Makefile 대로 컴파일 실행
make

// 현재 directory에 모든 object파일과 실행파일을 rm 명령어로 제거
make clean

 

참고

'42SEOUL' 카테고리의 다른 글

[C] File 종류와 함수  (0) 2022.03.08
[C] LIBFT 정리  (0) 2022.02.13
[C] NULL 포인터  (0) 2022.01.21
[c] LIBFT 2  (0) 2022.01.12
[C] size_t  (0) 2021.11.18