makefile - KimTaebin-ai/study_posts GitHub Wiki

makefile

makefile ์ด๋ž€ ๋นŒ๋“œ๋ฅผ ๋„์™€์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋‹ค.

linux ํ™˜๊ฒฝ์— ์žˆ๋Š” ์†Œ์Šค์ฝ”๋“œ ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ make ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Makefile์— ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ ์ˆœ์„œ๋Œ€๋กœ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

(makefile์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ gcc ๋นŒ๋“œ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.) gcc ๋นŒ๋“œ

a.exe / a.out ์€ ์†Œ์ŠคํŒŒ์ผ์„ ๊ฐ๊ฐ ์ปดํŒŒ์ผํ•˜์—ฌ .o ๋ผ๋Š” ๋ชฉ์  ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋งŒ๋“ค์–ด์ง„ ๋ชฉ์  ํŒŒ์ผ๋“ค์„ ํ•œ ๊ณณ์œผ๋กœ ๋ฌถ๋Š” ๋งํ‚น ๊ณผ์ •์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

gcc -c -o main.o main.c ์œ„ ๋ช…๋ น์–ด๋Š” gcc์— -cํ”Œ๋ž˜๊ทธ๋ฅผ ๋ถ™์—ฌ์„œ ์ปดํŒŒ์ผ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, main.o ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ-c ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๋ชฉ์ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด main๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ .o๊ฐ€ ์ƒ๊ธฐ์ง€๋งŒ ์ด๋ฆ„์„ ๊ผญ ์ง€์ •ํ•ด์ฃผ์ž

gcc -o a.out main.o

๋ช…๋ น์€ gcc์ง€๋งŒ gcc๋‚ด๋ถ€์ ์œผ๋กœ ๋ง์ปค๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค (-o ํ”Œ๋ž˜๊ทธ๋Š” ์ด๋ฆ„ ๋ณ€๊ฒฝ)

Incremental build

Incremental build์€ makefile์€ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์˜์กด์„ฑ์ด ์žˆ๋Š” ๋Œ€์ƒ๋“ค๋งŒ์„ ์ถ”๋ ค์„œ ๋‹ค์‹œ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ์น˜๊ฐ€ ํฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค!!

Rule block ์˜ ๊ตฌ์กฐ

<Target> : <Dependencies>

  <Recipe>
  • target: ๋นŒ๋“œ ๋Œ€์ƒ ์ด๋ฆ„์„ ์˜๋ฏธํ•œ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ ์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑํ•ด๋‚ด๋Š” ํŒŒ์ผ๋ช…์„ ์“ด๋‹ค๊ณ  ํ•œ๋‹ค.
  • dependencies: target์ด ์˜์กดํ•˜๋Š” target์ด๋‚˜ ํŒŒ์ผ๋ชฉ๋ก target์„ ๋งŒ๋“ค๊ธฐ์ „ ๋จผ์ € ๋งŒ๋“ค๊ณ  ๋นŒ๋“œ ๋Œ€์ƒ(target)์„ ์ƒ์„ฑ
  • recipe: ๋นŒ๋“œ ๋Œ€์ƒ์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น. ์—ฌ๋Ÿฌ์ค„๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ tap์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผํ•œ๋‹ค.
  • ๋‚ด์žฅ ๊ทœ์น™

Makefile์—์„œ๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋นŒ๋“œ ๊ทœ์น™๋“ค์€ ๊ตณ์ด ๊ธฐ์ˆ ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค..! (์†Œ์ŠคํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ชฉ์ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ทœ์น™)

ํ•˜์ง€๋งŒ target์— ๋Œ€ํ•œ ํ—ค๋”ํŒŒ์ผ์„ ์ถ”์ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— dependencies๊นŒ์ง€๋Š” ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค.(ํ—ค๋”ํŒŒ์ผ์„)

