๐Ÿƒ‍โ™€๏ธ Activities/42 Cursus

[Makefile] Makefile ๊ตฌ์กฐ์™€ rule

0=2. 2025. 5. 29. 05:45

๐Ÿ“Œ Makefile ๊ตฌ์กฐ

target: dependencies
    commands
  • target: ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ ์ด๋ฆ„ (๋ณดํ†ต ์‹คํ–‰ ํŒŒ์ผ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„)
  • dependencies: ํ•ด๋‹น ํƒ€๊ฒŸ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค (์†Œ์Šค ํŒŒ์ผ, ํ—ค๋” ํŒŒ์ผ ๋“ฑ)
  • commands: dependencies๋ฅผ ์ด์šฉํ•ด target์„ ๋งŒ๋“œ๋Š” ๋ช…๋ น์–ด
    ๋ช…๋ น์–ด๋Š” ๋ฐ˜๋“œ์‹œ ํƒญ(tab)์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด Makefile: missing separator ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๐Ÿ“Œ ar

ar(archiver)์€ ์—ฌ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(.o)์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.a) ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

  • .aํŒŒ์ผ์€ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‹คํ–‰ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์— ์ง์ ‘ ํฌํ•จ๋œ๋‹ค.
  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งํ‚น ์‹œ์ ์— ์‹คํ–‰ ํŒŒ์ผ์— ๋ณ‘ํ•ฉ๋˜์–ด์„œ, ๋ฐฐํฌ ์‹œ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.so)๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•˜๋‹ค.

 

-rcs ์˜ต์…˜

  • r (replace): ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ๋ฎ์–ด์“ฐ๊ธฐ. ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ถ”๊ฐ€.
  • c (create): ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ. ๋งŒ์•ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์žˆ์–ด๋„ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • s (index): ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” ์ƒ์„ฑ. ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด์•ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ์‹ฌ๋ณผ(symbol)์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
# file1.o, file2.o, file3.o ํŒŒ์ผ์„ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ libmylib.a๋กœ ๋ฌถ๊ธฐ
ar rcs libmylib.a file1.o file2.o file3.o

libmylib.a๋ผ๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , ๋งํ‚นํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

# main.c๋ฅผ libmylib.a์™€ ํ•จ๊ป˜ ์ปดํŒŒ์ผ
gcc main.c -L. -lmylib -o myprogram

lmylib๋Š” libmylib.a๋ฅผ ๋งํฌํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

ar ์ธ๋ฑ์Šค ํ™•์ธ ar -t

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์— ์–ด๋–ค ํŒŒ์ผ๋“ค์ด ๋“ค์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

ar -t libmylib.a

 

์ถœ๋ ฅ ์˜ˆ์‹œ

file1.o
file2.o
file3.o

 

๐Ÿ“Œ Makefile rules

1. all

all์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ํƒ€๊ฒŸ์ด๋‹ค.
๋ณดํ†ต make ๋ช…๋ น๋งŒ ์ž…๋ ฅํ•˜๋ฉด all์ด ์‹คํ–‰๋œ๋‹ค. (make = make all)

 

์—ญํ• 
ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.a ๋“ฑ)๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์ƒ์„ฑํ•œ๋‹ค.

 

์˜ˆ์‹œ

all: $(NAME)

$(NAME)์€ .a ๊ฐ™์€ ์ตœ์ข… ์ƒ์„ฑ๋ฌผ์„ ์˜๋ฏธํ•œ๋‹ค.
all์ด ์‹คํ–‰๋˜๋ฉด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

2. clean

clean์€ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ƒ๊ธด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(.o)์„ ์‚ญ์ œํ•˜๋Š” ๊ทœ์น™์ด๋‹ค.
์†Œ์Šค ํŒŒ์ผ๊ณผ ์ตœ์ข… ์ƒ์„ฑ๋ฌผ์€ ๋‚จ๊ฒจ๋‘”๋‹ค.

 

์—ญํ• 
์ค‘๊ฐ„ ์‚ฐ์ถœ๋ฌผ์ธ .o ํŒŒ์ผ๋“ค์„ ์‚ญ์ œํ•œ๋‹ค.

 

์˜ˆ์‹œ

clean:
    rm -f $(OBJ)

rm -f $(OBJ)๋Š” ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(.o)์„ ์‚ญ์ œํ•œ๋‹ค.
$(OBJ)๋Š” $(SRC:.c=.o)๋กœ .c๋ฅผ .o๋กœ ๋ฐ”๊พผ ๋ชฉ๋ก์ด๋‹ค.

 

3. fclean (full clean)

fclean์€ clean์ด ํ•˜๋Š” ์ผ์„ ํฌํ•จํ•˜๋ฉด์„œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.a)๋‚˜ ์‹คํ–‰ ํŒŒ์ผ๋„ ์‚ญ์ œํ•œ๋‹ค.
๋ชจ๋“  ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์—ญํ• 
์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ + ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ(.a)์„ ๋ชจ๋‘ ์‚ญ์ œํ•œ๋‹ค.

 

์˜ˆ์‹œ

fclean: clean
    rm -f $(NAME)

 

4. re (rebuild)

re๋Š” fclean ํ›„ all์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ๊ทœ์น™์ด๋‹ค.
๋ชจ๋“  ํŒŒ์ผ์„ ์ง€์šฐ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์—ญํ• 
์™„์ „ํžˆ ๋นŒ๋“œ ๊ณผ์ • ๋ฆฌ์…‹ ํ›„ ์žฌ์ปดํŒŒ์ผํ•œ๋‹ค.

 

์˜ˆ์‹œ

re: fclean all

make re๋ฅผ ์‹คํ–‰ํ•˜๋ฉด fclean์œผ๋กœ ๋ชจ๋“  ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ , all์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ๋นŒ๋“œํ•œ๋‹ค.

 

Rule ์„ค๋ช… ์‚ญ์ œ ๋Œ€์ƒ ์ตœ์ข… ์ƒ์„ฑ
all ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์—†์Œ O
clean ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์‚ญ์ œ .o ํŒŒ์ผ X
fclean ๋ชจ๋“  ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ์‚ญ์ œ .o + ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ X
re ๋ชจ๋“  ํŒŒ์ผ ์‚ญ์ œ ํ›„ ์žฌ์ปดํŒŒ์ผ .o, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ O