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

3. ¸ÅÅ©·Î(Macro) ¿Í È®ÀåÀÚ(Suffix) ±ÔÄ¢

3.1 ¸ÅÅ©·Î¶õ ¹«¾ùÀΰ¡? (What is Macro)

¾Õ¿¡¼­ ¸ÅÅ©·Î¿¡ ´ëÇؼ­ ´ëÃæ ¾ð±ÞÀ» Çß´Ù. ÇÁ·Î±×·¥À» Â¥º» »ç¶÷À̳ª ·ÎÅͽº, ÇѱÛ, ¿¢¼¿ µîÀÇ ¸ðµç ÆÐÅ°Áö¿¡¼­ ¸ÅÅ©·Î¶ó´Â °ÍÀ» »ç¿ëÇÏ°Ô µÈ´Ù. Àº¿¬Áß¿¡ ¸ÅÅ©·ÎÀÇ Á¤ÀÇ´Â ´ëÃæ ÁüÀÛÇÏ°í ÀÖÀ» °ÍÀÌ´Ù. ÀÌ¹Ì ¾Ë°í ÀÖ´Â¹Ù¿Í °°ÀÌ ¸ÅÅ©·Î´Â ƯÁ¤ÇÑ Äڵ带 °£´ÜÇÏ°Ô Ç¥ÇöÇÑ °Í¿¡ Áö³ªÁö ¾Ê´Â´Ù. Makefile¿¡¼­ »ç¿ëµÇ´Â ¸ÅÅ©·Î´Â ºñ±³Àû ±× »ç¿ë¹ýÀÌ °£´ÜÇϱ⠶§¹®¿¡ ±Ý¹æ ÀÍÇô¼­ »ç¿ëÇÒ Á¤µµ°¡ µÈ´Ù.

¸ÅÅ©·ÎÀÇ Á¤ÀÇ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ º¯¼ö¸¦ ÁöÁ¤ÇÏ´Â °Íó·³ ÇÏ¸é µÈ´Ù. ±×¸®°í, ¸ÅÅ©·Î¸¦ »ç¿ëÇϱâ À§Çؼ­´Â $(..)À» ÀÌ¿ëÇÏ¸é µÈ´Ù. ¾Æ·¡´Â ¸ÅÅ©·ÎÀÇ °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.

=> Âü°í: ¸ÅÅ©·ÎÀÇ »ç¿ë¿¡¼­ ${..}, $(..), $..¸¦ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ´ëºÎºÐÀÇ Ã¥¿¡¼­´Â $(..) À» »ç¿ëÇ϶ó°í ±ÇÇϴ±º¿ä.

Makefile¿¹Á¦ 4


OBJS = main.o read.o write.o

test : $(OBJS) <- (1)
gcc -o test $(OBJS)
                ..........

ù ¹ø° Àå¿¡¼­ ´Ù·ç¾ú´ø ¿¹Á¦¿Í °ÅÀÇ ºñ½ÁÇÏ´Ù. ¸ÅÅ©·Î´Â »ç½Ç»ó º¹ÀâÇÑ °ÍÀ» °£´ÜÇÏ°Ô Ç¥½ÃÇÑ °Í¿¡ Áö³ªÁö ¾Ê´Â´Ù. (1) ¹øÀ» ¸ÅÅ©·Î¸¦ ¾È ¾²°í Ç¥ÇöÇÑ´Ù¸é ¾Æ¸¶ ¾Æ·¡¿Í °°ÀÌ µÉ °ÍÀÌ´Ù.

Makefile¿¹Á¦ 5


test : main.o read.o write.o 
gcc -o test main.o read.o write.o

=> Âü°í: ¿¹Á¦ 5°¡ ´õ ½±Áö ¾Ê´À³Ä°í ¹Ý¹®ÇÏ´Â »ç¶÷Àº ¸ÅÅ©·ÎÀÇ À§·ÂÀ» Àß ¸ð¸£´Â »ç¶÷ÀÔ´Ï´Ù. °ÅÀÇ ¸ðµç ¼ÒÇÁÆ®¿þ¾î¿¡¼­ ¸ÅÅ©·Î¸¦ Áö¿øÇÏ´Â ÀÌÀ¯¸¦ Çѹø Àß »ý°¢ÇØ º¾½Ã´Ù. ¿¹Á¦ 4 ÀÇ (1)ºÎºÐÀÌ ÀÌÇØÇϱ⠳­ÇØÇÏ´Ù°í ÇÏ½Ç Áö´Â ¸ð¸£°ÚÁö¸¸, ´ëÃæ Çü½ÄÀÌ Á¤ÇØÁ® Àֱ⠶§¹®¿¡ Á¶±Ý¸¸ Àͼ÷ÇØÁö¸é ¿ÀÈ÷·Á ´õ ÆíÇÒ °Ì´Ï´Ù.