์œ„์—์„œ ๋‹ค๋ฃฌ main.cํŒŒ์ผ์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š” fun.c์— ํ—ค๋”ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฃฐ๋ธ”๋Ÿญ์„ ์ž‘์„ฑํ•œ๋‹ค.

a.out: main.o fun.o
  gcc -o a.out main.o fun.o

main.o: fun.h main.c
  fun.o: fun.h fun.c
  • ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋ฒ•

์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋ช…์€ make -p๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

CC=gcc
CFLAG= -Wall -Werror -Wextra
OBJS= main.o fun.o
TARGET= a.out

$(TARGET): $(OBJS)
  $(CC) -o $@ $(OBJS)

main.o: fun.h main.c
fun.o: fun.h fun.c
  • $@์€ ํ˜„์žฌ target์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋™๋ณ€์ˆ˜
  • $^์€ ํ˜„์žฌ target์ด ์˜์กด(Dependencies)ํ•˜๋Š” ๋Œ€์ƒ๋“ค์˜ ์ „์ฒด ๋ชฉ๋ก
  • $<์€ ์ฒซ ๋ฒˆ์งธ depend์˜ ํŒŒ์ผ ์ด๋ฆ„
  • $?์€ ํ˜„์žฌ target์ด ์˜์กดํ•˜๋Š” ๋Œ€์ƒ๋“ค์ค‘ ๋ณ€๊ฒฝ๋œ ๋ชฉ๋ก

์œ„์˜ Makefile์„ ํ•ด์„ํ•ด๋ณด๋ฉด a.out์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์˜์กด์„ฑ ํŒŒ์ผ๋“ค์€ main.o, fun.o๊ฐ€ ์กด์žฌํ•˜๊ณ  a.out์— ๋Œ€ํ•œ ๋ ˆ์‹œํ”ผ๋Š” ๋ฐ‘์— ๋‚˜์™€ ์žˆ์ง€๋งŒ ๋จผ์ € ์˜์กด์„ฑํŒŒ์ผ๋“ค์„ ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค.์˜์กด์„ฑ ์ƒ์„ฑํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฃฐ๋ธ”๋Ÿญ๋˜ํ•œ ์•„๋ž˜์— ๋‚˜์™€ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ ˆ์‹œํ”ผ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” makefile์˜ ๋‚ด๋ถ€ ๊ทœ์ฐฉ์•  ์˜ํ•ด ์ž๋™ ๋นŒ๋“œ๋œ๋‹ค.๋‹ค์‹œ ๋Œ์•„๊ฐ€์„œ $(TARGET)(a.out)์˜ recipe๋Š” $(CC) gcc์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ -o(์ด๋ฆ„ ๋ณ€๊ฒฝ)์œผ๋กœ target์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•„์š”ํ•œ ์˜ค๋ธŒ์ ํŠธ ๋ชฉ๋ก์€ OBJS๋กœ ์ฐธ์กฐํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๊ฐ€ a.out์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋งจ ์œ„ ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€์—์„œ ์ด๋ฆ„๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์•„๋ž˜์˜ $(TARGET)์˜ ์ด๋ฆ„๋“ค์€ ์ž๋™๋ณ€๊ฒฝ๋˜๊ฒŒ ๋œ๋‹ค.

  • ์™ธ๋ถ€ ํ—ค๋”ํŒŒ์ผ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฒ•

์™ธ๋ถ€ ํ—ค๋”ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ฌ๋ ค๋ฉด gcc ๋’ค์— -Iํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ถ™์–ด์•ผ ํ•œ๋‹ค.(ํ‘œ์ค€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํ—ค๋”ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ๋””๋ ‰ํ† ๋ฆฌ ์œ„์น˜ ์ง€์ •)

gcc main.c -I ./include

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

ar r libft.a *.o

ํ˜„์žฌ ๋ฃจํŠธ์— ์กด์žฌํ•˜๋Š” .o ๋ชฉ์  ํŒŒ์ผ๋“ค๋กœ libft.a๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

ar s libft.a

ํ•จ์ˆ˜์˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

++ ar t๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋งˆ๋‹ค ์ฃผ์˜ ํ‘œ์‹œ๊ฐ€ ๋œจ๊ธฐ ๋•Œ๋ฌธ์— cํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ar ๋ช…๋ น์–ด

libft ํ”„๋กœ์ ํŠธ์—์„œ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์ด ํ•˜๋‚˜์˜ ์•„์นด์ด๋ธŒ๋กœ ๋ฌถ์—ฌ ์žˆ๋Š” ํ˜•ํƒœ๋กœ, ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์„ ๋ฌถ์–ด ์ฃผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ๋ฐ”๋กœ ar ๋ช…๋ น์–ด์ด๋‹ค.๊ธฐ๋ณธ์ ์œผ๋กœ ์•„์นด์ด๋ธŒ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์˜ ์‚ฌ์šฉ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ar rscv libft.a file1.o file2.o ...

์‚ฌ์‹ค ar ๋ช…๋ น์–ด๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ , ๋ฒ”์šฉ์ ์ธ ๋น„์••์ถ• ์•„์นด์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค!

2. ar ๋ช…๋ น์–ด์˜ ์˜ต์…˜

2.1. ์•„์นด์ด๋ธŒ๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ

ar rcus [๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„] [์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค]

r : ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์ด๋ฉด ์ถ”๊ฐ€, ๊ธฐ์กด ํŒŒ์ผ์ด๋ฉด ์น˜ํ™˜

c : ์•„์นด์ด๋ธŒ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ) ์ƒ์„ฑ, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์•„์นด์ด๋ธŒ๋ฅผ ์ž‘์„ฑ(๋˜๋Š” ๊ฐฑ์‹ )ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ

u : ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋น„๊ตํ•ด ์ƒˆ๋กœ์šด ํŒŒ์ผ์ผ ๊ฒฝ์šฐ์—๋งŒ ์น˜ํ™˜

s : ranlib(1)๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•„์นด์ด๋ธŒ ์ธ๋ฑ์Šค ์ƒ์„ฑ. ์•„์นด์ด๋ธŒ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋งํฌ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ณ , ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Œ

2.2. ๊ธฐ์กด ์•„์นด์ด๋ธŒ ํŒŒ์ผ์—์„œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์ œ๊ฑฐ

ar ds [๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„] [์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค]

d : ์•„์นด์ด๋ธŒ ๋ชจ๋“ˆ์„ ์‚ญ์ œ, ์‚ญ์ œํ•  ํŒŒ์ผ์ด ์—†๋‹ค๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

2.3. ์•„์นด์ด๋ธŒ์˜ ๋‚ด์šฉ ์กฐํšŒ

ar tv [๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„]

t : ์•„์นด์ด๋ธŒ์— ์žˆ๋Š” ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅv : ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” verbose ๋ชจ๋“œ๋กœ, ์ด ์˜ต์…˜์„ ์ด์šฉํ•˜๋ฉด ํŒŒ์ผ ํฌ๊ธฐ๋‚˜ ๊ฐฑ์‹  ์‹œ๊ฐ ๋“ฑ์˜ ์ƒ์„ธ ์ •๋ณด๋„ ์ถœ๋ ฅ

2.4. ์•„์นด์ด๋ธŒ์—์„œ ํŒŒ์ผ ์ถ”์ถœ

ar xv [๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„]

x : ์•„์นด์ด๋ธŒ์—์„œ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์ถ”์ถœv : ์ถ”์ถœํ•œ ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช… ์ถœ๋ ฅ

  • clean

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฃฐ ๋ธ”๋Ÿญ์˜ ๋ชจ์Šต์ด๋ฉฐ make๋’ค์— ํ”Œ๋ž˜๊ทธ์ฒ˜๋Ÿผ ๋ถ™์—ฌ ๋งคํฌ๋กœ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

target๊ณผ ๋ชฉ์ ํŒŒ์ผ๋“ค์„ ์ „๋ถ€ ์‚ญ์ œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. Dependencies๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ recipe๋งŒ ์กด์žฌ

clean: rm -rf $(OBJS) $(TARGET)

  • all

all: libft.a

all์€ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฌด์—‡์ด ์ตœ์ข… target์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.

make all์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ libft.a๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘..

  • .PHONY

์‹ค์ œ ํƒ€์ผ“์˜ ์ด๋ฆ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฐ€์งœ ํƒ€์ผ“์„ ๊ฐ€๋ฅดํ‚จ๋‹ค..!

์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

clean: rm main.o main.c

์œ„ ๋งคํฌ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด rm๋ช…๋ น์€ clean์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€์•Š๊ธฐ ๋•Œ๋ฌธ์— clean์ด๋ž€ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. rm๋ช…๋ น์€ make clean ์ˆ˜ํ–‰ํ• ๋•Œ ๋งˆ๋‹ค ๋งค๋ฒˆ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋””๋ ‰ํ† ๋ฆฌ์— clean์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด clean์€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๊ณ  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  .PHONY๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ œ์กฐ๊ฑด์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ!

TARGET= libft.a
CC= gcc
CFLAG= -Wall -Werror -Wextra
SRCS= main.c fun.c
OBJS= $(SRCS:.c=.o)

.c.o: $(SRCS)
  $(CC) $(CFLAGS) -c $<

all: $(TARGET)

$(TARGET): $(OBJS)
  ar rcs $(TARGET) $(OBJS)

clean:
  rm -f $(OBJS)

fclean: clean
  rm -f $(TARGET)

re: fclean all

.PHONY all clean fclean re

Makefile์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • ๋ชฉ์ ํŒŒ์ผ(target): ๋ช…๋ น์–ด ์ˆ˜ํ–‰ ํ›„ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ํŒŒ์ผ
  • ์˜์กด์„ฑ(dependency): ๋ชฉ์  ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์žฌ๋ฃŒ ํŒŒ์ผ
  • ๋ช…๋ น์–ด(command): ์‹คํ–‰ ๋˜์–ด์•ผ ํ•  ๋ช…๋ น์–ด๋“ค
  • ๋งคํฌ๋กœ(macro): ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™” ์‹œํ‚ด
CC = gcc
target1 : dependency1 dependency2
  command1
  command2
  
target2 : dependency3 dependency4
  command3
  command4

Makefile Relink

Relink๋ž€ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋งŒ ํƒ€๊ฒŸ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

bonus: $(OBJ_B)
    $(AR) $(TARGET) $^

ํ•ด๋‹น ๋ช…๋ น์–ด๋Š” OBJ_B๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด TARGET์„ ์ƒ์„ฑํ•œ๋‹ค. OBJ_B๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‚˜๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— make bonus ๋ฅผ ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ๋ฆฌ๋งํฌ๋˜๊ฒŒ ๋œ๋‹ค.

ifdef WITH_BONUS
    OBJ = $(OBJ_O) $(OBJ_B)
else
    OBJ = $(OBJ_O)
endif
...
bonus:
    make WITH_BONUS=1 all

์œ„ ๋ช…๋ น์–ด๋Š” make bonus๋ฅผ ํ•˜๋ฉด WITH_BONUS๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ 1๋กœ ์ง€์ •ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. WITH_BONUS๋ผ๋Š” ์ƒ์ˆ˜๊ฐ€ 1์ผ๋•Œ๋Š” OBJ๋ฅผ OBJ_O์™€ OBJ_B ๋ชจ๋‘์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋งํฌ๊ฐ€ ๋ฐฉ์ง€๋œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

https://www.joinc.co.kr/w/Site/C/Documents/minzkn_make

https://kcoder.tistory.com/m/entry/Linux-Makefile%EC%97%90%EC%84%9C%EC%9D%98-%ED%95%A8%EC%88%98%EB%93%A4

https://modoocode.com/311

โš ๏ธ **GitHub.com Fallback** โš ๏ธ