· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Make ±âÃÊ»ç¿ë¹ý

Make ±âÃÊ»ç¿ë¹ý

  • ÀÛ¼ºÀÚ
    Á¶ÀçÇõ(Mminzkn@minzkn.com)

  • °íÄ£°úÁ¤
    2004³â ¾î´À³¯ : óÀ½¾¸

½ÃÀÛÇϱâÀü¿¡

ÇÁ·Î±×·¡¹ÖÀ» ¹è¿ì·Á¸é ¿ì¼± "make"ÀÇ ±âº»¿ë¹ýÀÌ¶óµµ ¾Ë°í ½ÃÀÛÇÏÀÚ´Â ÁÖÀåÀ» ÇØº¾´Ï´Ù. ±× ¸¸Å­ ¸Å¿ì Áß¿äÇÑ À¯Æ¿¸®Æ¼ÀÔ´Ï´Ù. ³ª¸§´ë·Î °£ÆíÇÑ ¹®¹ý°ú °¡µ¶¼ºÀÌ ³ôÀº ¹®¹ý ¶§¹®¿¡ ¿äÁò ´ëºÎºÐÀÇ °Å´ëÇÑ °ø°³ ÇÁ·ÎÁ§Æ®µéÀº "make"¸¦ ³Î¸® »ç¿ëÇϰí ÀÖ½À´Ï´Ù. ²À ÇÁ·Î±×·¡¹ÖÀÇ ¼¼°è¿¡ ÀÔ¹®À» ÇϰíÀÚ ÇϽô ºÐµé²²¼­´Â "make"ÀÇ »ç¿ë¹ýÀ» Àû¾îµµ ±âº»¹®¹ýÀÌ¶óµµ ¾Ë°í °è¼Å¾ß ÇÕ´Ï´Ù. ±×·¡¼­ ÇÊÀÚ´Â °£·«ÇϰԳª¸¶ µµ¿òÀÌ µÇ°íÀÚ ÀÌ·¸°Ô ¹®¼­·Î ³²±é´Ï´Ù. ºÎµð ¸ÚÁø GNU °³¹ßÀÚ°¡ µÇ½Ã±æ ¹Ù¶ø´Ï´Ù.

Make ÀÇ ¸ñÀû

¿ì¸®°¡ ÀϹÝÀûÀ¸·Î °³¹ßÇÏ°í °ü¸®ÇÏ´Â ÇϳªÀÇ ÇÁ·ÎÁ§Æ®´Â C source¸¦ ÄÄÆÄÀÏÇÏ¿© Object ÆÄÀÏÀ» ¸¸µé°í ÀÌ·¯ÇÑ Object ¸î°³¸¦ ¹­¾î¼­ ¸µÅ©(Link)°úÁ¤À» °ÅÃļ­ ÃÖÁ¾ ¸ñÀûÀÎ ½ÇÇàÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù. À̶§ »ç¿ëÇÏ´Â ¸í·ÉÀº ´ÙÀ½°ú °°°ÚÁÒ. ¾Æ~ ¹«Áö ±æ´Ù~!
bash# cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c 
bash# ls 
test.c test.o 
bash# ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o 
bash# ./test 
Hello world ! 
bash# _ 


¼Ò½ºÀÇ ³»¿ëÀ» Á¶±Ý¸¸ ¼öÁ¤Çصµ ÀÌ °úÁ¤Àº ¹Ýº¹µÇ¾î¾ß ÇÕ´Ï´Ù. Âü~~~ ¹ø°Å·Î¿î ÀÏÀÌ ¿ì¸®ÀÇ ¾Õ±æ?¸·°í ÀִµíÇÑ ´À³¦ÀÔ´Ï´Ù. ±×·¡¼­ À̸¦ ½±°Ô °£·«È­ ÇØÁÖ´Â À¯Æ¿¸®Æ¼°¡ ź»ýÇߴµ¥ "make" °¡ ¹Ù·Î ±×°ÍÀÔ´Ï´Ù. ½ÇÁ¦·Î "make"ÀÇ ¸î¸î ±â´É¸¸ »ç¿ëÇϸé À§ÀÇ ¹®Á¦´Â ½±°Ô ÇØ°áµÇÁö¸¸ ±× ¹Û¿¡ ´ë±Ô¸ð ÇÁ·ÎÁ§Æ®¿¡¼­ °ÞÀ»¼ö ÀÖ´Â ºÒÆíÇÔÀ» ÇØ¼ÒÇØÁÙ¼ö ÀÖ´Ù´Â Á¡ÀÌ º¸´Ù ¸Å·ÂÀ¸·Î ´Ù°¡¿Ã°ÍÀÔ´Ï´Ù.

±âº»±ÔÄ¢