make¿¡ °üÇØ ¼³¸íÇÑ Ã¥¿¡ ´ÙÀ½°ú °°Àº ¸í¾ð(?) ÀÌ ³ª¿Â´Ù.

Macro makes Makefile happy. (¸ÅÅ©·Î´Â Makefile À» ±â»Ú°Ô ¸¸µç´Ù.)

ÀÌ ¸»Àº MakefileÀ» ÀÛ¼ºÇÔ¿¡ ÀÖ¾î ¸ÅÅ©·Î¸¦ À߸¸ ÀÌ¿ëÇÏ¸é º¹ÀâÇÑ ÀÛ¾÷µµ ¾ÆÁÖ °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖÀ½À» ¸»ÇØ ÁÖ´Â ¸»ÀÌ ¾Æ´Ò±î »ý°¢ÇÑ´Ù. ¸ÅÅ©·Î¿¡ ´ëÇؼ­´Â ´õ ÀÌ»ó ¸»ÇÒ °ÍÀÌ ¾ø´Ù. (³Ê¹« °£´ÜÇÏÁÒ ?) ÀÌÁ¦ ³²Àº °ÍÀº ¿©·¯ºÐµéÀÌ ÀÚ½ÅÀÇ ¸ÅÅ©·Î¸¦ ¾î¶»°Ô ±¸¼ºÇÏ´À³ÄÀÌ´Ù. ¾î¶² °ÍÀ» ¸ÅÅ©·Î·Î Á¤ÀÇÇØ¾ß ÇÒÁö´Â ¿©·¯ºÐµéÀÇ ÀÚÀ¯À̸ç, ³ªÁß¿¡ Àü¹ÝÀûÀÎ ÁöħÀ» ¼³¸íÇÒ °ÍÀÌ´Ù.

3.2 ¹Ì¸® Á¤ÇØÁ® ÀÖ´Â ¸ÅÅ©·Î (Pre-defined macro)

¿©·¯ºÐµéº¸´Ù ¸Ó¸®°¡ ¾à°£ ´õ ÁÁÀº »ç¶÷µéÀÌ make ¶ó´Â °ÍÀ» ¸¸µé¸é¼­ ¹Ì¸® Á¤ÇØ ³õÀº ¸ÅÅ©·ÎµéÀÌ ÀÖ´Ù. 'make -p' ¶ó°í ÀÔ·ÂÇØ º¸¸é make¿¡¼­ ¹Ì¸® ¼¼ÆõǾî ÀÖ´ø ¸ðµç °ªµé(¸ÅÅ©·Î, ȯ°æ º¯¼ö(environment) µîµî)ÀÌ ¾öû ½ºÅ©·Ñ µÈ´Ù. ÀÌ °ªµéÀ» º¸°í ¹Ì¸® ÁÖ´ª µé ÇÊ¿ä´Â ¾ø´Ù. ¾îÂ÷ÇÇ ´ëºÎºÐÀÇ ³»¿ëµéÀº ¿ì¸®°¡ ÀçÁ¤ÀÇ ÇØÁÖ¾î¾ß Çϱ⠶§¹®¿¡ °á·ÐÀûÀ¸·Î ¸»ÇÏ¸é ¿ì¸®°¡ ¸ðµÎ ÀÛ¼ºÇÑ´Ù°í »ý°¢ÇÏ´Â °ÍÀÌ ¸¶À½ÀÌ ÆíÇÏ´Ù.,.

¾Æ·¡¿¡´Â ´ëºÎºÐÀÌ UNIX °è¿­ÀÇ make¿¡¼­ ¹Ì¸® Á¤ÇØÁ® ÀÖ´Â ¸ÅÅ©·Îµé Áß¿¡ ¸î °¡Áö¸¸ ³ª¿­ÇØ º» °ÍÀÌ´Ù.

Predefined Macro ¿¹Á¦ 6


ASFLAGS = <- as ¸í·É¾îÀÇ ¿É¼Ç ¼¼ÆÃ
AS = as
CFLAGS = <- gcc ÀÇ ¿É¼Ç ¼¼ÆÃ
CC = cc (= gcc)
CPPFLAGS = <- g++ ÀÇ ¿É¼Ç
CXX = g++
LDLFAGS = <- ld ÀÇ ¿É¼Ç ¼¼ÆÃ
LD = ld
LFLAGS = <- lex ÀÇ ¿É¼Ç ¼¼ÆÃ
LEX = lex
YFLAGS = <- yacc ÀÇ ¿É¼Ç ¼¼ÆÃ
YACC = yacc
MAKE_COMMAND = make

=> Âü°í: Á÷Á¢ make -p¸¦ Çؼ­ Çѹø È®ÀÎÇØ º¸¼¼¿ä. °ú¿¬ make´Â ³»ºÎÀûÀ¸·Î ¾î¶² º¯¼öµéÀ» »ç¿ëÇÏ°í ÀÖ´ÂÁö ¾Ë¾Æº¾½Ã´Ù. ¸ÅÅ©·Î´Â °ü½ÀÀûÀ¸·Î ´ë¹®ÀÚ·Î ÀÛ¼ºµÇ´Ï±î ÀÌÁ¡¿¡ À¯ÀÇÇؼ­ º¸¼¼¿ä. make´Â ½©»ó¿¡¼­ Á¤ÀÇÇÑ È¯°æ º¯¼ö°ªµéÀ» ±×´ë·Î ÀÌ¿ëÇÑ´Ù´Â °ÍÀ» ¾Ë°í °è½Ã±â ¹Ù¶ø´Ï´Ù.

À§¿¡ ¿­°ÅÇÑ ¸ÅÅ©·Î´Â make¿¡¼­ Á¤ÀÇµÈ ¸ÅÅ©·ÎÁß ±×¾ß¸»·Î ÀϺο¡ Áö³ªÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÔ¿¡ ÀÖ¾î °¡Àå ¸¹ÀÌ »ç¿ëÇÏ°Ô µÉ ¸ÅÅ©·Î µéÀÌ´Ù. ÀÌµé ¸ÅÅ©·Î´Â »ç¿ëÀÚ¿¡ ÀÇÇØ ÀçÁ¤ÀÇ °¡´ÉÇÏ´Ù. °¡·É gccÀÇ ¿É¼Ç Áß¿¡ µð¹ö±× Á¤º¸¸¦ Ç¥½ÃÇÏ´Â '-g' ¿É¼ÇÀ» ³Ö°í ½Í´Ù¸é, ¾Æ·¡¿Í °°ÀÌ ÀçÁ¤ÀÇ ÇÑ´Ù.

CFLAGS = -g

¿¹Á¦ 6 ÀÇ °¢Á¾ FLAG ¸ÅÅ©·ÎµéÀº ´ëºÎºÐ ¿ì¸®°¡ ÇÊ¿ä¿¡ ÀÇÇØ ¼¼ÆÃÇØ ÁÖ¾î¾ß ÇÏ´Â °ªµéÀÌ´Ù. ¿Ö ±»ÀÌ make¿¡¼­ °ªµµ Á¤ÀǵÇÁö ¾ÊÀº ¸ÅÅ©·Î¸¦ ¿ì¸®°¡ Á¤ÀÇÇؼ­ ½á¾ß ÇÏ´ÂÁö Àǹ®À» ´øÁúÁöµµ ¸ð¸¥´Ù. ¿ì¸®°¡ ´õ ÀÌ»Û À̸§À¸·Î ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù°í Çϸ鼭...

¿©±â¼­ ÇÑ°¡Áö »ç½ÇÀ» »ý°¢ÇØ ºÁ¾ß ÇÒ °ÍÀÌ´Ù. make¿¡¼­ À§¿¡ ³ª¿Â °ÍµéÀ» ¿Ö ¹Ì¸® Á¤ÇØ µÎ¾úÀ»±î? (¿ÖÀϱî¿ä?) make¿¡¼­ ÀÌµé ¸ÅÅ©·Î¸¦ Á¦°øÇÏ°í ÀÖ´Â ÀÌÀ¯´Â ³»ºÎÀûÀ¸·Î ÀÌµé ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ°Ô µÇ±â ¶§¹®ÀÌ´Ù. ¾î¶»°Ô ÀÌ¿ëÇÏ´ÂÁö´Â È®ÀåÀÚ ±ÔÄ¢(Suffix rule)À» ¼³¸íÇϸ鼭 ÇØ´äÀ» Á¦°øÇÒ °ÍÀÌ´Ù. ÀÌÁ¦ ¿¹Á¦ 4 ÀÇ MakefileÀ» ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© ±ò²ûÇÏ°Ô(?) ÀÛ¼ºÇØ º¸ÀÚ.

Makefile¿¹Á¦ 7


OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c <- ¾ø¾îµµ µÊ

CC = gcc <- gcc ·Î ¼¼ÆÃ
CFLAGS = -g -c <- gcc ÀÇ ¿É¼Ç¿¡ -g Ãß°¡

TARGET = test <- °á°ú ÆÄÀÏÀ» test ¶ó°í ÁöÁ¤

$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)

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

main.o : io.h main.c <- (1)
read.o : io.h read.c
write.o: io.h write.c

À§ÀÇ Makefile À» µ¿ÀÛ½ÃÄÑ º¸ÀÚ.

% make 
gcc -g -c main.c -o main.o
gcc -g -c read.c -o read.o
gcc -g -c write.c -o write.o
gcc -o test main.o read.o write.o <- OK

% make clean
rm -rf main.o read.o write.o test core <- OK

±×·±µ¥ ¿©±â¼­ ÇÑ°¡Áö ÀÌ»óÇÑ Á¡À» ¹ß°ßÇÏ°Ô µÉ °ÍÀÌ´Ù. .c ÆÄÀÏÀ» .o ÆÄÀÏ·Î ¹Ù²Ù´Â ºÎºÐÀÌ ¾ø´Âµ¥ ¾î¶»°Ô ÄÄÆÄÀÏÀÌ µÇ¾úÀ»±î? »©¸Ô°í ŸÀÌÇÎ ¸øÇÑ °ÍÀº ¾Æ´Ò±î ÇÏ°í... Àý´ë ¾Æ´Ô!

¾Õ¿¡¼­ CFLAGS °°Àº ¸ÅÅ©·Î´Â make ÆÄÀÏÀÇ ³»ºÎ¿¡¼­ ÀÌ¿ëµÈ´Ù°í ÇÏ¿´´Ù. ±×·¸´Ù¸é make´Â °ú¿¬ ¾îµð¿¡¼­ ÀÌ¿ëÀ» ÇÒ±î? ¹Ù·Î ÄÄÆÄÀÏÇÏ´Â °÷¿¡¼­ ÀÌ¿ëÀ» ÇÏ´Â °ÍÀÌ´Ù. µû¶ó¼­ ¿ì¸®´Â CFLAGS¸¦ ¼ÂÆÃÇØ Áֱ⸸ Çϸé make°¡ ¾Ë¾Æ¼­ ÄÄÆÄÀÏÀ» ¼öÇàÇÏ´Â °ÍÀÌ´Ù. (¾ó¸¶³ª Æí¸®Çմϱî!)

=> Âü°í: È®ÀåÀÚ ±ÔÄ¢¿¡¼­ ´Ù½Ã Çѹø ÀÚ¼¼È÷ ¼³¸íÀ» ÇÏ°Ú½À´Ï´Ù.

(1) ¿¡ ÇØ´çÇÏ´Â ºÎºÐÀº ¾î¶² ÆÄÀÏÀÌ ¾îµð¿¡ ÀÇÁ¸ÇÏ°í ÀÖ´ÂÁö¸¦ Ç¥½ÃÇØ ÁÖ±â À§Çؼ­ ²À ÇÊ¿äÇÏ´Ù. .c ÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ´Â ºÎºÐÀº ÀÏ°ýÀûÀÎ ·çƾÀ¸·Î ÀÛ¼ºÇÒ ¼ö Àֱ⠶§¹®¿¡ À̵é ÆÄÀÏ°£ÀÇ ÀÇÁ¸ °ü°è(dependency)¸¦ µû·Î Ç¥½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù.

=> Âü°í: ÆÄÀÏ°£ÀÇ ÀÇÁ¸ °ü°è¸¦ ÀÚµ¿À¸·Î ÀÛ¼ºÇØ ÁÖ´Â À¯Æ¿¸®Æ¼°¡ ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ´ÙÀ½ Àå¿¡¼­ ´Ù·ç±â·Î ÇÕ´Ï´Ù.

3.3 È®ÀåÀÚ ±ÔÄ¢ (Suffix rule)

È®ÀåÀÚ ±ÔÄ¢À̶õ °£´ÜÈ÷ ¸»Çؼ­ ÆÄÀÏÀÇ È®ÀåÀÚ¸¦ º¸°í, ±×¿¡ µû¶ó ÀûÀýÇÑ ¿¬»êÀ» ¼öÇà½ÃÅ°´Â ±ÔÄ¢À̶ó°í ¸»ÇÒ ¼ö ÀÖ´Ù. °¡·É .c ÆÄÀÏÀº ÀϹÝÀûÀ¸·Î C ¼Ò½º Äڵ带 °¡¸®Å°¸ç, .o ÆÄÀÏÀº ¸ñÀû ÆÄÀÏ(Object file)À» ¸»ÇÏ°í ÀÖ´Ù. ±×¸®°í ´ç¿¬È÷ .c ÆÄÀÏÀº ÄÄÆÄÀϵǾ .o ÆÄÀÏÀÌ µÇ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù.

