์ด ๊ธ์์๋ make ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ C, C++ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
โ ๏ธ ๊ธ์ ์ค๋ฅ๊ฐ ์๊ฑฐ๋ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฒ์ C์ธ์ด๋ฅผ ๋ฐฐ์ธ ๋๋ฅผ ๋ ์ฌ๋ ค๋ณผ๊น์. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์๋์ฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Visual Studio๋ฅผ ์ผ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ ํ์ผ ํ๋๋ฅผ ๊ณ์ ์์ ํ๋ฉด์ ์ปดํ์ผ ํ์ ๊ฒ์
๋๋ค. (ํ์๋ ๊ทธ๋ฌ์์ฃ ) ํ์ง๋ง ์ดํ ์ ์ฐจ ๋ค๋ฅธ ํ๊ฒฝ, ์ด์์ฒด์ ์์ ๊ฐ๋ฐํ๊ฒ ๋๋ค๋ฉด ํ๋์ IDE์ ์์กดํด ์ฝ๋ฉํ๊ธฐ์๋ ์ด๋ ต๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์ต์ข
์ ์ผ๋ก๋ GCC ์ปดํ์ผ๋ฌ๋ฅผ ํ์ฉํด ์ปดํ์ผ์ ์งํํ๊ฒ ๋๋๋ฐ, ๋งค๋ฒ ์ฌ๋ฌ ๋ช
๋ น์ด๋ฅผ ์น๋ค๋ณด๋ฉด ๊ท์ฐฎ์์ง๊ธฐ ๋ง๋ จ์
๋๋ค. ์ด๋ฐ ๊ท์ฐฎ์ ์ํฉ์ ํด๊ฒฐํ๊ณ ์ ๋ฆฌ๋
์ค์ ์กด์ฌํ๋ alias
์ฒ๋ผ ๋ช
๋ น์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํด๋๊ณ ์ปดํ์ผ์ ์งํํ๋๋ฐ, ์ด๋ฅผ ์๋ํํ ํด์ด make์
๋๋ค.
๋ํ make์๋ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ๋ฐ๋ก Incremental Build(์ฆ๋ถ ๋น๋) ๋ผ๋ ๊ธฐ๋ฅ์
๋๋ค. ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ๋ชจ๋ํ๋ฅผ ์ํด ํ์ผ์ ์ฌ๋ฌ ๊ฐ ๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด file_a.c
, file_b.c
, file_c.c
3๊ฐ์ ํ์ผ์ด ์กด์ฌํ๋ ํ๋ก์ ํธ๊ฐ ์๋ค๊ณ ์๊ฐํด๋ด
์๋ค. ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผ ํ๊ณ ์ถ๋ค๋ฉด gcc ๊ธฐ์ค์ผ๋ก gcc file_a.c file_b.c file_c.c
์ ๊ฐ์ด ๋ช
๋ น์ด๋ฅผ ์คํํด ์คํ ํ์ผ์ ๋ง๋ค ๊ฒ์
๋๋ค. ์ด๋ file_b.c
์ ๋ณ๊ฒฝํด์ผ ํ ์ฝ๋๊ฐ ์๊ธด๋ค๊ณ ํ๋ฉด, ํ์ผ์ ์์ ํ๊ณ ์๋ก ์ปดํ์ผ ํ ๋์๋ file_a.c
์ file_b.c
๋ฅผ ์ปดํ์ผ ํด์ผ ํฉ๋๋ค.
๋ฌผ๋ก , ์ค๋ธ์ ํธ ํ์ผ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ ์๋ก ์์ ํ ์ฝ๋์ ๊ฒฝ์ฐ์๋ง ์ค๋ธ์ ํธ ํ์ผ๋ก ๋ณํ์ํค๋ ์์ ์ ํด๋ ๊ด์ฐฎ์ต๋๋ค. ๋ค๋ง ๋ฐ๋๋ ํ์ผ(๋ค)์ ๊ณจ๋ผ ์ค๋ธ์ ํธ ํ์ผ๋ก ๋งค๋ฒ ๋ฐ๊ฟ์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ํํ๊ธฐ ์ฐธ ์ ๋งคํฉ๋๋ค. ์ด๋ฅผ ์์์ ์๋ํํ๋ Make์ ๊ธฐ๋ฅ์ด Incremental Build์ ๋๋ค. Make ๋ช ๋ น์ด ๊ณผ์ ์์์ ๋น๊ตํ๋ ๋์์ด ์๋ค๋ฉด ๋น๊ต ํ ์ด์ ๊ณผ ์ฐจ์ด๊ฐ ์๋ค๋ฉด ์ปดํ์ผํ์ง ์์ต๋๋ค. ์ด์ ๋ํ ์์ธํ ์๋๊ณผ์ ์ Make๋ฅผ ์์๋ณด๋ฉด์ ์์ํ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
Make์ ์คํํ๊ธฐ ์ํด์ ํ๋ก์ ํธ ํด๋ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ Makefile
์ด๋ผ๋ ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด ํ์ผ์ Make๊ฐ ์ด๋ป๊ฒ ์ด ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๊ฒ์ธ์ง ๋ช
์ํด๋์์ง ์ ์ ํ์ผ๋ก, ์ ํด์ง ํ์์ ๋ง๊ฒ ์์ฑํด์ผ ํฉ๋๋ค.
๐ก Node๋ฅผ ํด๋ณด์ ๋ถ์ด์๋ผ๋ฉด package.json์ ์๋ scripts ํํธ์ ๋น์ทํ๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
๊ฐ์ฅ ์์ ๋จ์์ธ "Rule"์ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
target ... : prerequisites ...
command
...
...
์ ํ๋ก์ ํธ ์์์ ์ฌ์ฉํ ๋ช ๋ น์ด๋ฅผ Makefile ํ์์ผ๋ก ์์ฑํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
a.out:
gcc file_a.c file_b.c file_c.c
์ด๋ ๊ฒ ์์ฑํ ์ดํ, make๋ฅผ ํตํด ์ ๋ฃฐ์ ์คํํ๋ ค๋ฉด, ์ปค๋ฉ๋๋ผ์ธ์ make (ํ๊ฒ)
์ ์คํํ๋ฉด ๋ฉ๋๋ค. ๋ค๋ง ์ด๋ ๊ฒ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ํ๋ฒ ์ปดํ์ผํ ์ดํ ํ์ผ์ ๋ณ๊ฒฝํ๊ณ ๋ค์ make a.out
๋ฅผ ์คํํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ค๋ฉด์ ์ปดํ์ผ์ด ์ผ์ด๋์ง ์์ต๋๋ค.
make: `a.out' is up to date.
Make์์ ๋ฃฐ์ด ์คํ๋๋ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ๊ฐ์ ๋ฃฐ์ ํ๋ฒ ์คํํ ๋ค์๋ 1๋ฒ๊ณผ 2๋ฒ ๋ชจ๋ ๋ง์กฑํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํ๋์ง ์๊ณ up to date
๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๊ฒ ๋๋ค๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๊ฒ์
๋๋ค.
a.out: file_a.c file_b.c file_c.c
gcc file_a.c file_b.c file_c.c
๋ค๋ง ์์ ๊ฐ์ด ์์ฑํ๋ค๋ฉด ์ค๋ณต๋๋ ๋ด์ฉ์ด ๋ณด์ด๊ธฐ ์์ํ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ๋จ์ํํ๊ธฐ ์ํด Make์์๋ ์ ์คํฌ๋ฆฝํธ์ ๊ฐ์ด ๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ์คํฌ๋ฆฝํธ์์๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ ๊ณต๋ฐฑ(' ')์ ๋ฃ์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง, Make์์๋ ๊ณต๋ฐฑ์ ์ฌ์ฉํด ์ฌ๋ฌ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ์์์ ๋ณ์๋ฅผ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
SRC = file_a.c file_b.c file_c.c
NAME = a.out
$(NAME): $(SRC)
gcc $(SRC)
๐ก
$()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์๋์ด ์๋ ๋ณ์๋ ํจ์๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
์ด์ ๋, ์ต์ข ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์ ๋ ํ์ผ๋ง ์ปดํ์ผ๋๊ฒ ํ๊ธฐ ์ํด์ ํ๊ฐ์ง์ ๋ฌธ๋ฒ์ ์ถ๊ฐํด๋ด ์๋ค. ๋ฐ๋ก ํจํด ๋ฃฐ์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค. ์ ์์๋ฅผ ํจํด ๋ฃฐ์ ์ฌ์ฉํด ๋ฐ๊ฟ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
OBJ = file_a.o file_b.o file_c.o
NAME = a.out
%.o : %.c
gcc $< -o $@
$(NAME): $(OBJ)
gcc $(OBJ)
๋ช๊ฐ์ง ์๋ก์ด ๋ด์ฉ์ด ๋์์๋๋ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ต๋๋ค. ํ์ ์ค๋ธ์ ํธ ํ์ผ์ ์๊ณ ์ฝ๋ ํ์ผ๋ง ์๋ค๊ณ ๊ฐ์ ํ์๋, Make๊ฐ ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
make a.out
์ ์คํํ๋ฉด, ๋จผ์ prerequisite๋ฅผ ํ์ธํฉ๋๋ค.file_a.o
๋ฅผ ํ์ธํ๋ ค ํ๋๋ฐ, ํ์ ํด๋์ file_a.o
๊ฐ ์์ต๋๋ค.file_a.o
๋ฅผ ํ๊ฒ์ผ๋ก ๊ฐ์ง ๋ฃฐ์ด ์๋์ง ํ์ธํ๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์คํํฉ๋๋ค.%.o
์ธ ๋ฃฐ์ ํ์ผ์ด .o
๋ก ๋๋ ๋ชจ๋ ํ์ผ์ ๋์ฌ์ผ๋ก ํ๋ ํจํด ๋ฃฐ์
๋๋ค. file_a.o
๋ ์ด ํจํด ๋ฃฐ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ด ๋ฃฐ์ ์คํํฉ๋๋ค. ์ด๋ ์ด ๋ฃฐ์ prerequisite์ %.c
๊ฐ ์ ํ์๋๋ฐ, ์ด๋ ์ค์ ์ฌ์ฉ๋ ๋ %.o
์์์ %๋ถ๋ถ์ ๊ฐ์ ธ์ ์ฑ์ฐ๊ฒ ๋ฉ๋๋ค. file_a.o
์์ file_a๊ฐ %์์ ๋์ฒด๋์๊ธฐ ๋๋ฌธ์ prerequisite๋ file_a.c
๊ฐ ๋ฉ๋๋ค.$<
์ $@
๋ Make์์ ์ ๊ณตํ๋ ์๋ ๋ณ์์
๋๋ค. $@
๋ ํ๊ฒ์ ์ ์ฅํ๋ ๋ณ์์ด๊ณ , $<
๋ ์ฒซ prerequisite๋ฅผ ์ ์ฅํ๋ ๋ณ์์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํจํด ๋ฃฐ์ ์๋ ์ปค๋ฉ๋๋ gcc file_a.c -o file_a.o
๋ก ๋์ฒด๋์ด ์คํ๋ฉ๋๋ค.$(OBJ)
์ ๋๋จธ์ง ๊ฐ์ธ file_b.c
์ file_c.c
๋ 2~5๋ฒ ๊ณผ์ ์ ๊ฑฐ์ณ๊ฐ๋ฉด์ ์ค๋ธ์ ํธ ํ์ผ์ ๋ง๋ค๊ณ , a.out
์ ์ปดํ์ผํ๊ฒ ๋ฉ๋๋ค.๐ก ํจํด ๋ฃฐ์์ ์ฌ์ฉ๋๋ %์ ๋ณด๋ฉด ํ์ ์์ผ๋์นด๋ ๋ฌธ์์ธ *๊ฐ ์ต์ํ ํ ๋ฐ, ์ด์ ๋ํด์ make์์๋ ์ง์ํ์ง๋ง ์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒจ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ๊น์ง๋ง ์๋ค๋ฉด ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ์ ๋๋ค. ๊ธ ์ ๋ชฉ์ฒ๋ผ ํ์์ ์ธ ๋ด์ฉ๋ค๋ง ์ธ๊ธํ๋๋ฐ ํน์๋ ์ถ๊ฐ์ ์ผ๋ก Make๋ฅผ ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๋ ํ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค!
make
๋ช
๋ น์ด๋ฅผ ์คํํ๋ค๋ฉด, Makefile์ ๋ฃฐ ์ค '.'์ผ๋ก ์์ํ๋ ํ๊ฒ์ ๊ฐ์ง ๋ฃฐ์ด๋ ํจํด ๋ฃฐ์ ์ ์ธํ ์ต์๋จ์ ์๋ ๋ฃฐ์ ์คํํฉ๋๋ค. ๋ฐ๋ผ์ ์ ํฌ๊ฐ ์ฌ์ฉํ ์์๋ make a.out
๋ฟ๋ง ์๋๋ผ make
๋ก๋ ๋ฃฐ์ ์คํํ ์ ์์ต๋๋ค.addprefix
, addprefix
, subst
๋ฑ์ด ์์ต๋๋ค. ์์ธํ ์ฌ์ฉ๋ฒ๊ณผ ๋ค์ํ ํจ์ ๋ชฉ๋ก์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.clean
์ด๋ ํ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ฃผ๋ก ํ๋จ๊ณผ ๊ฐ์ด ๊ตฌํ๋ฉ๋๋ค. clean:
rm -f $(OBJ)
clean
์ด๋ผ๋ ํ์ผ์ด ์กด์ฌํ๋ค๋ฉด, ์ ๋ฃฐ์ ์ ์ญํ์ ํ์ง ์์๊ฒ๋๋ค. ์ด๋ฐ์ ์ธ๊ธํ๋ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๋ง์กฑํ์ง ์๊ธฐ ๋๋ฌธ์ up to date
๋ผ๊ณ ๋จ๋ฉฐ ์ปค๋ฉ๋๊ฐ ๋์๊ฐ์ง ์์ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์์ ๊ฒฝ์ฐ์๋ .PHONY
๋ผ๋ ํ๊ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Phony ํ๊ฒ์ prerequisite๋ก ์ง์ ๋๋ฉด ์ด๋ฅผ ํ๊ฒ์ผ๋ก ๊ฐ์ง ๋ฃฐ์ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ง์กฑํ์ง ์์๋ ๋ฌด์กฐ๊ฑด ์คํํ๊ฒ ๋ฉ๋๋ค. ์ Makefile์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ฉด clean
ํ์ผ์ด ์์ด๋ ์๋๋ ๊ฒ์
๋๋ค. clean:
rm -f $(OBJ)
.PHONY: clean
๐ค ์ฌ๋ด์ผ๋ก ์ธ๋ค์ผ์ Makefile์ ์ ๊ฐ ์งํ์ค์ธ ft_printf ํ๋ก์ ํธ์ Makefile์ ๋๋ค :)
๋์๊ณผ์ ์ ๋ํด ์ด๋ ๊ฒ ์์ธํ ์ฝ๊ฒ ์ ๋ฆฌ ๋๊ฑธ๋ชป๋ดค๋๋ฐ ๋๋ถ์ ๊ถ๊ธํ ๋ถ๋ถ ์ ์ดํดํ๊ณ ๊ฐ์ ๊ฐ์ฌํฉ๋๋ค!