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로 사용된다.
'컴퓨터공학 > 리눅스 시스템 프로그래밍(linux system programming)' 카테고리의 다른 글
signal in terms of OS (0) | 2019.10.03 |
---|