ÀÌÀüÆäÀÌÁö ´ÙÀ½ÆäÀÌÁö Â÷·Ê

7. MakefileÀÇ ½ÇÁ¦ ¿¹Á¦

Áö±Ý±îÁö °­Á¸¦ ÁøÇàÇϸ鼭 MakefileÀÇ ¿©·¯ °¡Áö ¿¹Á¦µéÀ» Á¦½ÃÇÏ¿´´Ù. °­Á¿¡ ³ª¿Â ¿¹Á¦µéÀ» Á¶±Ý¸¸ ¹Ù²Ù¸é ÀÚ½ÅÀÇ Makefile·Î½á »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿©±â¿¡¼­´Â ¿©·¯ °¡Áö MakefileµéÀÇ ±âº»Æ²(template)µéÀ» ¼Ò°³ÇÏ°íÀÚ ÇÑ´Ù.

7.1 ÇÁ·Î±×·¥ Á¦ÀÛ¿¡ ¾²ÀÏ ¼ö ÀÖ´Â Makefile

¿©±â¼­´Â ¿ì¼± °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â C¿Í C++¿¡¼­ÀÇ MakefileÀ» ¼Ò°³Çϱâ·Î ÇÑ´Ù. ¿©·¯ °³ÀÇ ÆÄÀϵéÀ» ÄÄÆÄÀÏÇؼ­ ÇϳªÀÇ ½ÇÇà ÆÄÀÏÀ» ¸¸µå´Â ¿¹Á¦ ƲÀÌ ¹Ù·Î ¿¹Á¦ 7.1ÀÌ´Ù.

¿¹Á¦ 7.1


.SUFFIXES = .c .o

CC = gcc

INC = <- include µÇ´Â Çì´õ ÆÄÀÏÀÇ Æнº¸¦ Ãß°¡ÇÑ´Ù.
LIBS = <- ¸µÅ©ÇÒ ¶§ ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ Ãß°¡ÇÑ´Ù.
CFLAGS = -g $(INC) <- ÄÄÆÄÀÏ¿¡ ÇÊ¿äÇÑ °¢Á¾ ¿É¼ÇÀ» Ãß°¡ÇÑ´Ù.

OBJS = <- ¸ñÀû ÆÄÀÏÀÇ À̸§À» Àû´Â´Ù.
SRCS = <- ¼Ò½º ÆÄÀÏÀÇ À̸§À» Àû´Â´Ù.

TARGET = <- ¸µÅ© ÈÄ¿¡ »ý¼ºµÉ ½ÇÇà ÆÄÀÏÀÇ À̸§À» Àû´Â´Ù.

all : $(TARGET)

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

dep :
                gccmakedep $(INC) $(SRCS)

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

new : 
                $(MAKE) clean 
                $(MAKE) 

¿¹Á¦ 7.1 ¿¡¼­ ¹Ù²ã¾ß ÇÒ ºÎºÐÀº Ç¥½Ã¸¦ ÇØ µÎ¾ú´Ù. ÀÚ½ÅÀÇ ÆÄÀϵé·Î Àû´çÈ÷ °íÃÄ ÁØ ´ÙÀ½ make dep À» ¼öÇà½ÃÄÑ º»´Ù. ±×·¯¸é ÀÚµ¿À¸·Î ÀÇÁ¸ °ü°è°¡ »ý¼ºµÈ´Ù.

% make dep <- ÀÚµ¿À¸·Î ÀÇÁ¸ °ü°è »ý¼º
% make <- make µ¿ÀÛ

Áö±Ý±îÁöÀÇ °­Á¸¦ ÀÌÇØÇÏ°í ÀÖ´Ù¸é À§ÀÇ MakefileÀÇ µ¶Çضõ ¾î·ÆÁö ¾ÊÀ» °ÍÀÌ´Ù. °³·«ÀûÀÎ »çÇ׸¸ ¼³¸íÇϱâ·Î ÇÑ´Ù.

.SUFFIXES = .c .o

make ³»ºÎ¿¡¼­ Á¤ÀÇµÈ È®ÀåÀÚ ±ÔÄ¢À» ÀÌ¿ëÇϱâ À§ÇÑ °ÍÀÌ´Ù. make´Â ÀÚµ¿ÀûÀ¸·Î .c¿Í .o·Î ³¡³ª´Â ÆÄÀϵ鰣¿¡ Á¤ÀÇµÈ ±ÔÄ¢ÀÌ ÀÖ´ÂÁö ã°Ô µÇ°í Àû´çÇÑ ±ÔÄ¢À» ã¾Æ¼­ ¼öÇàÇÏ°Ô µÈ´Ù.

CFLAGS = -g $(INC)