¿©±â¼­ ÇÑ°¡Áö ¸ÅÅ©·Î°¡ µîÀåÇÏ°Ô µÈ´Ù. .SUFFIXES ¶ó°í ÇÏ´Â ¸ÅÅ©·ÎÀε¥ ¿ì¸®°¡ make ÆÄÀÏ¿¡°Ô ÁÖÀÇ ±í°Ô ó¸®ÇÒ ÆÄÀϵéÀÇ È®ÀåÀÚ¸¦ µî·ÏÇØ Áشٰí ÀÌÇØÇÏ¸é µÉ °ÍÀÌ´Ù.

.SUFFIXES = .c .o

À§ÀÇ Ç¥ÇöÀº '.c' ¿Í '.o' È®ÀåÀÚ¸¦ °¡Áø ÆÄÀϵéÀ» È®ÀåÀÚ ±ÔÄ¢¿¡ ÀÇ°ÅÇؼ­ ó¸®µÉ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. .SUFFIXES ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÑ ¿¹Á¦¸¦ »ìÆ캸ÀÚ.

Makefile¿¹Á¦ 8


.SUFFIXES = .c .o 

OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c

CC = gcc 
CFLAGS = -g -c

TARGET = test

$(TARGET) : $(OBJECTS)
                $(CC) -o $(TARGET) $(OBJECTS)

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

main.o : io.h main.c 
read.o : io.h read.c
write.o: io.h write.c

À§ÀÇ Makefile À» µ¿ÀÛ½ÃÄÑ º¸ÀÚ.

% make
gcc -g -c main.c -o main.o
gcc -g -c read.c -o read.o
gcc -g -c write.c -o write.o
gcc -o test main.o read.o write.o <- OK

È®ÀåÀÚ ±ÔÄ¢¿¡ ÀÇÇؼ­ make´Â ÆÄÀϵ鰣ÀÇ È®ÀåÀÚ¸¦ ÀÚµ¿À¸·Î ÀνÄÇؼ­ ÇÊ¿äÇÑ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. Áï ¾Æ·¡ÀÇ ·çƾÀÌ ÀÚµ¿ÀûÀ¸·Î µ¿ÀÛÇÏ°Ô µÈ´Ù.

.c.o : 
$(CC) $(CFLAGS) -c $< -o $@

=> Âü°í: gmake¿¡¼­´Â ¾à°£ ´Ù¸£°Ô Á¤ÀǵǾî ÀÖÁö¸¸, ¿ì¼±Àº °°´Ù°í ÀÌÇØÇսôÙ. $< , $@ ¿¡ ´ëÇؼ­´Â °ð ¼³¸íÇÕ´Ï´Ù.

¿ì¸®°¡ .SUFFIXES = .c .o ¶ó°í Ç߱⠶§¹®¿¡ make ³»ºÎ¿¡¼­´Â ¹Ì¸® Á¤ÀÇµÈ .c (C ¼Ò½º ÆÄÀÏ)¸¦ ÄÄÆÄÀÏÇؼ­ .o (¸ñÀû ÆÄÀÏ)¸¦ ¸¸µé¾î ³»´Â ·çƾÀÌ ÀÚµ¿ÀûÀ¸·Î µ¿ÀÛÇÏ°Ô µÇ¾î ÀÖ´Ù. CC¿Í CFLAGS µµ ¿ì¸®°¡ Á¤ÀÇÇÑ ´ë·Î ġȯµÉ °ÍÀÓÀº ÀǽÉÇÒ ¿©Áö°¡ ¾ø´Ù.

make ³»ºÎ¿¡¼­ ±âº»ÀûÀ¸·Î ¼­ºñ½º¸¦ Á¦°øÇØ ÁÖ´Â È®ÀåÀÚµéÀÇ ¸®½ºÆ®¸¦ ¿­°ÅÇØ º¸¸é ¾Æ·¡¿Í °°´Ù. °¢ È®ÀåÀÚ¿¡ µû¸¥ ÀÚ¼¼ÇÑ ¼³¸íÀº »ý·«ÇÑ´Ù.

.out .a .ln .o .c .cc .C .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el

