๐Ÿ›  Make ๊ณํ•ฅ๊ธฐ

cosยท2020๋…„ 8์›” 9์ผ
0
post-thumbnail

์ด ๊ธ€์—์„œ๋Š” make ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ C, C++ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โš ๏ธ ๊ธ€์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

๐Ÿค” ์™œ Make๊ฐ€ ํ•„์š”ํ•˜์ง€?

์ฒ˜์Œ 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์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„  ํ”„๋กœ์ ํŠธ ํด๋” ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— Makefile์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ Make๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•ด๋†“์€์ง€ ์ ์€ ํŒŒ์ผ๋กœ, ์ •ํ•ด์ง„ ํ˜•์‹์— ๋งž๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก Node๋ฅผ ํ•ด๋ณด์‹  ๋ถ„์ด์‹œ๋ผ๋ฉด package.json์— ์žˆ๋Š” scripts ํŒŒํŠธ์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Rule

๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ธ "Rule"์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

target ... : prerequisites ...
	command
	...
	...
  • ํƒ€๊ฒŸ์€ ์ด ๋ฃฐ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋‚˜์˜ค๋Š” ํŒŒ์ผ ์‚ฐ์ถœ๋ฌผ์„ ์ฃผ๋กœ ์ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฃฐ์˜ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์— ๊ด€๋ จ๋œ ์˜ˆ์‹œ๋„ ๋’ค์—์„œ ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ „์ œ ์กฐ๊ฑด(prerequisite)์€ ์ด ๋ฃฐ์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฃฐ์„ ์‹คํ–‰ํ• ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ ๋„ฃ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฃฐ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง€๊ฑฐ๋‚˜ Incremental Build๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์„ ์ฃผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น์–ด(command)์— ์ด ๋ฃฐ์„ ์‹คํ–‰ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ ์–ด๋†“์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์“ธ ๋•Œ์—” target & prerequisites์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ํƒญ์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ํ”„๋กœ์ ํŠธ ์˜ˆ์‹œ์— ์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด๋ฅผ 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. Prerequisites์— ๋ณ€๊ฒฝ์ ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ

์œ„์™€ ๊ฐ™์€ ๋ฃฐ์€ ํ•œ๋ฒˆ ์‹คํ–‰ํ•œ ๋’ค์—๋Š” 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๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. make a.out์„ ์‹คํ–‰ํ•˜๋ฉด, ๋จผ์ € prerequisite๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. file_a.o๋ฅผ ํ™•์ธํ•˜๋ ค ํ•˜๋Š”๋ฐ, ํ˜„์ œ ํด๋”์— file_a.o๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  3. ๋งŒ์•ฝ prerequisite์— ์ฐธ์กฐ๋˜๋Š” ํŒŒ์ผ์ด ํด๋”์— ์—†๋‹ค๋ฉด, Make๋Š” file_a.o๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ๊ฐ€์ง„ ๋ฃฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ํƒ€๊ฒŸ์ด %.o์ธ ๋ฃฐ์€ ํŒŒ์ผ์ด .o๋กœ ๋๋‚œ ๋ชจ๋“  ํŒŒ์ผ์„ ๋Œ€์‚ฌ์œผ๋กœ ํ•˜๋Š” ํŒจํ„ด ๋ฃฐ์ž…๋‹ˆ๋‹ค. file_a.o๋Š” ์ด ํŒจํ„ด ๋ฃฐ์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฃฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ด ๋ฃฐ์˜ prerequisite์— %.c๊ฐ€ ์ ํ˜€์žˆ๋Š”๋ฐ, ์ด๋Š” ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ %.o ์—์„œ์˜ %๋ถ€๋ถ„์„ ๊ฐ€์ ธ์™€ ์ฑ„์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. file_a.o์—์„œ file_a๊ฐ€ %์—์„œ ๋Œ€์ฒด๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— prerequisite๋Š” file_a.c๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  5. ์ปค๋ฉ˜๋“œ ์ค‘ $<์™€ $@๋Š” Make์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. $@๋Š” ํƒ€๊ฒŸ์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ด๊ณ , $<๋Š” ์ฒซ prerequisite๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํŒจํ„ด ๋ฃฐ์— ์žˆ๋Š” ์ปค๋ฉ˜๋“œ๋Š” gcc file_a.c -o file_a.o๋กœ ๋Œ€์ฒด๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  6. ์ดํ›„ $(OBJ)์˜ ๋‚˜๋จธ์ง€ ๊ฐ’์ธ file_b.c์™€ file_c.c๋„ 2~5๋ฒˆ ๊ณผ์ •์„ ๊ฑฐ์ณ๊ฐ€๋ฉด์„œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , a.out์„ ์ปดํŒŒ์ผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํŒจํ„ด ๋ฃฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” %์„ ๋ณด๋ฉด ํ‰์†Œ ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์ธ *๊ฐ€ ์ต์ˆ™ํ• ํƒ ๋ฐ, ์ด์— ๋Œ€ํ•ด์„œ make์—์„œ๋„ ์ง€์›ํ•˜์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์•ˆ๋‹ค๋ฉด ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€ ์ œ๋ชฉ์ฒ˜๋Ÿผ ํ•„์ˆ˜์ ์ธ ๋‚ด์šฉ๋“ค๋งŒ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ ํ˜น์‹œ๋‚˜ ์ถ”๊ฐ€์ ์œผ๋กœ Make๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ํŒ์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

  • Make๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํƒ€๊ฒŸ์„ ๋„ฃ์ง€ ์•Š๊ณ  make ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, Makefile์˜ ๋ฃฐ ์ค‘ '.'์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํƒ€๊ฒŸ์„ ๊ฐ€์ง„ ๋ฃฐ์ด๋‚˜ ํŒจํ„ด ๋ฃฐ์„ ์ œ์™ธํ•œ ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฃฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €ํฌ๊ฐ€ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ๋Š” make a.out ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ make๋กœ๋„ ๋ฃฐ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Makefile์—์„œ๋„ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋กœ๋Š” 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์ž…๋‹ˆ๋‹ค :)

๐Ÿ“š ์ฐธ๊ณ ๋ฌธ์„œ

profile
์žก๋‹คํ•œ๊ฑฐ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€