본문 바로가기
컴퓨터공학/리눅스 시스템 프로그래밍(linux system programming)

makefile 사용법

by 바코94 2019. 9. 28.

makefile은 컴파일과 링킹 자동화를 위한 도구이다.

 

세 개의 c 파일을 합쳐서 실행파일을 만들 경우 

% gcc -c main.c

% gcc -c foo.c

% gcc -c fun.c

 

각각 object 파일을 만든 후 링킹을 시켜 실행파일을 만들어야 한다.

또한, clean이나 각종 환경변수 설정을 하게 되는 경우 반복되는 작업들이 많이 발생한다. 

따라서, makefile을 통하여 반복되는 작업을 재사용하는 효과를 얻을 수 있다.

 

object 파일이란 c파일 자체를 컴파일하여 얻은 binary 파일이다. main.c -> main.o , foo.c -> foo.o 가 된다.

여러 object 파일이 있다면 각각의 object 파일(binary, 기계어 파일)을 우선 만들고 이들을 링킹하여 실행파일을 만든다.

 

make 파일의 구조는 다음과 같다.

 

1.목표파일 이름 : 2. 목표파일을 만드는데 필요한 구성요소 이름들

(탭)3.명령어 목록들

  

간단한 설명과 예시 링크

https://bowbowbow.tistory.com/12

 

 

 

makefile 내에서 variable assignment 방법

:= 는 해당되는 라인에서 할당되는 방식 ( c언어에서 assignment 방식과 유사, 즉시 그 라인에서 사용 가능한 것들로 구성됨.)

= 는 compiler bnf 방식과 유사 

ex)

example of := 

A := 3

B := $(A) --> A가 미리 선언되어 있어야함.

 

example of =

C = $(D) -> 아래에 recursive 하게 정의되있을 것으로 예상함.

D = HELLO + $(E)  -> HELLO는 그냥 사용하고 E는 아래에 나올 것 예상.

E = WORLD 

 

how to use variable

$(variable name) 으로 사용한다.

ex)

NUM = 10

$(NUM)

 

variable assingnment and use 참조 설명

https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_6.html

 

how to append more text to variable

+= word 하면 ' word'이 추가됨.

ex)

object = main.o foo.o ( object assign 'main.o foo.o' )

object += fun.o ( object change to 'main.o foo.o fun.o' with single space front of 'fun.o')

 

object is 'main.o foo.o fun.o'

 

https://www.gnu.org/software/make/manual/html_node/Appending.html

 

자주 사용되는 예약어 설명

$@ : target

$< : first dependency

$^  : all dependency

 

ex)

all : library.cpp main.cpp

x : y -> x evaluates to y 
$@ : all

$< : library.cpp

$^ : library.cpp main.cpp

 

 

.PHONY 사용 이유

makefile 이 위치한 폴더에 target name과 중복되는 파일이 이미 있을 수도 있기 때문에 사용한다.

make clean 같은 경우 clean이라는 파일명이 이미 파일로 존재할 수도 있다.

이 때 .PHONY : clean 을 미리 해두면 이미 존재하는 clean파일과 상관 없이 make clean을 이용할 수 있다.

clean 명령어를 실행해도 clean 파일이 별도로 생성되지 않는다. 따라서 이런 키워드 들에 대해서는 .PHONY에 등록해두는 것이 좋다.

 

.PHONY stackoverflow 두번째 답변 참조

https://stackoverflow.com/questions/2145590/what-is-the-purpose-of-phony-in-a-makefile

 

 

symbol '%'

% means string like 'main'

ex)

%.o : %.c

(tab) $ gcc -c $^ -o $@

%에 main이 온다면 main.o : main.c로 사용된다.