Makefile³»ºÎ¿¡¼­ .SUFFIXES ¸ÅÅ©·ÎÀÇ °ªÀ» ¼¼ÆÃÇØ ÁÖ¸é ³»ºÎÀûÀ¸·Î Á¤ÀÇµÈ È®ÀåÀÚÀÇ ¿¬»êÀÌ µ¿ÀÛÀ» ÇÏ°Ô µÈ´Ù. µû¶ó¼­ È®ÀåÀÚ ±ÔÄ¢Àº make°¡ ¾î´À È®ÀåÀÚ¸¦ °¡Áø ÆÄÀϵéÀ» ó¸®ÇÒ °ÍÀΰ¡¸¦ Á¤ÇØ ÁÖ´Â °ÍÀ̶ó°í »ý°¢ÇÒ ¼ö ÀÖ´Ù.

±×·¯³ª ÀÌ°ÍÀº ÇÊÀÚ¸¸ÀÇ »ý°¢ÀÏÁö ¸ô¶óµµ make¿¡¼­ ÀÚµ¿ÀûÀ¸·Î È®ÀåÀÚ¸¦ ¾Ë¾Æ¼­ ÇØÁÖ´Â °ÍÀÌ ÁÁ±ä ÇÏÁö¸¸, ÇÊÀÚ´Â ÀϺη¯ À§ÀÇ .c.o ¿¡ ÇØ´çµÇ´Â ºÎºÐÀ» ±×³É Á¤ÀÇÇؼ­ ¾²±æ ´õ ÁÁ¾ÆÇÑ´Ù. ÀÌ°ÍÀº Áö±Ý±îÁöÀÇ ½À°ü»ó ±×·¸Áö¸¸ ¿ØÁö ¿ì¸®°¡ Á¤ÀÇÇÏ´Â °ÍÀÌ ´õ ÀÚÀ¯·Ó°Ô(flexible) »ç¿ëÇÒ ¼ö ÀÖÀ» °Í °°±â ¶§¹®ÀÌ´Ù. ±×¸®°í ÀÌ·± ±â´ÉÀº ¿ì¸®°¡ ÀÛ¼ºÀ» ÇغÁ¾ß makeÀÇ ¸ÞÄ«´ÏÁòÀ» ´õ Àß ÀÌÇØÇÒ ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù.

¿¹Á¦ 8 ÀÇ ³»¿ëÀ» ¾à°£ ¹Ù²Ù¾î º¸ÀÚ.

Makefile¿¹Á¦ 9


.SUFFIXES = .c .o 

OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c

CC = gcc 
CFLAGS = -g -c 
INC = -I/home/raxis/include <- include Æнº Ãß°¡

TARGET = test

$(TARGET) : $(OBJECTS)
                $(CC) -o $(TARGET) $(OBJECTS)

.c.o : <- ¿ì¸®°¡ È®ÀåÀÚ ±ÔÄ¢À» ±¸Çö
                $(CC) $(INC) $(CFLAGS) $<-

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

main.o : io.h main.c
read.o : io.h read.c
write.o : io.h write.c

% make
gcc -I/home/raxis/include -g -c main.c
gcc -I/home/raxis/include -g -c read.c
gcc -I/home/raxis/include -g -c write.c
gcc -o test main.o read.o write.o <- OK

¿¹Á¦ 8 °ú ¿¹Á¦ 9 ÀÇ Â÷ÀÌ´Â ±×Àú .c .o ºÎºÐÀ» ´©°¡ ó¸®ÇÏ´À³ÄÀÌ´Ù. ±×¸®°í ¿¹Á¦ 9¿¡¼­´Â INC ¶ó´Â ¸ÅÅ©·Î¸¦ Ãß°¡½ÃÄѼ­ ÄÄÆÄÀÏÇÒ¶§ ÀÌ¿ëÇϵµ·Ï ÇÏ¿´´Ù.

3.4 ³»ºÎ ¸ÅÅ©·Î (Internal macro)

make¿¡¼­´Â ³»ºÎ ¸ÅÅ©·Î¶ó´Â °ÍÀÌ ÀÖ´Ù. ÀÌ°ÍÀº ¿ì¸®°¡ ¸¾´ë·Î Á¤ÇÒ ¼ö ÀÖ´Â ¸ÅÅ©·Î´Â Àý´ë ¾Æ´Ï´Ù. ´ë½Å ¸ÅÅ©·Î¸¦ ¿¬»ê, ó¸®Çϴµ¥ ¾²ÀÌ´Â ¸ÅÅ©·Î¶ó°í ÇÏ´Â °ÍÀÌ ´õ Àû´çÇÒ °ÍÀÌ´Ù.

Internal Macro ¿¹Á¦ 10


