(shell) - Makefile ์ด๋ ? gcc, g++๊ณผ makefile์ ์ฐจ์ด? ๋ณ์ ์ค์
- -
์๋์ฐ์์๋ ๋น์ฅฌ์ผ ์คํ๋์ค๋ฑ์ ์ฌ์ฉํ์ฌ ๋ฒํผ์ ๋๋ฌ ์ปดํ์ผํ์ง๋ง, ๋ฆฌ๋ ์ค ํ๊ฒฝ์์ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ ํ ๋ make๋ผ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ค.
1. makefile ์ด๋?
Shell์์ ์ปดํ์ผํ๋ ๋ฐฉ๋ฒ์ค ํ๋์ด๋ค.
makefile์ด๋ผ๋ ํ์ผ์, ์ด๋ค ํ์ผ์ ์ปดํ์ผ ํ๋์ง, ์ด๋ ํ ๋ฐฉ์์ผ๋ก ์ปดํ์ผ ํ ์ง ์์ฑํด๋๋๋ค. ๊ทธ๋ฆฌ๊ณ make๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด makefile ์ด ๋ค์ด์๋ ๋๋ ํ ๋ฆฌ์์ ํ์ผ๋ค์ ์ข ์๊ด๊ณ๋ฅผ ํ์ ํ์ฌ ์๋์ ์ผ๋ก ์ปดํ์ผํ๊ฒ ๋๋ค.
์ฆ, makefile๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํ๋ฉด ์ฌ๋ฌ๊ฐ์ ํ์ผ์ ์ปดํ์ผํ ๋, ์๋ํ๋ก ์ธํด ์๊ฐ์ ์ ์ฝํ๊ณ , ํ๋ก๊ทธ๋จ์ ์ข ์ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค. + ๋ง์ฝ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ ์์ ํ๋ค๋ฉด, ๊ทธ ๋ถ๋ถ์ ๋ํด์๋ง ์ปดํ์ผ ํ๋๋ก ๋์์ฃผ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํจ์จ์ ์ด๋ค.
2. gcc๋ฅผ ์ฌ์ฉํ ๋ ์ปดํ์ผ์ ์์ (make์ ์ฌ์ฉํ์ง ์์์๋ ํ๋ก๊ทธ๋จ์ ๋น๋ ์ ์ฐจ)
์ผ๋ฐ์ ์ผ๋ก gcc , g++, clang ๋ฑ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํ ๋์ ์์๋ ์๋์ ๊ฐ๋ค.
๋ง์ฝ์ ๋๋ ํ ๋ฆฌ ๋ด์ ์๋์ ๊ฐ์ด ํ๋ก๊ทธ๋จ ํ์ผ๋ค์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด,
- main.c
#include "f1.h" // ํ์ฌ๊ฒฝ๋ก์ ์๊ธฐ ๋๋ฌธ์ ์๋ฐ์ดํ + ํค๋ํ์ผ์ด๋ฆ ์ผ๋ก includeํด์ฃผ๋ฉด ๋๋ค.
#include "f2.h"
int main(void)
{
f1();
f2();
}
- f1.c
#include <stdio.h>
void f1()
{
printf("this is f1");
}
- f2.c
#include <stdio.h>
void f1()
{
printf("this is f1");
}
- f1.h
void f1(); //ํค๋ํ์ผ์๋ ํจ์ ํํ + ํจ์๋ช
์ ์ ๋๋ค.
- f2.h
void f2();
ํ์ผ์ ๋ค ์์ฑํ์ผ๋ฉด, ์ปดํ์ผ ํ์ฌ ์ค๋ธ์ ํธ ํ์ผ์ ์์ฑํด์ผ ํ๋ค. (ํค๋ํ์ผ๋ค์ main.c ํ์ผ์์ ๋ช ์๋์ด ์์ผ๋ฏ๋ก, ๋ฐ๋ก ์ปดํ์ผ ํ ๋ ํฌํจ์ํค์ง ์์๋ ๋๋ค.)
$ gcc -c main.c f1.c f2.c
๊ทธ๋ผ ์๋์ ๊ฐ์ ์ค๋ธ์ ํธํ์ผ๋ค์ด ์์ฑ๋๋ค.
- main.o
- f1.o
- f2.o
$ gcc main.o f1.o f2.o
๋ค์์ผ๋ก๋ ์ ๋ช ๋ น์ด๋ฅผ ํตํด์ ์ค๋ธ์ ํธํ์ผ๋ค์ ํ๋๋ก ์ฐ๊ฒฐ์ํจ ์คํํ์ผ์ ์์ฑํ๋ค. ์ด ๊ณผ์ ์ "๋งํน"์ด๋ผ๊ณ ๋งํ๋ค.
๋ฐ๋ก ํ์ผ๋ช ์ ์ง์ ํ์ง ์์ผ๋ฉด a.out์ด๋ผ๋ ํ์ผ๋ก ์์ฑ๋๋ค.
$ ./a.out
์ด๋ ๊ฒ ์คํํด์ฃผ๋ฉด ๋๋ค.
3. Makefile ์ ์ฌ์ฉํ์ฌ ๋น๋ํ๊ธฐ
makefile์ 3๊ฐ์ง ์์๋ก ๊ตฌ์ฑ๋๋ค.
- Target (ํ๊ฒ)
- Prerequisites (ํ์ํ ์กฐ๊ฑด๋ค) || ํน์ Dependency : Target์ด ์์กดํ๋ ํ์ผ๋ค
- Recipes (์คํํ ๋ช ๋ น์ด) || ํน์ Command (๋ช ๋ น์ด)
target ... : prerequisites ...
recipe
...
...
...
//recipe ์์ ๋ฐ๋์ tabํค๋ก ๋ค์ฌ์ฐ๊ธฐ ํด์ฃผ์ด์ผํ๋ค.
๊ทธ๋ผ ๋ชฉ์ฐจ 2๋ฒ์์ ํ๋ ๋น๋๊ณผ์ ์ผ๋ก ์๋ฅผ๋ค์ด์ makefile์ ๋ง๋ค์ด ๋ณด๋ฉด
makefile
f1.o : f1.h f1.c
gcc -c f1.c
f2.o : f2.h f2.c
gcc -c f2.c
main.o : main.c f1.h f2.h
gcc -c main.c
main : f1.o f2.o main.o
gcc f1.o f2.o main.o
๋ค์ฌ์ฐ๊ธฐ๋ ๋ฐ๋์ tab์ผ๋ก ํด์ผํ๋ค.
$ make main
make ๋ช ๋ น์ ํตํด ๋น๋ํ๋ฉด 2๋ฒ์์ ํ๋ ๊ณผ์ ๋ค(์ปดํ์ผ + ๋งํน)์ด ๊ทธ๋๋ก ๋น๋๋๋ค.
3 - 1 . makefile ๋ด์์ ๋ณ์ ์ ์ํ๊ธฐ
g = gcc
f1.o : f1.h f1.o
$(g) -c f1.c
๋ณ์๋ ์์ ๊ฐ์ด ์ค์ ํ๋ค. ์ฌ์ฉํ ๋๋ $(๋ณ์๋ช ) ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
4 - 2 . PHONY
makefile ๋ด์ ํํ๊ฒ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ผ๋ก clean์ด ์๋ค. clean์ ๋น๋์ ๊ด๋ จ๋ ํ์ผ๋ค (์ค๋ธ์ ํธ ํ์ผ)์ ๋ชจ๋ ์ ๊ฑฐํ๋ ๋ช ๋ น์ ๋ฃ๋๋ค.
clean:
rm -rf $(OBJS) main
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก make clean ์ด๋ผ๊ณ ์ ๋ ฅํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, clean์ด๋ผ๋ ํ์ผ์ด ๋๋ ํ ๋ฆฌ๋ด์ ์กด์ฌํ ๊ฒฝ์ฐ์๋ ๋ช ๋ น์ด ๋ฌด์๋์ด๋ฒ๋ฆฐ๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ PHONY์ ๋ฑ๋กํ๋ค.
.PHONY: clean
clean:
rm -f $(OBJS) main
PHONY์ ๋ฑ๋ก๋ ๋ช ๋ น์ด๋, ๋์ผ ์ด๋ฆ์ ํ์ผ ์กด์ฌ์ฌ๋ถ๊ณผ ๊ด๊ณ ์์ด ํญ์ ํ๊ฒ ๋ช ๋ น์ ์คํํ๊ฒ ๋๋ค.
4 - 3. ํจํด ์ฌ์ฉ
ํ๋ก์ ํธ๊ฐ ๋ฐฉ๋ํด์ง๋ค๋ฉด, ์๋ํ๋ฅผ ํ๊ธฐ ์ํด makefile๋ด์ recipe์ ์์ฑํ ๋๋ ๋ง์ ์ ๋ ฅ์ด ํ์ํ๋ค.(ํ์ผ๋ช ๋ง ๋ฐ๊พธ์ด ๋ฐ๋ณต์ ์ด๊ณ ๋นํจ์จ์ ์ธ ์์ ) ์ด๋ฅผ ํธํ๊ฒ ํ๊ธฐ ์ํด์ ํจํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
* ํจํด์ target๊ณผ prerequisite ๋ถ๋ถ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ recipe์์๋ "์๋ ๋ณ์"๋ผ๋ ๋ฏธ๋ฆฌ ์ ํด์ง ๋ณ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
* ์๋ ๋ณ์
- $@ : ํ๊ฒ ์ด๋ฆ์ ๋์๋๋ค. (ex : f1.o)
- $< : ์์กด ํ์ผ ๋ชฉ๋ก์ ์ฒซ ๋ฒ์งธ ํ์ผ์ ๋์๋๋ค. (ex : f1.c)
- $^ : ์์กด ํ์ผ ๋ชฉ๋ก ์ ์ฒด์ ๋์๋๋ค. (ex : f1.c , f1.h)
ํจํด์ ์ฌ์ฉํ๊ธฐ ์
f1.o : f1.c f1.h
gcc -c f1.c
f2.o : f2.c f2.h
gcc -c f2.c
ํจํด ์ฌ์ฉ ํ
%.o: %.c %.h
gcc -c $<
%.o ๋ ์์ผ๋์นด๋์ ๋์์ํค๋ฉด *.o์ ๊ฐ๋ค. ํ์ฅ์๊ฐ o์ธ ๋ชจ๋ ํ์ผ์ ํ๊ฒ์ผ๋ก ์ผ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
* ์๋ prerequisite ์์ฑ
์ปดํ์ผ์ -MD์ต์ ์ ์ฃผ๋ฉด, dํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ์ด ์์ฑ๋๋ค. ์ด ํ์ผ์๋ ์๋์ ์ผ๋ก ๋ชฉ์ ํ์ผ๊ณผ ์ปดํ์ผํ ์์คํ์ผ์ ํ๊ฒ์ผ๋ก ์ผ๋ ์์กดํ์ผ๋ค์ ๋ด์ ๋ชฉ๋ก์ ๋ด๊ณ ์๋ค.
$ gcc -c -MD main.c
>>>>> main.d ํ์ผ ์์ฑ๋จ
์ด๋ฌํ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ makefile์์ ์๋์ ์ผ๋ก prerequisite๋ฅผ ์์ฑ ๊ฐ๋ฅํ๋ค.
OBJS = f1.o f2.o main.o
%.o : %.c
gcc -c $<
main : $(OBJS)
gcc -o main
.PHONY: clean
clean:
rm -f $(OBJS) main
-include $(OBJS:.o=.d)
OBJS์ oํ์ฅ์๋ฅผ ๊ฐ๋ ํ์ผ๋ค์ d๋ก ๋์ฒดํ๋ผ๋ ์๋ฏธ๊ฐ ๋๋ค.
์ฐธ์กฐ
'๐ฉโ๐ป C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
C์ธ์ด - <๊ตฌ์กฐ์ฒด> ํ์ดํ ์ฐ์ฐ์, ๋ฉค๋ฒ , ๊ตฌ์กฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ํ ๋น , ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ 2021.01.18
-
C ์ธ์ด - ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (dynamic memory allocation) | malloc , free , stdlib.h , memset 2020.10.19
-
C์ธ์ด - ์ฐธ, ๊ฑฐ์ง (bool , True , False) , <stdbool.h> 2020.10.18
-
C ์ธ์ด - ๋ณ์(variable) ์์(Constant)์ ๋ฆฌํฐ๋ด(literal) | ํฐ ๋ฐ์ดํ , ์์ ๋ฐ์ดํ 2020.10.18
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค