Áö±Ý±îÁö °Á¸¦ ÁøÇàÇÏ¸é¼ Makefile
ÀÇ ¿©·¯ °¡Áö ¿¹Á¦µéÀ» Á¦½ÃÇÏ¿´´Ù.
°Á¿¡ ³ª¿Â ¿¹Á¦µéÀ» Á¶±Ý¸¸ ¹Ù²Ù¸é ÀÚ½ÅÀÇ Makefile
·Î½á »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¿©±â¿¡¼´Â ¿©·¯ °¡Áö Makefile
µéÀÇ ±âº»Æ²(template)µéÀ» ¼Ò°³ÇÏ°íÀÚ
ÇÑ´Ù.
¿©±â¼´Â ¿ì¼± °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â C¿Í C++¿¡¼ÀÇ Makefile
À» ¼Ò°³Çϱâ·Î
ÇÑ´Ù. ¿©·¯ °³ÀÇ ÆÄÀϵéÀ» ÄÄÆÄÀÏÇؼ ÇϳªÀÇ ½ÇÇà ÆÄÀÏÀ» ¸¸µå´Â ¿¹Á¦ ƲÀÌ
¹Ù·Î
.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)
% make dep <- ÀÚµ¿À¸·Î ÀÇÁ¸ °ü°è »ý¼º
% make <- make µ¿ÀÛ
Áö±Ý±îÁöÀÇ °Á¸¦ ÀÌÇØÇÏ°í ÀÖ´Ù¸é À§ÀÇ Makefile
ÀÇ µ¶Çضõ ¾î·ÆÁö ¾ÊÀ»
°ÍÀÌ´Ù. °³·«ÀûÀÎ »çÇ׸¸ ¼³¸íÇϱâ·Î ÇÑ´Ù.
make ³»ºÎ¿¡¼ Á¤ÀÇµÈ È®ÀåÀÚ ±ÔÄ¢À» ÀÌ¿ëÇϱâ À§ÇÑ °ÍÀÌ´Ù. make´Â ÀÚµ¿ÀûÀ¸·Î .c¿Í .o·Î ³¡³ª´Â ÆÄÀϵ鰣¿¡ Á¤ÀÇµÈ ±ÔÄ¢ÀÌ ÀÖ´ÂÁö ã°Ô µÇ°í Àû´çÇÑ ±ÔÄ¢À» ã¾Æ¼ ¼öÇàÇÏ°Ô µÈ´Ù.
CFLAGS ¸ÅÅ©·Î¸¦ ÀçÁ¤ÀÇ ÇÏ°í ÀÖ´Ù. -g ´Â µð¹ö±× Á¤º¸¸¦ Ãß°¡Ç϶ó´Â °ÍÀÌ°í, $(INC)´Â ÄÄÆÄÀÏÇÒ¶§ ÇÊ¿äÇÑ include Æнº¸¦ Àû¾î µÎ´Â °÷ÀÌ´Ù.
make´Â Makefile
À» ¼øÂ÷ÀûÀ¸·Î ÀÐ¾î¼ °¡Àå óÀ½¿¡ ³ª¿À´Â ±ÔÄ¢À»
¼öÇàÇÏ°Ô µÈ´Ù. ¿©±â¼ all À̶õ ´õ¹ÌŸ°Ù(dummy target)ÀÌ ¹Ù·Î ù ¹ø°
Ÿ°ÙÀ¸·Î½á ÀÛ¿ëÇÏ°Ô µÈ´Ù. °ü½ÀÀûÀ¸·Î allÀ̶õ Ÿ°ÙÀ» Á¤ÀÇÇØ µÎ´Â °ÍÀÌ
ÁÁ´Ù. °á°ú ÆÄÀÏÀÌ ¸¹À» ¶§µµ allÀÇ ÀÇÁ¸ °ü°è(dependency)·Î½á Á¤ÀÇÇØ µÎ¸é
²Ï Æí¸®ÇÏ´Ù.
ÀÇÁ¸ °ü°è¸¦ ÀÚµ¿ÀûÀ¸·Î »ý¼ºÇØ ÁÖ±â À§ÇÑ °ÍÀÌ´Ù. Çì´õ ÆÄÀÏÀÇ Æнº±îÁö Ãß°¡µÇ¾î¾ß ÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇϱ⠹ٶ÷. ÀÌ°ÍÀº ³»ºÎÀûÀ¸·Î gcc°¡ ÀÛµ¿µÇ±â ¶§¹®ÀÌ´Ù.
.SUFFIXES : .cc .o
CXX = g++
CXXFLAGS = -g $(INC)
$(TARGET) : $(OBJS)
$(CXX) -o $@ $(OBJS) $(LIBS)
¹°·Ð °¢ÀÚÀÇ ÃëÇâ¿¡ µû¶ó¼ Makefile
À» ¸¸µé¾îµµ µÈ´Ù. ¿©±â¼
Á¦½ÃÇÏ°í ÀÖ´Â Makefile
Àº ¾îµð±îÁö³ª ÇÊÀÚÀÇ °üÁ¡¿¡¼ ¸¸µç
Makefile
À» ¼Ò°³ÇÏ°í ÀÖ´Â °Í»ÓÀ̴ϱî...
¶óÀ̺귯¸®¸¦ ¸¸µé±â À§ÇÑ Makefile
Àº ¾î¶² Â÷ÀÌ°¡ ÀÖÀ»±î.
=> Âü°í: ¶óÀ̺귯¸® ¸¸µå´Â ¹æ¹ýÀ» ¼Ò°³Çϱâ·Î ÇÑ´Ù. 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
·Î ÀϹÝȽÃŲ´Ù¸é ¾î¶»°Ô µÉ±î? ¾ÆÁÖ Á¶±Ý¸¸
»ý°¢ÇÏ¸é µÈ´Ù.
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 <- ÇöÀç µð·ºÅ丮¿¡ ÀÖ´Ù°í °¡Á¤
Makefile
À» ¼Ò°³ÇÑ´Ù.
.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
À»
Àڱ⠰³¼º²¯ ²Ù¹Ð ¼ö ÀÖÀ» °ÍÀÌ´Ù.
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
À» Çѹø »ìÆ캸ÀÚ.
.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 ¶ó´Â °ÍÀ» ±â¾ïÇϱ⠹ٶ÷. (»ï´Ü³í¹ý Á¤µµ¸¸ ¾È´Ù¸é¾ß...)