"make"´Â Å©°Ô Target, Depend, Command, Macro ·Î ±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù. ¿ì¼± ±âº»ÀûÀ¸·Î Target, Depend, Command ÀÇ ±¸¼ºÀ» »ìÆìº¸°Ú½À´Ï´Ù.
<Target>: <Depend> ?... [[;] <Command>] 
<Åǹ®ÀÚ><Command> 


¿©±â¼­ "Target"Àº »ý¼ºÇϰíÀÚ ÇÏ´Â ¸ñÀû¹°À» ÁöĪÇϸç Depend ´Â TargetÀ» ¸¸µé±â À§Çؼ­ ÇÊ¿äÇÑ ¿ä¼Ò¸¦ ±â¼úÇÏ°Ô µË´Ï´Ù. ±×¸®°í Command ´Â ÀÏ¹Ý Shell ¸í·ÉÀÌ ¿É´Ï´Ù. À̶§ Command´Â Depend ÀÇ ÆÄÀÏ»ý¼º½Ã°£(¶Ç´Â º¯°æµÈ ½Ã°£)À» Target°ú ºñ±³ÇÏ¿© Target º¸´Ù DependÀÇ ÆÄÀÏÀÌ ½Ã°£ÀÌ º¸´Ù ÃÖ±ÙÀÎ °æ¿ì·Î ÆÇ´ÜµÉ¶§¿¡¸¸ ½ÇÇàµË´Ï´Ù. ¹°·Ð À̰Ϳ¡ ´ëÇÑ ¿¹¿ÜÀûÀÎ ±ÔÄ¢ÀÌ ÀÖ½À´Ï´Ù¸¸ ÀÏ´Ü ¹«½ÃÇÏ°í ¹Þ¾ÆµéÀ̼¼¿ä. ÀÌÁ¦ °£´ÜÈ÷ ´ÙÀ½°ú °°ÀÌ "Makefile" À̶ó´Â ÆÄÀϸíÀ¸·Î ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ¿© "make"ÀÇ ÇൿÀ» ±â¼úÇÕ´Ï´Ù. ´Ü, ÁÖÀÇÇÒ°ÍÀº Command ´Â ¹Ýµå½Ã ¾Õ¿¡ <TAB>¹®ÀÚ°¡ ¿Í¾ß ÇÕ´Ï´Ù. ¹°·Ð ¿¹¿Ü»óȲÀÌ ÀÖ±â´Â ÇÏÁö¸¸ ³ªÁß¿¡ ±×¿¡ ´ëÇÑ ³»¿ëÀ» ´Ù·ç±â·Î Çϰí ÀÏ´Ü ld, cc ¸í·É ¾Õ¿¡ ¹Ýµå½Ã <TAB>¹®ÀÚ·Î ÀÔ·ÂÇϼ¼¿ä.
test: test.o 
        ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o 

test.o: test.c 
        cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c 


ÀÌÁ¦ ¸í·ÉÇÁ·ÒÇÁÆ®»ó¿¡¼­ "make test" ¶ó°í¸¸ ÀÔ·ÂÇÏ¸é ´ÙÀ½°ú °°ÀÌ ½ÇÇàµË´Ï´Ù.
bash# make test 
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c 
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o 
bash# _ 