CFLAGS ¸ÅÅ©·Î¸¦ ÀçÁ¤ÀÇ ÇÏ°í ÀÖ´Ù. -g ´Â µð¹ö±× Á¤º¸¸¦ Ãß°¡Ç϶ó´Â °ÍÀÌ°í, $(INC)´Â ÄÄÆÄÀÏÇÒ¶§ ÇÊ¿äÇÑ include Æнº¸¦ Àû¾î µÎ´Â °÷ÀÌ´Ù.

all : $(TARGET)

make´Â MakefileÀ» ¼øÂ÷ÀûÀ¸·Î Àо °¡Àå óÀ½¿¡ ³ª¿À´Â ±ÔÄ¢À» ¼öÇàÇÏ°Ô µÈ´Ù. ¿©±â¼­ all À̶õ ´õ¹ÌŸ°Ù(dummy target)ÀÌ ¹Ù·Î ù ¹ø° Ÿ°ÙÀ¸·Î½á ÀÛ¿ëÇÏ°Ô µÈ´Ù. °ü½ÀÀûÀ¸·Î allÀ̶õ Ÿ°ÙÀ» Á¤ÀÇÇØ µÎ´Â °ÍÀÌ ÁÁ´Ù. °á°ú ÆÄÀÏÀÌ ¸¹À» ¶§µµ allÀÇ ÀÇÁ¸ °ü°è(dependency)·Î½á Á¤ÀÇÇØ µÎ¸é ²Ï Æí¸®ÇÏ´Ù.

dep : gccmakedep $(INC) $(SRCS)

ÀÇÁ¸ °ü°è¸¦ ÀÚµ¿ÀûÀ¸·Î »ý¼ºÇØ ÁÖ±â À§ÇÑ °ÍÀÌ´Ù. Çì´õ ÆÄÀÏÀÇ Æнº±îÁö Ãß°¡µÇ¾î¾ß ÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇϱ⠹ٶ÷. ÀÌ°ÍÀº ³»ºÎÀûÀ¸·Î gcc°¡ ÀÛµ¿µÇ±â ¶§¹®ÀÌ´Ù.

¿¹Á¦ 7.1 À» C++ ÆÄÀÏ¿¡ ÀÌ¿ëÇϱâ À§Çؼ­´Â .SUFFIEX , CC, CFLAGS ±×¸®°í Ÿ°Ù¿¡ ´ëÇÑ ¸í·É¾î¸¦ ¾Æ·¡ÀÇ ³»¿ë°ú °°ÀÌ ¹Ù²Ù¸é µÈ´Ù.

¿¹Á¦ 7.2


.SUFFIXES = .cc .o

CXX = g++
CXXFLAGS = -g $(INC)

$(TARGET) : $(OBJS)
$(CXX) -o $@ $(OBJS) $(LIBS)

¹°·Ð °¢ÀÚÀÇ ÃëÇâ¿¡ µû¶ó¼­ MakefileÀ» ¸¸µé¾îµµ µÈ´Ù. ¿©±â¼­ Á¦½ÃÇÏ°í ÀÖ´Â MakefileÀº ¾îµð±îÁö³ª ÇÊÀÚÀÇ °üÁ¡¿¡¼­ ¸¸µç MakefileÀ» ¼Ò°³ÇÏ°í ÀÖ´Â °Í»ÓÀ̴ϱî...

7.2 ¶óÀ̺귯¸®¿ÍÀÇ ¸µÅ©°¡ ÇÊ¿äÇÑ ÇÊ¿äÇÑ Makefile

¶óÀ̺귯¸®¸¦ ¸¸µé±â À§ÇÑ MakefileÀº ¾î¶² Â÷ÀÌ°¡ ÀÖÀ»±î. ¿¹Á¦ 7.1°ú °ÅÀÇ Èí»çÇÏ´Ù. ´Ù¸¸ TARGET ÀÌ ½ÇÇà ÆÄÀÏÀÌ ¾Æ´Ï°í ¶óÀ̺귯¸®¶ó´Â °Í»Ó. ±×¸®°í ¶óÀ̺귯¸® ¸¸µå´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù´Â °Í...

=> Âü°í: ¶óÀ̺귯¸® ¸¸µå´Â ¹æ¹ýÀ» ¼Ò°³Çϱâ·Î ÇÑ´Ù. read.o, write.o¸¦ libio.a·Î ¸¸µé¾î º¸ÀÚ. ¶óÀ̺귯¸®¸¦ ¸¸µé±â À§Çؼ­´Â ar À¯Æ¿¸®Æ¼¿Í ranlib À¯Æ¿¸®Æ¼°¡ ÇÊ¿äÇÏ´Ù. (ÀÚ¼¼ÇÑ ¼³¸íÀº man À» ÀÌ¿ë)

% ar rcv libio.a read.o write.o

