Make ๋ฐ Makefile

2 minute read

Make ๋ฐ Makefile

Make ๋ž€?

  • ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ฆฌ๋ˆ…์Šค ์šด์˜ ์ฒด์ œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋นŒ๋“œ ๋„๊ตฌ
  • ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค๋ผ๋ฆฌ์˜ ์˜์กด์„ฑ๊ณผ ๊ฐ ํŒŒ์ผ์— ํ•„์š”ํ•œ ๋ช…๋ น์„ ์ •์˜ํ•จ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ตœ์ข… ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ณผ์ •์„ ์„œ์ˆ ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋ฌธ๋ฒ•์ด ์กด์žฌ
  • ํ‘œ์ค€ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ ํŒŒ์ผ(Makefile)์„ make๊ฐ€ ํ•ด์„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰
  • make ๋ฅผ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•œ makefile ์„ ์ฝ์–ด์„œ ๋‚ด์šฉ์„ ์ˆ˜ํ–‰

Makefile ์ž‘์„ฑ๋ฒ•

target โ€ฆ : prerequisites โ€ฆ
	recipe
	โ€ฆ
	โ€ฆ
  • target
    • ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ์˜ ์ด๋ฆ„์œผ๋กœ ์‹คํ–‰ ํŒŒ์ผ ๋˜๋Š” object ํŒŒ์ผ
  • prerequisites
    • target ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ๋“ค
  • recipe
    • ์ˆ˜ํ–‰ ๋™์ž‘
    • ๋ชจ๋“  recipe ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ํƒญ ๋ฌธ์ž๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

Simple Makefile

edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o
	cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o

main.o : main.c defs.h
	cc -c main.c
kbd.o : kbd.c defs.h command.h
	cc -c kbd.c
command.o : command.c defs.h command.h
	cc -c command.c
display.o : display.c defs.h buffer.h
	cc -c display.c
insert.o : insert.c defs.h buffer.h
	cc -c insert.c
search.o : search.c defs.h buffer.h
	cc -c search.c
files.o : files.c defs.h buffer.h command.h
	cc -c files.c
utils.o : utils.c defs.h
	cc -c utils.c
clean :
	rm edit main.o kbd.o command.o display.o \
	insert.o search.o files.o utils.o
  • edit ์ด๋ผ๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” main.o, kbd.o ๋“ฑ 8๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์ด ํ•„์š”ํ•˜๊ณ , 8๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ Linking ํ•ด์„œ ์–ป๋Š”๋‹ค.
    • ์ด 8๊ฐœ์˜ ์†Œ์ŠคํŒŒ์ผ๊ณผ 3๊ฐœ์˜ ํ—ค๋”ํŒŒ์ผ์— ์˜์กดํ•œ๋‹ค.
  • main.o ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” main.c, defs.h ํŒŒ์ผ๋“ค์ด ํ•„์š”ํ•˜๊ณ , main.c๋ฅผ ์ปดํŒŒ์ผํ•ด์„œ ์–ป๋Š”๋‹ค.
    • ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง„ํ–‰๋œ๋‹ค.
  • clean ์€ ๋ ˆ์ด๋ธ”๋กœ์จ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์ •๋ฆฌํ•œ๋‹ค.

Makefile ์‹ค์‚ฌ์šฉ ์˜ˆ์‹œ

CFLAGS = -g โ€“O2 -I../include
LDLIBS = -lpthread

TARGET = test_program
OBJS = main.o config.o debug.o log.o

all : $(OBJS)
	cc โ€“o $(TARGET) $(OBJS) $(LDLIBS)