¾ù? ±×·±µ¥ ´Ù½Ã ½ÇÇàÇØº¸½Ã¸é ³î¶ø°Ôµµ ÀÌ·± ¸Þ¼¼Áö°¡ ³ª¿Ã°Ì´Ï´Ù. À̰ÍÀÌ ¹Ù·Î "make" ÀÇ Áß¿äÇÑ ±â´ÉÁß¿¡ ÇѰ¡Áö ÀÔ´Ï´Ù. ¹Ù·Î ¶È°°Àº ÀÛ¾÷Àº ´Ù½Ã ÇØºÃÀÚ ¾îÂ÷ÇÇ °á°ú°¡ °°À»°ÍÀ̶ó´Â ¿¹»ó¶§¹®¿¡ ´õÀÌ»ó °°Àº ÀÛ¾÷À» ÇÏÁö ¾Ê´Â °ÍÀÌÁö¿ä.
bash# make test 
make: `test'´Â ÀÌ¹Ì °»½ÅµÇ¾ú½À´Ï´Ù. 
bash# _ 


±×·¯¸é °£´ÜÈ÷ ´ÙÀ½°ú °°ÀÌ "test.c" ÀÇ º¯°æ³¯Â¥¸¦ ¹Ù²ãº¾½Ã´Ù. ±×¸®°í ´Ù½Ã Çѹø "make test"¸í·ÉÀ» ¼öÇàÇØº¾½Ã´Ù. ¾î¶»½À´Ï±î? À̹ø¿¡´Â ´Ù½Ã ¸í·ÉÀ» ¼öÇàÇϴ°ÍÀ» º¸½Ç¼ö ÀÖÀ»°Ì´Ï´Ù.
bash# touch test.c 
bash# make test 
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c 
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o 
bash# _ 


ÀÌÁ¦ õõÈ÷ ºÐ¼®Çغ¸ÀÚ¸é Target º¸´Ù DependÀÇ º¯°æ½Ã°£ÀÌ ÃÖ±ÙÀ̶ó¸é Command ¸¦ ¼öÇàÇÑ´Ù°í ÇÏ¿´½À´Ï´Ù. ±×·¡¼­ "test" ¶ó´Â TargetÀÌ "test.o" ¿¡ ÀÇÁ¸°ü°è¸¦ °®°í Àִµ¥ "test.o"´Â ´Ù½Ã TargetÀ¸·Î ±â¼úµÇ¾î ÀÖ°í ¿©±â¿¡ "test.c"°¡ ÀÇÁ¸°ü°è·Î ±â¼úµÇ¾î ÀÖ½À´Ï´Ù. ¶§¹®¿¡ "test.c"°¡ ÃÖ±Ù¿¡ º¯°æµÇ¾î "test.o"º¸´Ù º¯°æµÈ ³¯Â¥°¡ ÃÖ±ÙÀÌ µÇ¸é "test.o"¸¦ »õ·Î »ý¼ºÇÏ°Ô µË´Ï´Ù. ¶ÇÇÑ "test.o"´Â "test"º¸´Ù ÃÖ±Ù¿¡ º¯°æµÈ°ÍÀ¸·Î º¸À̹ǷΠ"test"´Â "test.o"¿¡ ÀÇÇØ¼­ »õ·Î »ý¼ºµÇ´Â °á°ú¸¦ °¡Á®¿É´Ï´Ù. °á±¹ ¼Ò½º°¡ º¯°æµÇÁö ¾ÊÀ¸¸é "make"´Â ¾Æ¹«°Íµµ ¾ÈÇÏÁö¸¸ ¼Ò½º°¡ º¯°æµÇ¸é(º¯°æµÈ ³¯Â¥°¡ °»½ÅµÇ¸é) "test"´Â »õ·Ó°Ô ºôµåµÇ´Â °ÍÀÔ´Ï´Ù. ÀÌÁ¦ ´ëÃæ ÀÇÁ¸°ü°è ¼º¸³À» ¾î¶»°Ô ±â¼úÇÏ´ÂÁö º¸¾Ò½À´Ï´Ù. ÇÏÁö¸¸ ÀÌ·¸°Ô ÀÛ¼ºÇÏ¸é ¿ÀÈ÷·Á ´õ ºÒÆíÇÏ´Ù°í ºÒ¸¸À» ÅäÇÏ´Â ºÐµéÀÌ ¼ÓÃâÇÒ°ÍÀÔ´Ï´Ù. ±×·¸½À´Ï´Ù. ½ÇÁ¦·Î´Â Àú·¸°Ô ÀÛ¼ºÇÏ´Â °æ¿ì´Â º°·Î ¾²ÀÌÁö ¾Ê½À´Ï´Ù. Á¶±Ý´õ ¼¼·ÃµÇ°Ô ÀÛ¼ºÇϵµ·Ï Macro ÀÇ »ç¿ëÀÌ ÁغñµÇ¾î ÀÖÀ¸´Ï ºÒ¸¸Àº ÀÌÁ¦ ±×¸¸ Çϼ¼¿ä.

Macro

¸ÅÅ©·Î´Â ´ÙÀ½°ú °°ÀÌ "=" ¹®ÀÚÀÇ ¿ÞÆí¿¡´Â MacroÀÇ ´ëÇ¥À̸§(Label)À» ±â¼úÇÏ°í ¿À¸¥Æí¿¡´Â ±× ³»¿ëÀ» Àû½À´Ï´Ù. À̶§ "=" ¹®ÀÚ¿¡ ÀÎÁ¢ÇÑ ¾çÂÊÀÇ °ø¹é(Space)¹®ÀÚ´Â ¹«½ÃµË´Ï´Ù. À̰ÍÀº ¸Å¿ì ±âº»ÀûÀÎ Macro¸¦ ¿¹±âÇϴ°ÍÀ̸ç ÀÌ ¹Û¿¡µµ ¸î°¡Áö È®ÀåµÈ Macro °¡ ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ÀÏ´Ü ±×°ÍÀº ³ªÁß¿¡ ¿¹±âÇϵµ·Ï ÇϰڽÀ´Ï´Ù.
<Macro name> = <Macro ³»¿ë> 


ÀÚ! ÀÌÁ¦ °£´ÜÈ÷ ´ÙÀ½°ú °°ÀÌ Á¶±Ý °³¼±Çؼ­ "Makefile"À» ÀÛ¼ºÇغ¸°Ú½À´Ï´Ù.
CC = cc 
LD = ld 
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c 
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 

test: test.o 
        $(LD) $(LDFLAGS) -o test $(STARTUP) test.o 

test.o: test.c 
        $(CC) $(CFLAGS) -o test.o test.c 


¿©±â¼­ Çϳª¸¸ »ìÆìº»´Ù¸é "CC = cc" ¶ó°í ¸ÅÅ©·Î ¼±¾ðÀ» º¸¸é "CC"¶ó´Â ¸ÅÅ©·Î¸íÀº "cc"¶ó´Â ¸í·É¾î·Î Á¤Àǵ˴ϴÙ. À̰ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â "$"±âÈ£µÚ¿¡ °ýÈ£"("°ú ")"À» µÎ°í ±× ¾È¿¡ ¸ÅÅ©·Î À̸§À» ³Ö¾î »ç¿ëÇÕ´Ï´Ù. Áï, "$(CC)" ´Â "cc"·Î ÇØ¼®µË´Ï´Ù. ÇÏÁö¸¸ ¾ÆÁ÷µµ À̰ÍÀÌ ³Ê¹« º¹ÀâÇÏ´Ù´Â ºÒ¸¸À» °¡Áö½ÅºÐÀÌ °è½Ç°Ì´Ï´Ù. "make"´Â ±×·¡¼­ ±âº» È®ÀåÀÚ ±ÔÄ¢À̶ó´Â ¹æ¹ýµµ Áö¿øÇϰí ÀÖ½À´Ï´Ù.

±âº» È®ÀåÀÚ ±ÔÄ¢

¿ì¸®´Â º¸Åë C source¸¦ ¸ñÀûÆÄÀÏ·Î ÄÄÆÄÀÏÇÕ´Ï´Ù. À̰ÍÀº È®ÀåÀÚ°¡ Åë»ó ".c"¿¡¼­ ".o"¸¦ ¸¸µé¾î ³»´Â ±ÔÄ¢ÀÌ »ý¼ºµÉ¹ý ÇÕ´Ï´Ù. "make"´Â ÀÌÁ¡¿¡ Âø¾ÈÇÏ¿© ´ÙÀ½°ú °°Àº È®ÀåÀÚ ±ÔÄ¢À» ÀÌ¿ëÇÒ¼ö ÀÖ½À´Ï´Ù. ¹°·Ð À̰ÍÀº ÇѰ¡Áö ¹æ¹ýÀÏ »ÓÀ̸ç ÀÌ ¹Û¿¡µµ ¸î°¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.
.c.o: 
        $(CC) $(CFLAGS) -o $@ $< 


ÀÌÁ¦ ¿©±â¼­ »õ·Ó°Ô µîÀåÇÑ "$@"¿Í "$^", "$<" ÀÇ Àǹ̸¦ ¿¹±âÇÒ¶§°¡ ¿Ô½À´Ï´Ù. À̰ÍÀº "make"ÀÇ ±âº» Á¤ÀÇµÈ MacroÁß¿¡ ÇѰ¡Áö ÀÔ´Ï´Ù. "$@" ¶Ç´Â "$(@)"´Â ¹Ù·Î Target À» ¸»ÇÕ´Ï´Ù. ±×¸®°í "$<"´Â ¿­°ÅµÈ DependÁß¿¡ °¡Àå ¿ÞÂÊ¿¡ ±â¼úµÈ 1°³ÀÇ Depend¸¦ ¸»Çϸç "$^"´Â Depend Àüü¸¦ ÀǹÌÇÕ´Ï´Ù. À̰ÍÀº ¾ÕÀ¸·Îµµ "make"¸¦ »ç¿ëÇϴµ¥ À־ ±²ÀåÈ÷ ¸¹Àº ºÎºÐ ±â¿©ÇÏ´Â ¸ÅÅ©·ÎÀ̹ǷΠ´«¿©°Ü º¸¼Å¾ß ÇÒ ºÎºÐÀÔ´Ï´Ù. ÀÌ ¹Û¿¡µµ "$?" ·Î Àִµ¥ À̰ÍÀº Target°ú DependÀÇ º¯°æ³¯Â¥¸¦ ºñ±³ÇÏ¿© DependÀÇ º¯°æ³¯Â¥Áß¿¡ ÃÖ±Ù¿¡ º¯°æµÈ°Í¸¸ ¼±ÅÃÇÏ´Â ¸ÅÅ©·ÎÀÔ´Ï´Ù. "$?"´Â ÁÖ·Î ¶óÀ̺귯¸®ÀÇ »ý¼º ¹× °ü¸®½Ã¿¡ »ç¿ëµÇ´Âµ¥ ³ªÁß¿¡ ½Ã°£µÇ¸é ¼³¸íÇϰڽÀ´Ï´Ù. À§ÀÇ ±â¼úÀº È®ÀåÀÚ ".c"¸¦ °¡Áø ÆÄÀÏÀ» È®ÀåÀÚ ".o"¸¦ °¡Áø ÆÄÀÏ·Î »ý¼ºÇÏ´Â °øÅëÀûÀÎ È®ÀåÀÚ ±ÔÄ¢À» ¿¹·Î ÀÛ¼ºÇÑ °ÍÀÔ´Ï´Ù. Çѹø »ç¿ëÇØº¼±î¿ä?
CC = cc 
LD = ld 
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c 
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 

test: test.o 
        $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ 

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


ÀÌ°Ô ".c.o" ´Â .c ¸¦ .o·Î ¸¸µé¾î º¸ÀÚ´Â ³»¿ëÀÔ´Ï´Ù. ±×¸®°í "$<"´Â .c ¿¡ ÃëÇØÁö´Â ¼Ò½ºÆÄÀϸíÀÎ "test.c"·Î ´ëüµË´Ï´Ù. ¶ÇÇÑ "$@"´Â TargetÀÎ "test.o"·Î ´ëÄ¡µÉ°ÍÀÔ´Ï´Ù.

°¡Â¥ target

ÀÌÁ¦ Áö±Ý±îÁö ÀÛ¼ºÇÑ "Makefile"À» »ç¿ëÇØº¸¸é ÇѰ¡Áö ºÒÆíÇÑ Á¡À» ´À³¤ ºÐµéÀÌ °è½Ç°Ì´Ï´Ù. "test.c"·Î "test.o"¸¦ ¸¸µé°í "test.o"·Î "test"¸¦ ¸¸µéµµ·Ï ÀÛ¼ºÇÏ¿´Áö¸¸ ¼Ò½ºÆÄÀÏÀÇ ¼öÁ¤ÀÌ ¾ø´Â °æ¿ì Ç×»ó "make"´Â ´õÀÌ»óÀÇ ÄÄÆÄÀÏ ¹× ¸µÅ©°úÁ¤À» ÇÏÁö ¾Ê´Â Á¡ÀÔ´Ï´Ù. ¶§¹®¿¡ °£È¤ ´Ù½Ã ±ú²ýÈ÷ ºôµåÇÏ°í ½ÍÀ»¶§ "touch test.c"¸¦ ¼öÇàÇϰųª "rm test.o test" ¸¦ ¼öÇàÇØ¾ß ÇÕ´Ï´Ù. ÀÌ°Í ¿ª½Ã ¸Å¿ì ºÒÆíÇÕ´Ï´Ù. À̸¦ ÇØ¼ÒÇϰíÀÚ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÉ¼ö ÀÖ°Ú½À´Ï´Ù.
CC = cc 
LD = ld 
RM = rm -f 
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c 
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 

clean: 
        $(RM) test.o test 

test: test.o 
        $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ 

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


»õ·Î¿î Target ÀÎ "clean"ÀÌ º¸ÀÔ´Ï´Ù. ±×·±µ¥ Target "clean"¿¡ ´ëÇÑ Depend°¡ ¾ø½À´Ï´Ù. ÀÌ·¸°Ô Depend °¡ ¾øÀ¸¸é "clean"¿¡ ±â¼úµÈ ¸í·É "$(RM) test.o test"´Â Ç×»ó ½ÇÇàµÇ¸ç À̰ÍÀº ½ÇÁ¦·Î "clean"À̶ó´Â ÆÄÀÏÀÌ ¾ø½À´Ï´Ù. ¶§¹®¿¡ À̰ÍÀ» °¡Â¥ Target À̶ó°í ÇÕ´Ï´Ù. ÀÌÁ¦ "make clean" ÇϽðí "make test"ÇϽøé Ç×»ó ´Ù½Ã ºôµåÇϴ°ÍÀ» º¼¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ¸¸¾à cleanÀ̶ó´Â ½ÇÇàÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù¸é ¿ì¸®°¡ ¿øÇÏÁö ¾Ê´Â °á°ú°¡ ³ª¿Ã¹ýµµ ÇÕ´Ï´Ù. ¹°·Ð °ÅÀÇ ´ëºÎºÐ "clean"À̶ó´Â ½ÇÇàÆÄÀÏÀ» ¸¸µéÁö ¾Ê°ÚÁö¸¸ ¿ì¸®´Â ¿©±â¼­ "make"¿¡¼­ Target "clean"´Â °¡Â¥ Target À̶ó°í ¸íÈ®È÷ Àü´ÞÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¹°·Ð ºÒÇÊ¿äÇÑ °æ¿ì°¡ ´ëºÎºÐÀÇ °æ¿ìÁö¸¸ ±×·¡µµ ½À°üÀûÀ¸·Î ¸í½ÃÇØÁÖ´Â°Ô ÁÁ½À´Ï´Ù.
CC = cc 
LD = ld 
RM = rm -f 
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c 
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 

.PHONY: all clean 

all: test 

clean: 
        $(RM) test.o test 

test: test.o 
        $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ 

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


ÀÚ! ¿©±â¼­ »õ·Î¿î Target ÀÎ ".PHONY" °¡ º¸ÀÔ´Ï´Ù. À̰ÍÀº "make"±¸¹®¿¡¼­ ¿¹¾àµÈ Target Áß¿¡ ÇϳªÀ̸ç ".PHONY"¿¡ ¸í½ÃµÈ Depend ´Â ¸ðµÎ °¡Â¥ TargetÀ¸·Î º¸°Ô µË´Ï´Ù. ±×¸®°í ¿©±â¼­ "all"À̶ó´Â TargetÀÌ Ãß°¡µÇ¾ú½À´Ï´Ù. À̰ÍÀº ¸Å¿ì °ü½ÀÀûÀÎ Target À¸·Î º¸Åë ÃÖ»ó´Ü¿¡ "all"°ú "clean"ÀÌ À§Ä¡ÇÏ°Ô µË´Ï´Ù. ²À ÀÌ·¸°Ô ÇØ¾ß ÇÏ´Â°Ô ¾Æ´Ï°í Åë»óÀûÀÎ °ü½ÀÀ̹ǷΠ¹Ýµå½Ã µû¸¦ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ´Ù¸¸ ´Ù¸¥ »ç¶÷µéµµ ÇÔ²² ÀÛ¾÷ÇÏ´Â ÇÁ·ÎÁ§Æ®¿¡¼­ ÅëÀϼºÀ» ºÎ¿©Çϱâ À§Çؼ­ ÀÌ·¸°Ô ¸¹À̵é ÀÛ¼ºÇÏ°Ô µË´Ï´Ù. À§ÀÇ ¿¹Á¦¿¡¼­ Target "all"Àº ½ÇÁ¦·Î "all"À̶ó´Â ÆÄÀÏÀ» »ý¼ºÇϴ°ÍÀÌ ¾Æ´Ï°í ´ÜÁö "¹«¾ùÀÌ ÃÖÁ¾ TargetÀÌ´Ù" ¶ó´Â ¾Ï½ÃÀûÀÎ °¡Â¥ TargetÀÌ µÇ¸ç "clean"Àº "¹«¾ùÀ» ±ú²ýÀÌ Á¤¸®ÇϰڴÙ" ¶ó´Â ¾Ï½ÃÀûÀÎ °¡Â¥ TargetÀÌ µË´Ï´Ù. ÀÌÁ¦ ¿ì¸®´Â "make test"´ë½Å¿¡ "make all"À» »ç¿ëÇÏ°Ô µÉ¼ö ÀÖ½À´Ï´Ù. À̶§ "all"ÀÇ Depend·Î "test"°¡ ºôµåµÉ°ÍÀÔ´Ï´Ù. ¶ÇÇÑ "clean"Àº °ü·ÃµÈ ÆÄÀÏÀ» Á¤¸®Çϴ°ÍÀ¸·Î ¿ëµµ°¡ Á¤ÇØÁý´Ï´Ù. À̶§ "."À¸·Î ½ÃÀÛÇÏ´Â TargetÀ» Á¦¿ÜÇÏ°í °¡Àå óÀ½ ³ª¿À´Â TargetÀº "make <target>" ¿¡¼­ <target>À» »ý·«Çصµ ¹«°üÇÏ°Ô µË´Ï´Ù. ¶§¹®¿¡ ".PHONY"¸¦ Á¦¿ÜÇÑ "all"ÀÌ °¡Àå óÀ½ ³ª¿À´Â TargetÀ̰í ÀÌÁ¦ºÎÅÍ´Â "make all"ÀÌ ¾Æ´Ï°í ±×³É "make"¸¸ ÀÔ·ÂÇØµµ µÈ´Ù´Â °Ì´Ï´Ù.

ÀÀ¿ë

ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ 4°³ÀÇ ÆÄÀÏÀ» ÀÛ¼ºÇÏ¿© ÇϳªÀÇ ÇÁ·ÎÁ§Æ®¸¦ ÀÛ¼ºÇÏ¿´´Ù°í ÇսôÙ.

hello.c
#include <stdio.h> 

void HelloWorld(void) 
{ 
    fprintf(stdout, "Hello world.\n"); 
} 


test.c
#include <stdio.h> 
#include "hello.h" 

int main(void) 
{ 
    HelloWorld(); 
    return(0); 
} 


hello.h
extern void HelloWorld(void); 


Makefile
CC = cc 
LD = ld 
RM = rm -f 
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -v -c 
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 

BUILD = test 
OBJS = test.o hello.o 

.PHONY: all clean 

all: $(BUILD) 
clean: ; $(RM) *.o $(BUILD) 
test: $(OBJS) ; $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ 

# ÀÇÁ¸°ü°è ¼º¸³ 
hello.o: $($@:.o=.c) $($@:.o=.h) Makefile 
test.o: $($@:.o=.c) hello.h Makefile 

# È®ÀåÀÚ ±ÔÄ¢ (ÄÄÆÄÀÏ °øÅë ±ÔÄ¢) 
.c.o: ; $(CC) $(CFLAGS) -o $@ $< 


ÀÚ! ÀÌÁ¦ ÀÌ 4°³ÀÇ ÆÄÀÏ·Î ¾î¶² ÀÓÀÇÀÇ ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¾ú½À´Ï´Ù. ¾ù? ±Ùµ¥ Á¶±Ý ÀÌ»óÇÑ ºÎºÐÀÌ º¸ÀÌÁÒ? ÇÏÁö¸¸ À̰ÍÀº ¸Å¿ì Àß µ¿ÀÛÇÏ´Â "Makefile"ÀÔ´Ï´Ù. ÀÌÁ¦ "make clean" ÈÄ¿¡ "make" ¸í·ÉÀ» ÀÔ·ÂÇϸé Á¶¿ëÈ÷ ÄÄÆÄÀÏÀ» ÇÏ°Ô µÉ°Ì´Ï´Ù. ±×¸®°í make °¡ ¾î¶² È®ÀåÀ» º¸ÀÌ´ÂÁö ±Ã±ÀÇÏ´Ù¸é "make -p" ¸í·ÉÀ» ÅëÇØ¼­ "-p"¿É¼ÇÀ» »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù. ²Ï ¸¹Àº ¸Þ¼¼Áö¸¦ È®ÀÎÇÒ¼ö ÀÖÀ»°Ì´Ï´Ù. ¾ÕÀ¸·Îµµ "-p"¸¦ ÀÌ¿ëÇϸé make °¡ ¾î¶² È®ÀåÀ» º¸ÀÌ´ÂÁö È®Àΰ¡´ÉÇÏ´Ï ³¬½ÃÇÏ´Â ¹ýÀ» ¹è¿î¼ÀÀÔ´Ï´Ù.

À§¿¡¼­ "$($@:.o=.c)" ¶ó´Â ÀÌ»óÇÑ ¹®ÀÚ¿­ÀÌ Á» ¸¶À½¿¡ ¾Èµé°Ì´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀº ¸Å¿ì ÇÔÃàÀûÀÎ ¸ÅÅ©·ÎÀÌ¸ç ¸¹ÀÌµé ¾Ö¿ëÇϰí ÀÖ´Â °Ì´Ï´Ù. ´ë·« ´ÙÀ½°ú °°Àº Çü½ÄÀ» »ç¿ëÇÕ´Ï´Ù. "$(<¹®ÀÚ¿­>:<¿ìÃøÀ¸·ÎºÎÅÍ ¸ÅĪµÉ ¹®ÀÚ¿­>=<ġȯµÉ ¹®ÀÚ¿­>)" À̰ÍÀº Áï, "$@" ºÎºÐÀº ÀÚ½ÅÀÇ TargetÀÎ "hello.o" ¶Ç´Â "test.o"¸¦ ¸»ÇÕ´Ï´Ù. ±×¸®°í °Å±â¼­ ¿ìÃøÀ¸·ÎºÎÅÍ ".o"°¡ ¹ß°ßµÇ¸é ".c"·Î ġȯÇ϶ó´Â ¶æÀÔ´Ï´Ù. Áï, "$(hello.o:.o=.c)" ¶Ç´Â "$(test.o:.o=.c)"·Î È®ÀåµÇ°í ¿©±â¼­ ´Ù½Ã °¢°¢ "hello.c" ¿Í "test.c"·Î ġȯµÇ¾î °á±¹ ÇØ´ç ¼Ò½º¸¦ ÁöĪÇÏ°Ô µÇ´Â ¼ÀÀÔ´Ï´Ù.

±×¸®°í Command ºÎºÐÀÌ <TAB>ÀÌ ¾²ÀÌÁö ¾Ê°í ÇÑÁÙ¿¡ ";"(¼¼¹ÌÄÝ·Ð)À¸·Î ºÐ¸®µÇ¾î¼­ ÇØ´ç ¶óÀο¡ Á÷Á¢ Command °¡ ¾²ÀÌ´Â °ÍÀ» È®ÀÎÇϽǼö ÀÖÀ»°Ì´Ï´Ù. ¹«Áö °Å´ëÇÑ "Makefile"À» °£·«È÷ º¸ÀÌ°Ô Çϱâ À§Çؼ­ ÀÌ·¸°Ôµµ »ç¿ëÇÒ¼ö ÀÖ´Ù´Â °ÍÀ» ¿¹·Î º¸ÀΰÍÀÔ´Ï´Ù. ÀÇÁ¸°ü°è¸¦ ¼º¸³ÇÏ´Â ºÎºÐÀº Command °¡ ¾ø´Â°ÍÀ» º¼¼ö Àִµ¥ À̰ÍÀº ºñ½ÁÇÑ ´Ù¸¥ Target¿¡¼­ Command °¡ °áÇÕµÇ¾î ¼öÇàµÉ¼ö ÀÖ°í ¿©±â¼­´Â ".c.o: ; ..." ºÎºÐÀÇ Command °¡ °áÇյ˴ϴÙ. ¿©±â¼­ ÀÇÁ¸°ü°è¸¦ ÃÖ´ëÇÑ ÀÚ¼¼ÇÏ°Ô ±â¼úÇÏ¿´´Âµ¥ ¸¸¾à "hello.h" °¡ º¯°æµÈ´Ù¸é "hello.o"¿Í "test.o"´Â ´Ù½Ã ºôµåµÉ°ÍÀÔ´Ï´Ù. ¶ÇÇÑ "Makefile" µµ ¼öÁ¤µÇ¸é ´Ù½Ã ºôµåµÉ°ÍÀ̶ó´Â °ÍÀÌ ¿¹»óµË´Ï´Ù. ÀÌó·³ ÀÇÁ¸°ü°è¸¦ µû·Î ±â¼úÇÏ´Â ÀÌÀ¯´Â Â÷ÈÄ¿¡ ¿©·¯ºÐµéÀÌ »ç¿ëÇϽôٺ¸¸é ÀÌÀ¯¸¦ ¾Ë°Ô µÉ°Ì´Ï´Ù. ÀÇÁ¸°ü°è¶ó´Â°Ô ¼­·Î ±²ÀåÈ÷ À¯±âÀûÀ¸·Î °É¸®´Â °æ¿ì°¡ ¸¹±â ¶§¹®¿¡ º¸´Ù º¸±â ÆíÇÏ°Ô ÇÏ´Â ÀÌÀ¯µµ ÀÖ°í Â÷ÈÄ¿¡ ÀÇÁ¸°ü°è°¡ º¯°æµÇ¾úÀ»¶§ ½±°Ô ã¾Æ¼­ º¯°æÀ» ÇÒ¼ö ÀÖµµ·Ï Çϴ°͵µ ÇѰ¡Áö ÀÌÀ¯ÀÔ´Ï´Ù.

¾ÆÁÖ Á¶±Ý¸¸ °øÅëÀûÀÎ ÀÇÁ¸°ü°è¸¦ Á¤¸®Çؼ­ ÀÛ¼ºÇÑ´Ù¸é ´ÙÀ½°ú °°À̵µ ÀÛ¼ºÇÒ¼ö ÀÖ½À´Ï´Ù. ¹Ù·Î TargetÀÌ Çѹø¿¡ 2°³ ÀÌ»óÀÌ Á¤Àǵɼöµµ ÀÖ´Ù´Â °Ì´Ï´Ù.
CC = cc 
LD = ld 
RM = rm -f 
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -v -c 
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 

BUILD = test 
OBJS = test.o hello.o 

.PHONY: all clean 

all: $(BUILD) 
clean: ; $(RM) *.o $(BUILD) 
test: $(OBJS) ; $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ 

# ÀÇÁ¸°ü°è ¼º¸³ 
$(OBJS): $($@:.o=.c) hello.h Makefile 
# test.o hello.o: $($@:.o=.c) hello.h Makefile 

# È®ÀåÀÚ ±ÔÄ¢ (ÄÄÆÄÀÏ °øÅë ±ÔÄ¢) 
.c.o: ; $(CC) $(CFLAGS) -o $@ $< 


Åä·Ð¹× Àâ´ã

Á¶±Ý¾¿ "make"¹®¹ýÀ» ÀÍÈú¶§¸¶´Ù ¿ØÁö ¾Ïȣȭ °°Àº ³¿»õ°¡ ³ªÁö¸¸ °á±¹ ³ªÁß¿¡ »ç¿ëÇÏ´Ù º¸¸é ±²ÀåÈ÷ À¯¿ëÇÕ´Ï´Ù. ÀÏ´Ü ÁÖÀÇÇÒ°ÍÀº µÇµµ·ÏÀ̸é Depend ´Â ÃÖ´ëÇÑ ÀÚ¼¼È÷ °É¾îÁÖ¸é ÁÁ´Ù´Â Á¡À» °­Á¶Çϸ鼭 À̸¸ ¸¶Ä¡°Ú½À´Ï´Ù. ºñ·Ï ÀÌ ¹®¼­´Â ¸ðµç "make"¹®¹ýÀ» ´Ù·çÁö´Â ¸øÇÏ¿´Áö¸¸ ¸Å¿ì ±âº»ÀûÀÎ "make"ÀÇ ±â´ÉÀ» ÀÍÈ÷´Âµ¥ ¸ñÀûÀ» °¡Áö°í ÀÛ¼ºÇÏ¿´°í »ç½Ç»ó ÈξÀ ¸¹Àº ±â´ÉÀÌ ÀÖ´Ù´Â Á¡À» ²À ¿°µÎÇØµÎ½Ã°í ¿¬±¸Çغ¸¼¼¿ä.




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-06-25 06:42:07
Processing time 0.0829 sec