a - read.o <- ¶óÀ̺귯¸®¿¡ Ãß°¡ (add)
a - write.o 

% ranlib libio.a <- libio.aÀÇ »öÀÎ(index)À» »ý¼º

±×·³ À§ÀÇ °úÁ¤À» Makefile·Î ÀϹÝÈ­½ÃŲ´Ù¸é ¾î¶»°Ô µÉ±î? ¾ÆÁÖ Á¶±Ý¸¸ »ý°¢ÇÏ¸é µÈ´Ù. ¿¹Á¦ 7.1¿¡¼­ TARGET¸¦ ó¸®ÇÏ´Â ºÎºÐ¸¸ ¾Æ·¡¿Í °°ÀÌ ¹Ù²Ù¾î º¸ÀÚ.

¿¹Á¦ 7.3


TARGET = libio.a

$(TARGET) : $(OBJS)
                $(AR) rcv $@ $(OBJS) <- ar rcv libio.a read.o write.o
                ranlib $@ <- ranlib libio.a

ELF ±â¹Ý¿¡¼­ µ¿Àû ¶óÀ̺귯¸®(dynamic library, shared library)¸¦ ¸¸µé¾î º¸±â·Î ÇÏÀÚ. ELF »ó¿¡¼­´Â µ¿Àû ¶óÀ̺귯¸® ¸¸µå´Â ¹æ¹ýÀÌ ÀÌÀü¿¡ ºñÇØ ¾ÆÁÖ °£´ÜÇØ Á³´Ù. (¿¾³¯¿¡ ¸ðƼÇÁ ¼Ò½º °¡Áö°í µ¿Àû ¶óÀ̺귯¸® ¸¸µç´Ù°í °í»ýÇÑ °Í¿¡ ºñÇÏ¸é ¼¼»óÀÌ ³Ê¹« ÁÁ¾ÆÁø °Í °°À½) BSD°è¿­ÀÇ À¯´Ð½º¸¦ »ç¿ëÇØ º» »ç¶÷À̶ó¸é ºñ½ÁÇÏ´Ù´Â °ÍÀ» ´À³¥ °ÍÀÌ´Ù. ±×·³ read.c write.c¸¦ ÄÄÆÄÀÏÇؼ­ libio.so.1À» ¸¸µé¾î º¸ÀÚ.(so´Â shared object¸¦ ÀǹÌ, µÚÀÇ .1Àº µ¿Àû ¶óÀ̺귯¸®ÀÇ ¹öÀüÀ» ÀǹÌ)

% gcc -fPIC -c read.c <- -fPICÀ» Ãß°¡Çؼ­ ÄÄÆÄÀÏÇÑ´Ù.
% gcc -fPIC -c write.c

% gcc -shared -Wl,-soname,libio.so.1 -o libio.so.1 read.o write.o

µ¿Àû ¶óÀ̺귯¸®¸¦ ¸¸µé±â À§ÇÑ ¿É¼Ç

À§¿Í °°ÀÌ Çϸé libio.so.1 °¡ »ý¼ºµÈ´Ù. »ç¿ëÀÚ°¡ ¸¸µç µ¿Àû ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­´Â °£´ÜÈ÷¸¸ ¾ð±ÞÇϱâ·Î ÇÑ´Ù. ¿ì¼± libio.so.1 À» /usr/lib·Î ¿Å°Ü¼­ ldconfig -v Çؼ­ ¶óÀ̺귯¸® ¼³Á¤À» °»½ÅÇØ ÁÖ´øÁö, ¾Æ´Ï¸é LD_LIBRARY_PATH¸¦ ÁöÁ¤ÇØ µÎ¸é µÈ´Ù. ¾Æ·¡´Â test.c¸¦ libio.so.1°ú ¸µÅ© ½ÃÅ°´Â ¿¹Á¦ÀÌ´Ù.

% gcc -c test.c
% gcc -o test test.o -L. -lio <- ÇöÀç µð·ºÅ丮¿¡ ÀÖ´Ù°í °¡Á¤

¿¹Á¦ 7.1¸¦ ¾à°£ °íÃļ­ µ¿Àû ¶óÀ̺귯¸®¸¦ ÀÚµ¿ÀûÀ¸·Î ¸¸µé¾î º¸ÀÚ. À̹ø¿£ ¿ÏÀüÇÑ ³»¿ëÀÇ MakefileÀ» ¼Ò°³ÇÑ´Ù.

¿¡Á¦ 7.4


.SUFFIXES = .c .o 

CC = gcc

INC =
LIBS =
CFLAGS = -g $(INC) -fPIC <- -fPIC Ãß°¡

OBJS = read.o write.o
SRCS = read.c write.c

TARGET = libio.so.1 <- libio.so.1ÀÌ ÃÖÁ¾ ÆÄÀÏ