$* <- È®ÀåÀÚ°¡ ¾ø´Â ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀÏ(Target)

$@ <- ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀÏ(Target)

$< <- ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀÏ(Target)º¸´Ù ´õ ÃÖ±Ù¿¡ °»½ÅµÈ ÆÄÀÏ À̸§

$? <- ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀÏ(Target)º¸´Ù ´õ ÃÖ±Ù¿¡ °»½ÅµÈ ÆÄÀÏÀ̸§

=> Âü°í: Ã¥¿¡¼­´Â $< ¿Í $?¸¦ ¾à°£ ±¸ºÐÇÏ°í ÀÖÁö¸¸ °ÅÀÇ °°´Ù°í ºÁµµ ¹«¹æÇÒ °ÍÀÔ´Ï´Ù.

°¢ ³»ºÎ ¸ÅÅ©·Î¿¡ ´ëÇÑ ¿¹¸¦ º¸±â·Î ÇÑ´Ù.

main.o : main.c io.h
gcc -c $*.c

$* ´Â È®ÀåÀÚ°¡ ¾ø´Â ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀÏÀ̹ǷΠ$* ´Â °á±¹ main ¿¡ ÇØ´çÇÑ´Ù.

test : $(OBJS)
gcc -o $@ $*.c

$@´Â ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀÏÀÌ´Ù. Áï test¿¡ ÇØ´çµÈ´Ù.

.c.o :
gcc -c $< (¶Ç´Â gcc -c $*.c)

$< ´Â ÇöÀçÀÇ ¸ñÇ¥ ÆÄÀϺ¸´Ù ´õ ÃÖ±Ù¿¡ °»½ÅµÈ ÆÄÀÏ À̸§À̶ó°í ÇÏ¿´´Ù. .o ÆÄÀϺ¸´Ù ´õ ÃÖ±Ù¿¡ °»½ÅµÈ .c ÆÄÀÏÀº ÀÚµ¿ÀûÀ¸·Î ÄÄÆÄÀÏÀÌ µÈ´Ù. °¡·É main.o¸¦ ¸¸µé°í ³­ ´ÙÀ½¿¡ main.c¸¦ °»½ÅÇÏ°Ô µÇ¸é main.c´Â $<ÀÇ ÀÛ¿ë¿¡ ÀÇÇØ »õ·Ó°Ô ÄÄÆÄÀÏÀÌ µÈ´Ù.

=> Âü°í: ÀÌÁ¦ ¿¹Á¦ 9 À» ÀÌÇØÇÒ ¼ö ÀÖ°Ú½À´Ï±î?

=> Âü°í: Makefile ÆÄÀÏÀ» ÀÛ¼ºÇØ ³õ°í, ±×³É make¸¸ Ä¡½Ã¸é make´Â MakefileÀÇ ³»¿ëÀ» »ìÆ캸´Ù°¡ ù ¹ø° ¸ñÇ¥ ÆÄÀÏ¿¡ ÇØ´çµÇ´Â °ÍÀ» ½ÇÇà½ÃÅ°°Ô µË´Ï´Ù. µû¶ó¼­ À§ÀÇ ¿¹Á¦¿¡¼­´Â make test ¶ó°í Çصµ °°Àº °á°ú¸¦ ³»°Ô µË´Ï´Ù. ¹Ý¸é clean¿¡ ÇØ´çÇÏ´Â ºÎºÐÀ» À­ºÎºÐ¿¡ µÎ°Ô µÇ¸é make´Â Ç×»ó make cleanÀ» ¼öÇàÇÏ°Ô µË´Ï´Ù.

% make <- make clean ÀÌ ½ÇÇàµÊ
rm -rf main.o read.o write.o test core

% make test <- °­Á¦ÀûÀ¸·Î test °¡ »ý¼ºµÇ°Ô ÇÑ´Ù.
gcc -I/home/raxis/include -g -c main.c
gcc -I/home/raxis/include -g -c read.c
gcc -I/home/raxis/include -g -c write.c
gcc -o test write.c main.o read.o write.o <- OK

MakefileÀÇ ÀÌÇظ¦ µ½±â À§Çؼ­ MakefileÀ» Çϳª ´õ ÀÛ¼ºÇØ º¸±â·Î ÇÑ´Ù. make.tex ÆÄÀÏÀ» make.dvi·Î ¸¸µç ´ÙÀ½ ÀÌ°ÍÀ» ´Ù½Ã make.ps·Î ¸¸µå´Â °ÍÀÌ´Ù. º¸ÅëÀÇ ¼ø¼­¶ó¸é ¾Æ·¡¿Í °°´Ù.

