[libft] makefile 간단 정리

hyeojung·2021년 5월 20일
0

42Seoul

목록 보기
7/16
post-thumbnail

1. 컴파일 (compile)

소스 코드를 컴퓨터가 이해할 수 있는 기계어(어셈블리어)로 변환하는 과정

c언어 소스코드를 컴파일하는 경우, gcc 컴파일러에 -c 옵션을 주어 컴파일하면 목적 파일(object file)이 생성된다.
-c는 인자로 주어지는 파일을 컴파일해 목적 파일을 생성하라는 의미이다.



2. 링킹 (linking)

컴파일된 목적 파일(object file)을 링크하여 실행 파일을 생성하는 과정

컴파일러에 목적 파일들을 인자로 전달함으로써 이 과정이 실행된다.
-o 옵션을 주면 아웃풋 파일의 이름을 지정해줄 수 있고, 이 옵션이 없으면 a.out 이라는 임의의 이름을 가진 실행 파일이 생성된다.




3. make

왜 make를 사용하는가?

컴파일하고 링킹할 소스 파일이 많을 때 빠르게 명령을 실행하기 위해
많은 파일 중 일부만을 수정했을 때 필요한 명령어만 실행하기 위해


make란, 주어진 쉘 명령어들을 조건에 맞게 실행하는 프로그램
make 명령어가 따라야 할 조건들을 담은 파일을 Makefile이라고 하며, make 명령어를 실행하면 해당 위치에 있는 Makefile을 찾아 읽어들이게 된다.



4. Makefile

target ... : prerequisites ...
(tab)	recipe

Makefile 은 기본적으로 위와 같이 3가지 요소로 구성되어 있다😀
각각에 대해 먼저 알아보자.

4.1. target

make all, make clean 등과 같이 make를 실행할 때는 어떤 것을 make할지 전달하게 되는데 이를 타겟(target)이라 한다.
만약 사용자가 make all을 입력했다면, 타겟 중에 all을 찾아 이에 대응되는 명령을 실행한다.


4.2. recipes

주어진 타겟을 make할 때 실행할 명령어들의 나열.
반드시 recipe 자리에 명령어를 쓸 때는 탭 한 번으로 들여쓰기를 해야 make가 Makefile을 제대로 읽어들일 수 있다!


4.3. prerequisites

주어진 타겟을 make할 때 사용될 파일들의 목록, 의존 파일(dependency)이라고도 부른다.
유의할 사항은, 주어진 파일들의 수정 시간보다 타겟이 더 나중에 수정되었다면 해당 타겟의 명령어를 실행하지 않는다는 점이다.


4.4. Makefile에서의 변수

Makefile 내에서도 변수를 정의할 수 있다.
예로, 나는 이번 과제를 수행하며 Makefile 내에 다음과 같이 변수를 지정해 주었다.

CC = gcc
CFLAGS = -Werror -Wextra -Wall -I.

이렇게 변수를 지정해 주면 Makefile 내에서 CC를 사용할 때 해당 변수의 문자열인 gcc로 치환된다. 주의할 점은 변수를 사용할 때 $(CC)와 같이 $() 안에 사용하고자 하는 변수의 이름을 넣으면 된다는 점😄

+) Makefile에서 변수를 정의하는 두 가지 방법

  1. =를 사용하는 방법
    정의에 다른 변수가 포함되어 있다면 해당 변수가 정의될 때까지 변수의 값이 정해지지 않음(변수들의 정의 순서에 구애받고 싶지 않다면)
  2. :=를 사용하는 방법
    해당 시점의 변수의 값만 확인함(자기 자신을 수정하고 싶을 때 등)

4.5. PHONY

만약 우리가 Makefile에 다음과 같은 명령을 넣었을 때,

clean:
	rm -f $(OBJS)

실제로 clean이라는 파일이 디렉토리에 생성된다면 make clean 명령이 들어왔을 때 어떻게 될까?
make는 clean의 의존 파일들이 없는데 clean 파일이 존재하므로 clean 파일이 항상 최신인 것으로 간주하여 명령을 무시하게 된다.

이와 같은 상황을 막기 위해 clean을 아래와 같이 PHONY라고 등록해야 한다.

.PHONY: clean

4.6. 패턴 사용해 Makefile 작성하기

패턴을 사용하면 특정 조건에 부합하는 파일에 대해 간단하게 recipe를 작성할 수 있지만, target과 prerequisite 부분에만 사용할 수 있다😉

%.o: 와일드카드로 생각하면 *.o와 같다. 즉 .o로 끝나는 파일 이름들을 의미

$@: 타겟 이름에 대응
$<: 의존 파일 목록의 첫 번째 파일에 대응
$^: 의존 파일 목록 전체에 대응
$?: 타겟보다 최신인 의존 파일들에 대응
$+: $^와 비슷하나, 중복된 파일 이름들까지 모두 포함



5. 그 외 참고하면 좋을 사이트들

https://velog.io/@hidaehyunlee/Makefile-자주-사용하는-문법-정리
https://modoocode.com/311

profile
응애 나 애기 개발자

0개의 댓글