all : $(TARGET)
                $(TARGET) : $(OBJS)
                $(CC) -shared -Wl,-soname,$@ -o $@ $(OBJS)

dep :
                gccmakedep $(INC) $(SRCS)

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

¾ÆÁÖ Á¶±Ý¹Û¿¡ ¹Ù²îÁö ¾Ê¾Ò´Ù. µû¶ó¼­ ÀÌ ±ÛÀ» Àд ¿©·¯ºÐÀº ÀÌÁ¦ °¢ÀÚÀÇ ¸ñÀû¿¡ ¸Â°Ô MakefileÀ» ±¸¼ºÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ëºÎºÐ È®ÀåÀÚ ±ÔÄ¢°ú ÃÖÁ¾ ÆÄÀÏÀ» »ý¼ºÇØ ³»±â À§ÇÑ ¸í·É¾î°¡ ¹«¾ùÀÎÁö ¾Ë°í ÀÖÀ¸¸é MakefileÀ» Àڱ⠰³¼º²¯ ²Ù¹Ð ¼ö ÀÖÀ» °ÍÀÌ´Ù.

7.3 LaTeX¿¡¼­ ¾²ÀÏ ¼ö ÀÖ´Â Makefile

MakefileÀÌ ¾²ÀÏ ¼ö ÀÖ´Â ´Ù¸¥ ¿¹·Î½á °¡Àå ´ëÇ¥ÀûÀÎ °ÍÀÌ latex¸¦ »ç¿ëÇÒ ¶§ÀÌ´Ù. ÀÌ¹Ì ÀÌÀü °­Á¿¡¼­ ¿©·¯ Â÷·Ê ¼Ò°³µÈ Àûµµ ÀÖ´Ù. ±×·³ doc.tex¸¦ doc.ps·Î ¸¸µé¾î º¸±â·Î ÇÏÀÚ. ¾à°£ ¾î·Æ°Ô Çϱâ À§Çؼ­ doc.tex´Â ³»ºÎÀûÀ¸·Î intro.tex ¿Í conclusion.tex¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. (³í¹® °°Àº °ÍÀ» ÀÛ¼ºÇÒ ¶§´Â ÀÌ·¸°Ô .tex ÆÄÀÏÀÌ ¸¹¾ÆÁö°Ô µÈ´Ù.)

% latex doc.tex <- doc.dviÀÇ »ý¼º
% dvips doc.dvi -o <- doc.texÀÇ »ý¼º

À§¿Í °°Àº ÀÏÀ» ¼öÇàÇÏ´Â MakefileÀ» Çѹø »ìÆ캸ÀÚ.

¿¹Á¦ 7.5


.SUFFIXES = .tex .dvi <- È®ÀåÀÚ ±ÔÄ¢

TEX = latex

OBJ = doc.dvi
SRC = doc.tex

TARGET = doc.ps <- °á°ú ÆÄÀÏ

all : $(TARGET)

$(TARGET) : $(OBJ)
                dvips $(OBJ) -o <- dvips doc.dvi -o

new : <- °­Á¦ÀûÀ¸·Î ´Ù½Ã make
                touch $(SRC) ; $(MAKE)

doc.tex : intro.tex conclusion.tex <- ÀÇÁ¸ °ü°è ¼³Á¤

=> Âü°í·Î gccmakedep´Â latex ÆÄÀÏÀº Áö¿øÀ» ÇÏÁö ¾Ê´Â °Í °°´Ù. µû¶ó¼­ ÀÇÁ¸ °ü°è °°Àº °ÍÀº ¿ì¸®°¡ Á÷Á¢ Àû¾î ÁÖ¾î¾ß ÇÑ´Ù.

¿©±â¿¡¼­ Á¦½ÃµÈ ÀÀ¿ë ¸»°í ±× ¿ÜÀÇ ´Ù¸¥ ÀÀ¿ë¿¡ ´ëÇؼ­´Â °¢ÀÚ°¡ Çѹø »ý°¢ÇØ º¸±â ¹Ù¶õ´Ù. ŸÀÌÇÎÇϱ⠱ÍÂúÀº °ÍÀº ¸ðÁ¶¸® make¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¿°µÎ. ¾à°£Àº ¿øÀÎ, °á°ú¸¦ µûÁö´Â ³í¸®(?)°¡ Àû¿ëµÈ´Ù°í º¼ ¼öµµ ÀÖ´Â °ÍÀÌ make ¶ó´Â °ÍÀ» ±â¾ïÇϱ⠹ٶ÷. (»ï´Ü³í¹ý Á¤µµ¸¸ ¾È´Ù¸é¾ß...)


ÀÌÀüÆäÀÌÁö ´ÙÀ½ÆäÀÌÁö Â÷·Ê