% latex make.tex <- make.dvi °¡ ¸¸µé¾îÁø´Ù.
% dvips make.dvi -o <- make.ps °¡ ¸¸µé¾îÁø´Ù.

º¸ÅëÀÇ °¡Àå °£´ÜÇÑ MakefileÀ» ÀÛ¼ºÇØ º¸¸é ¾Æ·¡¿Í °°´Ù.

Makefile¿¹Á¦ 11


make.ps : make.dvi
                dvips make.dvi -o

make.dvi : make.tex
                latex make.tex 

À§¿Í °°Àº ÀÏÀ» ÇÏ´Â MakefileÀ» ´Ù¸£°Ô Çѹø ÀÛ¼ºÇØ º¸ÀÚ. ¸ÅÅ©·Î¸¦ ¾î´ÀÁ¤µµ »ç¿ëÇØ º¸±â·Î Çϸç, È®ÀåÀÚ ±ÔÄ¢À» Çѹø Àû¿ëÇØ º¸±â·Î ÇÑ´Ù.

Makefile¿¹Á¦ 12


.SUFFIXES = .tex .dvi 

TEX = latex <- TEX ¸ÅÅ©·Î¸¦ ÀçÁ¤ÀÇ

PSFILE = make.ps 
DVIFILE = make.dvi

$(PSFILE) : $(DVIFILE)
                dvips $(DVIFILE) -o

make.ps : make.dvi 
make.dvi : make.tex

¿¹Á¦ 12 ¿¡¼­´Â .tex ¿Í .dvi ¸¦ ó¸®ÇÏ´Â ·çƾÀÌ ÀÚµ¿ÀûÀ¸·Î µ¿ÀÛÀ» ÇÏ°Ô µÈ´Ù. Makefile À» Çѹø µ¿ÀÛ½ÃÄÑ º¸ÀÚ.

% make
latex make.tex
....
dvips make.dvi -o <- OK

¿¹Á¦ 11 °ú ¿¹Á¦ 12 ´Â ÇÏ´Â ÀÏÀº °°´Ù. ÇÏÁö¸¸ ¿¹Á¦ 12´Â ¸ÅÅ©·Î¸¦ »ç¿ëÇÔÀ¸·Î½á ³ªÁß¿¡ ³»¿ëÀ» ¹Ù²Ü ¶§ ¿¹Á¦ 11º¸´Ù ÆíÇÏ´Ù´Â °ÍÀ» ÀÌÇØÇÏ¿´À¸¹Ç·Î...

´ÙÀ½Àå ¿¹°í

¹«¾ùÀΰ¡¸¦ ±Û·Î ¼³¸íÇÑ´Ù´Â °ÍÀÌ Âü Èûµå³×¿ä...

»ç½Ç ¿À´Ã ÇÑ °Í¸¸ °¡Áö°íµµ Makefile¿¡ ´ëÇÑ ¾î´À Á¤µµÀÇ Áö½ÄÀ» °®Ãß¾ú´Ù°í ¸»ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀڽŸ¸ÀÇ MakefileÀ» Çѹø ÀÛ¼ºÇØ º¸½ÃÁÒ. ÇÁ·Î±×·¥µµ ±¦Âú°í, .tex ÆÄÀÏÀ» .ps ÆÄÀÏ·Î ¸¸µå´Â °úÁ¤À» Makefile·Î ¸¸µé¾î º¸´Â °Íµµ ÁÁÀº ¿¬½ÀÀÌ µÉ °ÍÀÔ´Ï´Ù.

´ÙÀ½ Æí¿¡¼­ ¿©·¯ºÐ¿¡°Ô ¼Ò°³ÇØ µå¸± °ÍÀº make ¿É¼Ç, makefile ÀÛ¼º Áöħ(guideline), make »ç¿ë ½Ã¿¡ ³ªÅ¸³ª´Â ¿¡·¯ÀÇ ¿øÀΰú ±× ´ëó ¹æ¹ýÀÌ µÉ °Í °°±º¿ä. (¾ÆÁ÷ È®Á¤µÈ °ÍÀº ¾Æ´ÏÁö¸¸...) Makefile¿¡ °üÇÑ ÀÔ¹® °úÁ¤Àº ´ÙÀ½ ÀåÀ¸·Î ³¡³»°í, 4ÀåºÎÅÍ´Â ¾à°£ °í±Þ½º·¯¿î ±â´ÉÀ» °­ÁÂÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù. ¸¹ÀÌ Àоî ÁÖ¼¼¿ä. ´ó½º ¿´½À´Ï´Ù.


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