clean :
	rm โ€“f $(OBJS)
	rm โ€“f $(TARGET)
  • CFLAGS, LDLIBS, TARGET, OBJS ๋“ฑ ๋งคํฌ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • ๋งคํฌ๋กœ๋ฅผ ์ง€์ •ํ•ด๋‘๋ฉด all : $(OBJS) ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • make ๋งŒ ์ž…๋ ฅํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ all ์„ ์‹คํ–‰ํ•œ๋‹ค.
    • make all ์™€ ๊ฐ™์€ ํšจ๊ณผ
  • make clean ์„์ž…๋ ฅํ•˜๋ฉด clean ๋ ˆ์ด๋ธ”์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์ •๋ฆฌํ•œ๋‹ค.
  • ๋งคํฌ๋กœ๋Š” ๋ณ€์ˆ˜์™€ ๊ฐ™์ด ์ด๋ฆ„์„ ์„ ์–ธํ•˜๊ณ  ๋‚ด์šฉ์„ ์„œ์ˆ˜ํ•œ๋‹ค.
  • $(๋งคํฌ๋กœ๋ช…) ์„ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์š” ์‚ฌ์ „ ์ •์˜ ๋ณ€์ˆ˜

  • CC: C ์ปดํŒŒ์ผ๋Ÿฌ, ๊ธฐ๋ณธ๊ฐ’ cc
  • CFLAGS: ์ปดํŒŒ์ผ ์˜ต์…˜
    • CFLAGS=-g-O2-l../includes
  • LDFLAGS: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ -L๊ณผ ๊ฐ™์€ ๋ง์ปค โ€˜ldโ€™๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ œ๊ณตํ•  ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ
    • LDFLAGS = -L. โ€“L$(LIB_DIR)
  • LDLIBS : ๋ง์ปค โ€˜ldโ€™๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณต๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ์ด๋ฆ„
    • -L ๊ณผ ๊ฐ™์€ ๋น„๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ง์ปค ํ”Œ๋ž˜๊ทธ๋Š” LDFLAGS ๋ณ€์ˆ˜์— ์žˆ์–ด์•ผ ํ•จ
    • LDLIBS=-lpthread

์ฃผ์š” ์ž๋™ ๋ณ€์ˆ˜

CFLAGS = -Wall
TARGET = test_program
OBJS = main.o sub.o

all : $(TARGET)
$(TARGET) : $(OBJS)
	$(CC) $(CFLAGS) โ€“o $@ $^
main.o : main.c
	$(CC) $(CFLAGS) โ€“c โ€“o $@ $^
sub.o : sub.c
	$(CC) $(CFLAGS) โ€“c โ€“o $@ $^
clean :
	rm โ€“rf *.o $(TARGET)
  • $@ : ์ตœ์ข… ํƒ€๊ฒŸ์˜ ํŒŒ์ผ ์ด๋ฆ„
  • $< : ์ฒซ๋ฒˆ์งธ ์ „์ œ ์กฐ๊ฑด์˜ ์ด๋ฆ„
  • $? : ํ˜„์žฌ ํƒ€๊ฒŸ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด ํŒŒ์ผ๋“ค์˜ ์ด๋ฆ„
  • $^ : ๋ชจ๋“  ์ „์ œ ์กฐ๊ฑด ํŒŒ์ผ๋“ค์˜ ์ด๋ฆ„
  • $* : ํƒ€๊ฒŸ ์ด๋ฆ„์ด ํ™•์žฅ์ž๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ, ํ™•์žฅ์ž๋ฅผ ๋บ€ ์ด๋ฆ„
    • ํƒ€๊ฒŸ์ด๋ฆ„์ด foo.c ์ธ ๊ฒฝ์šฐ foo ๋กœ ์„ค์ •

ํŒจํ„ด ๊ทœ์น™

  • %.c ํŒจํ„ด์€ .c ๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ผ์น˜
  • s.$.c ํŒจํ„ด์€ s. ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  .c ๋กœ ๋๋‚˜๋Š” ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ผ์น˜
    %.o:%.c
      $(CC) $(CFLAGS) โ€“c $< โ€“o $@
    
  • .c ํŒŒ์ผ์„ .o ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ทœ์น™

์น˜ํ™˜ ๋งคํฌ๋กœ

  • $(๋งคํฌ๋กœ:๋ณ€๊ฒฝ์ „=๋ณ€๊ฒฝํ›„) -> ๋ณ€๊ฒฝ์ „์ด ๋ณ€๊ฒฝํ›„๋กœ ๋ฐ”๋€Œ์–ด ์‚ฌ์šฉ๋จ
    SRCS = main.c command.c display.c utils.c files.c
    OBJS = main.o command.o display.o utils.o files.o
    
SRCS = main.c command.c display.c utils.c files.c
OBJS = $(SRCS:.c=.o)
  • ์œ„ ๋‘ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž„

Reference.

  • ํŒจ์ŠคํŠธ์บ ํผ์Šค ๋ฆฌ๋ˆ…์Šค ์˜ฌ์ธ์› ํŒจํ‚ค์ง€ ๊ฐ•์ขŒ

Categories:

Updated:

Leave a comment