[C] Makefile (Makefile์ด๋ž€? | Makefile์ด ํ•„์š”ํ•œ ์ด์œ  | ๊ตฌ์„ฑ์š”์†Œ | ์ž‘์„ฑ ๋ฐฉ๋ฒ• | ์‹คํ–‰๋ฐฉ๋ฒ•)

    ๋ฐ˜์‘ํ˜•

    ๐Ÿ“Œ Make, Makefile์ด๋ž€? / Makefile์ด ํ•„์š”ํ•œ ์ด์œ 

    make๋Š” ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ, ์ˆ˜์ •๋œ ์†Œ์ŠคํŒŒ์ผ์˜ recompile์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

    make ๋ช…๋ น์–ด๋Š” Makefile(๊ธฐ์ˆ  ํŒŒ์ผ)์˜ ์ฝ”๋“œ ๋‚ด์šฉ์— ๋”ฐ๋ผ make๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ SHELL ๋ช…๋ น์–ด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ๋ช…๋ นํ•˜์—ฌ ์†Œ์ŠคํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๊ทธ๋Ÿผ Makefile์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

    1. ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ์ปดํŒŒ์ผ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

    2. ์ˆ˜์ •๋œ ์†Œ์ŠคํŒŒ์ผ๋งŒ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋งค์šฐ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ์ด์  ๋•๋ถ„์— ์†Œ์ŠคํŒŒ์ผ์ด ๋งค์šฐ ๋งŽ์€ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, Makefile์€ ๊ฑฐ์˜ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

     

    ๋น„๊ต๋ฅผ ์œ„ํ•ด, Makefile์—†์ด ์ปดํŒŒ์ผ๊ณผ ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋‚˜์—ดํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    ์†Œ์Šค ํŒŒ์ผ์„ ์‹คํ–‰ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •(๋นŒ๋“œ)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ์ผ๋ฐ˜์ ์œผ๋กœ gcc compiler๋กœ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ์šฐ์„ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค์šฐ ๋งŽ์€ ์†Œ์Šค ํŒŒ์ผ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    gcc ์ปดํŒŒ์ผ๋Ÿฌ๋กœ -c ์˜ต์…˜์œผ๋กœ ์ปดํŒŒ์ผ๋งŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ์ปดํŒŒ์ผ ํ›„, ๊ฐ ์†Œ์ŠคํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชฉ์ ํŒŒ์ผ(.o / object file)์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๋‹ค์Œ์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชฉ์ ํŒŒ์ผ๋“ค์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๊ณผ ๋งํฌ(link)ํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -o ์˜ต์…˜ ๋’ค์— ft_a.out์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์‹คํ–‰ํŒŒ์ผ์„ ๋ช…์‹œํ•ด์ฃผ๊ณ  ๊ทธ ๋’ค์— ๋งํ‚นํ•  ๋ชฉ์  ํŒŒ์ผ๋“ค์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

     

    ์ด๋ ‡๊ฒŒ ft_a.out ์‹คํ–‰ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

    ์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ ์–ด๋–ค ํ•˜๋‚˜์˜ ์†Œ์ŠคํŒŒ์ผ๋งŒ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ปดํŒŒ์ผ ๊ณผ์ •์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์‹คํ–‰ ํŒŒ์ผ์„ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ฒ ์ฃ ?๐Ÿคฎํ•˜์ง€๋งŒ Makefile์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ชจ๋‘ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

    ๊ทธ๋Ÿผ, ๋ณธ๊ฒฉ์ ์œผ๋กœ Makefile์„ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ๐Ÿ“Œ Makefile ๊ตฌ์„ฑ์š”์†Œ

    • target: ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ณ€์ˆ˜๋ช…
    • prerequisites: target์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ „์ œ ์กฐ๊ฑด (target์„ ๋งŒ๋“ค ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ)
    • recipe: ์‹คํ–‰๋˜์–ด์•ผํ•  ๋ช…๋ น์–ด

    Makefile ์ž‘์„ฑ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    target … : prerequisites …
            recipe
            …
            …

     

     

    ๐Ÿ“Œ Makefile ๋งŒ๋“ค๊ธฐ

    ์†Œ์ŠคํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.a)๋ฅผ ๋งŒ๋“œ๋Š” Makefile์„ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    1. ๋งคํฌ๋กœ ๋งŒ๋“ค๊ธฐ

    ๋ณดํ†ต Makefile์—์„œ๋„ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ทธ ์˜ต์…˜๋“ค์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋งคํฌ๋กœ๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ปดํŒŒ์ผ ํ”Œ๋ž˜๊ทธ(์˜ต์…˜), ์•„์นด์ด๋ธŒ ๋ช…๋ น์–ด(ar)๊ณผ ํ”Œ๋ž˜๊ทธ, ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค ์•„์นด์ด๋ธŒ ํŒŒ์ผ ์ด๋ฆ„, ํ—ค๋” ํŒŒ์ผ, ์†Œ์ŠคํŒŒ์ผ, ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์„ ๋งคํฌ๋กœ๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

    CC = cc
    CFLAGS = -Wall -Wextra -Werror
    AR = AR
    ARFLAGS = crs
    NAME = libftprintf.a
    INCLUDES = ./ft_printf.h
    SRCS = \
    ./ft_atoi.c \
    ./ft_isdigit.c \
    ./ft_itoa.c \
    ./ft_printf.c \
    ./ft_putchar.c \
    ./ft_putnbr_base.c \
    ./ft_putstr.c \
    ./ft_strdup.c \
    ./ft_strlen.c
    OBJS = $(SRCS:.c=.o)

     

    2. rule ์ž‘์„ฑํ•˜๊ธฐ

    ์œ„์—์„œ ์ง€์ •ํ•œ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” $(๋งคํฌ๋กœ ์ด๋ฆ„)์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

     

    2-1. make all

    all : $(NAME)
    
    $(NAME) : $(OBJS)
    		${AR} ${ARFLAGS} $(NAME) $(OBJS)

    ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด all์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” $(NAME) ์ฆ‰, libftprintf.a๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. recipe์ด ๋”ฐ๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์— make all์„ ํ•˜๋ผ๋Š” ๊ฒƒ์€ make libft.a๋ฅผ ํ•˜๋ผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๋‹ค์Œ ๋ฃฐ์„ ๋ณด๋ฉด libftprintf.a๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” $(OBJS)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋งคํฌ๋กœ์—์„œ OBJS๋ฅผ $(SRCS:.c=.o)๋กœ ์ง€์ •ํ–ˆ๋Š”๋ฐ SRCS์˜ .cํŒŒ์ผ์„ ๋ชจ๋‘ .o๋กœ ๋งŒ๋“ค๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

    terminal์— make all ๋ช…๋ น์–ด๋ฅผ ์ณ๋ณด๋ฉด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(.o)๋“ค์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์•„์นด์ด๋ธŒ ํŒŒ์ผ(.a)๊นŒ์ง€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    2-2. make clean

    clean :
    	rm -f $(OBJS)

    clean์€ ์ „์ œ์กฐ๊ฑด์ด ์—†๊ณ  recipe๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.  recipe๋ฅผ ๋ณด๋ฉด ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์„ ์‚ญ์ œํ•˜๋ผ๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์ณ๋ณด๋ฉด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋งŒ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    2-3. make fclean

    fclean : clean
    	rm -f $(NAME)

    fclean์—๋Š” prerequisites๊ฐ€ clean์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์žˆ๊ณ , recipe์—๋Š” libftprintf.a๋ฅผ ์‚ญ์ œํ•˜๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, clean ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„, ์•„์นด์ด๋ธŒ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ˆ, ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๊ณผ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์ด ๋ชจ๋‘ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

     

    2-4. make re

    re : fclean all

    re์—๋Š” recipe๊ฐ€ ์—†๊ณ  prerequisites๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, make re๋ฅผ ํ•˜๋ฉด make fclean ํ›„, make all์ด ์‹คํ–‰๋˜๊ฒ ์ฃ ! ๋‹ค์‹œ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

     

    +) ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฌธ๋ฒ•

    • $@ : ๋ชฉํ‘œ ์ด๋ฆ„
    • $* : ๋ชฉํ‘œ ์ด๋ฆ„์—์„œ ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ์ด๋ฆ„
    • $< : ์ฒซ ๋ฒˆ์งธ ์ „์ œ ์กฐ๊ฑด์˜ ํŒŒ์ผ ์ด๋ฆ„
    • $? : ๋ชฉํ‘œ ํŒŒ์ผ ๋ณด๋‹ค ๋” ์ตœ๊ทผ์— ๊ฐฑ์‹ ๋œ ํŒŒ์ผ ์ด๋ฆ„
    • $^: ํ˜„์žฌ Target์ด ์˜์กดํ•˜๋Š” ๋Œ€์ƒ๋“ค์˜ ์ „์ฒด ๋ชฉ๋ก
    • $?: ํ˜„์žฌ Target์ด ์˜์กดํ•˜๋Š” ๋Œ€์ƒ๋“ค ์ค‘ ๋ณ€๊ฒฝ๋œ ๊ฒƒ๋“ค์˜ ๋ชฉ๋ก
    • $% : ๋Œ€์ƒ์˜ ์ด๋ฆ„ (ํ•ด๋‹น ๊ทœ์น™ ๋Œ€์ƒ์ด ์•„์นด์ด๋ธŒ ์ธ ๊ฒฝ์šฐ)

    (์ฐธ๊ณ : https://velog.io/@hidaehyunlee/Makefile-์ž์ฃผ-์‚ฌ์šฉํ•˜๋Š”-๋ฌธ๋ฒ•-์ •๋ฆฌ)

     

    3. Phony Target ์ง€์ •ํ•˜๊ธฐ

    .PHONY๋Š” built-in target์œผ๋กœ .PHONY์˜ prerequisites๋Š” phony target์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. phony๋Š” ๊ฐ€์งœ๋ผ๋Š” ์˜๋ฏธ๋กœ, ์‹ค์ œ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ถฉ๋Œํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .PHONY์˜ prerequisites๋Š” make๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์“ฐ์˜€์„ ๋•Œ๋Š” ๊ทธ recipe์ด ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

    .PHONY: all clean fclean re

    ์œ„์˜ ์˜ˆ์‹œ์—์„œ .PHONY์˜ prerequisites๋กœ ์ž‘์„ฑ๋œ all, clean, fclean, re๋Š” ์ด๋ฏธ ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ™์€ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์กด์žฌํ•ด๋„ ๊ทธ๊ฒƒ๊ณผ ์ƒ๊ด€์—†์ด makefile์˜ recipe์ด ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

     

    phony target์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” 2๊ฐ€์ง€๋กœ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ๊ฐ™์€ ์ด๋ฆ„์˜ ํŒŒ์ผ๊ณผ์˜ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ

    clean:
            rm *.o temp

    1๋ฒˆ์€ ์œ„์—์„œ ์ด์•ผ๊ธฐํ•œ ๋‚ด์šฉ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด clean์ด๋ผ๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ make clean์€ ํ•ญ์ƒ ๊ทธ recipe๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด subdirectory(foo, bar, baz)์— ๊ฐ๊ฐ make command๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    /main
         |_ Makefile
         |_ /foo
                |_ Makefile
                |_ ... // other files
         |_ /bar
                |_ Makefile
                |_ ... // other files
         |_ /baz
                |_ Makefile
                |_ ... // other files
    SUBDIRS = foo bar baz
    
    subdirs:
            for dir in $(SUBDIRS); do \
              $(MAKE) -C $$dir; \
            done

    ์œ„์˜ rule์ฒ˜๋Ÿผ loop๋ฅผ ์ด์šฉํ•ด์„œ ํ•˜๋‚˜์˜ rule์„ ์ž‘์„ฑํ•ด์„œ ๊ฐ๊ฐ์˜ directory์— make ๋ช…๋ น์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” 2๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ์–ด๋–ค ํ•˜๋‚˜์˜ subdirectory์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฌด์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ๋Š” make์˜ ์ด์ ์ธ ๋ณ‘๋ ฌ์  ์ˆ˜ํ–‰(parallel execution)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. make๋Š” -j ๋˜๋Š” --j ์˜ต์…˜์„ ์ ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ rule์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” rule ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์ด๋‹ˆ ๋‹น์—ฐํžˆ -j ์˜ต์…˜์„ ์ ์šฉํ•˜์—ฌ๋„ ๋ณ‘๋ ฌ์  ์ˆ˜ํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒ ์ฃ !

     

    ์ด๋•Œ subdirectory๋“ค์„ phony target์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

    SUBDIRS = foo bar baz
    
    .PHONY: subdirs $(SUBDIRS)
    
    subdirs: $(SUBDIRS)
    
    $(SUBDIRS):
            $(MAKE) -C $@
    
    foo: baz

    foo: baz rule์„ ์ž‘์„ฑํ•จ์œผ๋กœ์จ baz๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ foo๊ฐ€ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…์† ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด parallel execution์„ ์ ์šฉ์‹œํ‚ค๋Š”๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

     

    ์—ฌ๊ธฐ๊นŒ์ง€ Makefile์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ํŒŒ์ผ์ด ๋งค์šฐ ๋งŽ์€ ๊ฒฝ์šฐ๋‚˜ ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ํ•„์ˆ˜์ ์œผ๋กœ ์“ฐ์ด๋Š” ํŒŒ์ผ์ด๊ณ , ๋งค์šฐ ํšจ์œจ์ ์ธ ์ปดํŒŒ์ผ์„ ๋„์™€์ฃผ๋‹ˆ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€