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

1.1. ½ÃÀÛÇϱâÀü¿¡

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

1.2. 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"ÀÇ ¸î¸î ±â´É¸¸ »ç¿ëÇϸé À§ÀÇ ¹®Á¦´Â ½±°Ô ÇØ°áµÇÁö¸¸ ±× ¹Û¿¡ ´ë±Ô¸ð ÇÁ·ÎÁ§Æ®¿¡¼­ °ÞÀ»¼ö ÀÖ´Â ºÒÆíÇÔÀ» ÇؼÒÇØÁÙ¼ö ÀÖ´Ù´Â Á¡ÀÌ º¸´Ù ¸Å·ÂÀ¸·Î ´Ù°¡¿Ã°ÍÀÔ´Ï´Ù.

1.3. ±âº»±ÔÄ¢

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


ÀϹÝÀûÀÎ makeµéÀº ÀÌ·¯ÇÑ ±âº»±ÔÄ¢À» Æ÷ÇÔÇÑ ³»¿ëÀ» ÆÄÀϸí "makefile"°ú "Makefile"¿¡¼­ ±âº»ÀûÀ¸·Î ã¾Æ¼­ À̸¦ Çؼ®ÇÏ°Ô µË´Ï´Ù. (GNU make´Â "GNUmakefile" À» ¿ì¼± ã½À´Ï´Ù.) ±× ¹Û¿¡ ´Ù¸¥ ÆÄÀϸíÀ¸·Î make¸¦ ÀÛ¼ºÇÏ·Á¸é "-f <makeÆÄÀÏ>" ¿É¼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿©±â¼­ "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 ÀÇ »ç¿ëÀÌ ÁغñµÇ¾î ÀÖÀ¸´Ï ºÒ¸¸Àº ÀÌÁ¦ ±×¸¸ Çϼ¼¿ä.

1.4. 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"´Â ±×·¡¼­ ±âº» È®ÀåÀÚ ±ÔÄ¢À̶ó´Â ¹æ¹ýµµ Áö¿øÇÏ°í ÀÖ½À´Ï´Ù.

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

¿ì¸®´Â º¸Åë 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"·Î ´ëÄ¡µÉ°ÍÀÔ´Ï´Ù.

1.6. °¡Â¥ 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"¸¸ ÀÔ·ÂÇصµ µÈ´Ù´Â °Ì´Ï´Ù. ±×¸®°í "clean"¿¡¼­ $(RM) ¸í·É ¾Õ¿¡ ´ë½¬(-) ¹®ÀÚ°¡ ¿Àµµ·Ï ÇÏ¿´´Âµ¥ ÀÌ°ÍÀº rm¸í·É¾î¿¡¼­ ¿¡·¯¸¦ ¹ÝȯÇÏ´Â °æ¿ì ¹«½ÃÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿© °è¼Ó ÁøÇàÇϵµ·Ï ÇÒ¼ö ÀÖ°Ô ÇÕ´Ï´Ù. Áï, ¿¡·¯ ¹ÝȯÀ» ¹«½ÃÇϵµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù.

1.7. ÀÀ¿ë

ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ 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 $@ $<


1.8. ´Ù¸¥ MakefileÀÇ Æ÷ÇÔ

make¸¦ ÀÛ¼ºÇÏ´Ù º¸¸é ±²ÀåÈ÷ Å« ±Ô¸ðÀÇ ÇÁ·ÎÁ§Æ®¿¡¼­´Â MakefileÀÌ ¸Å¿ì Ä¿Á®¼­ ´Ù·ç±â ¾î·Á¿ï ¼ö ÀÖ½À´Ï´Ù. À̶§ MakefileÀ» ÀûÀýÈ÷ ³ª´©¾î ´Ù¸¥ ÆÄÀÏ·Î ÀúÀåÇÏ°í include ±¸¹®À¸·Î À̸¦ Æ÷ÇÔÇÏ¿© Çؼ®ÇÒ ¼ö ÀÖµµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù.
include <Makefile-names...>


include ±¸¹®¿¡´Â º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ÆÄÀÏ°ú ÆÄÀÏ »çÀÌ´Â °ø¹éÀ¸·Î ±¸ºÐÇÕ´Ï´Ù. ±×¸®°í Æ÷ÇÔÇÏ°íÀÚ ÇÏ´Â MakefileÀÌ ¾øÀ»¼öµµ ÀÖ´Â °ÍÀ» Çã¿ëÇϱâ À§Çؼ­´Â ´ë½¬(-)¸¦ include ¾Õ¿¡ ºÙ¿© »ç¿ëÇϵµ·Ï Çϸé ÀÖ´Â °æ¿ì´Â Æ÷ÇÔÇÏ°í ±×·¸Áö ¾ÊÀº °æ¿ì´Â ¹«½ÃÇϵµ·Ï ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
EXT_MAKEFILE:=build.mk
-include *.mk $(EXT_MAKEFILE)


1.9. Á»´õ ´Ù¾çÇÑ ÀÀ¿ë

1.9.1. GNU Make¿¡¼­ ±âº»ÀûÀ¸·Î ¿¹¾àµÇ¾î »ç¿ëµÇ´Â ȯ°æº¯¼ö

  • SHELL
    • Command¸¦ ¼öÇàÇØÁÙ shell À» ÁöÁ¤ÇÏ´Â º¯¼öÀÔ´Ï´Ù. Unix °è¿­ OSȯ°æ¿¡¼­ GNU Make´Â SHELLÀ» ±âº»ÀûÀ¸·Î "/bin/sh"·Î ÁöÁ¤µÇ¾î »ç¿ëÇÕ´Ï´Ù. MS-DOS¿¡¼­´Â MAKESHELLµµ °°Àº ¿ªÇÒÀ» Çϴµ¥ MAKESHELLÀÌ ¿ì¼±¼øÀ§°¡ ³ô½À´Ï´Ù. (¶ÇÇÑ Windows ¿ë GNU make ¹öÁ¯¿¡¼­´Â "sh.exe"·Î °ªÀÌ ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù.)
    • ¾Æ·¡ÀÇ ¿¹½Ã´Â °¡±ÞÀû bash ¸¦ shell ·Î ÁöÁ¤Çϵµ·Ï ÇÏ´Â °Ì´Ï´Ù.
      ifneq ($(wildcard /bin/bash),)
        SHELL=/bin/bash# default bash shell
      endif
      ifeq ($(SHELL),)
        SHELL=/bin/sh# default unix shell
      endif
  • MAKE
    • make ¸í·É¾î ÀÚü¸¦ ´ã°í ÀÖ½À´Ï´Ù. °æ¿ì¿¡ µû¶ó¼­ ¸í·É¾î°¡ gmakeÀÎ °æ¿ì°¡ Àִµ¥ ÀÌ °æ¿ì MAKEȯ°æº¯¼ö¿¡ gmake ·Î ´ã°ÜÀְųª Á÷Á¢ ÁöÁ¤ÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Àç±ÍÀû »ç¿ë½Ã¿¡ make ¸í·ÉÀ» Á÷Á¢ »ç¿ëÇϱ⠺¸´Ù´Â "$(MAKE)" ó·³ º¯¼ö¸¦ ÀÌ¿ëÇÏ¿© »ç¿ëÇÏ´Â°Ô ÁÁ½À´Ï´Ù.
  • MAKE_VERSION
    • makeÀÇ ¹öÁ¯À» ´ã°í ÀÖ½À´Ï´Ù.
    • ¾Æ·¡ÀÇ ¿¹½Ã´Â make v3.81 ¹Ì¸¸ÀÇ ¹öÁ¯¿¡¼­´Â ºôµå¸¦ ¸ØÃßµµ·Ï ÇÏ´Â °Ì´Ï´Ù. (make°¡ v10.xx ¹öÁ¯ ÀÌ»óÀÌ µÇ¸é ÀÌ ±¸¹®Àº ¹®Á¦°¡ Á» ÀÖÀ¸¸ç ±×¶§°¡ µÇ¸é ÀÌ¿¡ ´ëÇÑ Á»´õ ÁÁÀº ¿¹½Ã°¡ ³ª¿À°ÚÁÒ? ¤¾¤¾)
      # check for minimal make version (NOTE: this check will break at make 10.x !)
      DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION:=3.81#
      ifneq ($(firstword $(sort $(MAKE_VERSION) $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION))),$(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION))
        $(error you have make "$(MAKE_VERSION)". GNU make >= $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION) is required !)
      endif
  • MAKEFLAGS
    • make ¸í·É¾îÀÇ Àμö¸¦ ´ã°í ÀÖ´Â º¯¼öÀÔ´Ï´Ù.
  • MAKEFILES
    • ÀÌ º¯¼ö¿¡ ÁöÁ¤µÈ ÆÄÀϵéÀº "-include <Makefile-names>..." °ú ºñ½ÁÇÑ È¿°ú¸¦ °¡Áý´Ï´Ù. º¸ÅëÀº ÀÌ º¯¼ö»ç¿ëº¸´Ù´Â include ±¸¹®À¸·Î ¸í½ÃÇϴ°ÍÀ» ±ÇÀåÇÕ´Ï´Ù.
  • MAKELEVEL
    • makeÀÇ Àç±ÍÀû È£Ãâ ±íÀ̸¦ ´ã°í ÀÖ½À´Ï´Ù.
  • MAKECMDGOALS
    • makeÀÇ ¸í·ÉÇà¿¡¼­ ÁÖ¾îÁø Ÿ°Ù¸íÀ» ´ã°í ÀÖÀ¸¸ç ÀÌ º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù°í ±âº» Ÿ°ÙÀÌ ¹Ù²î´Â ¿µÇâ·ÂÀ» °®Áö´Â ¸øÇÕ´Ï´Ù.
  • CURDIR
    • Make°¡ ½ÇÇàµÈ ÇöÀç µð·ºÅ丮¸¦ ´ã°í ÀÖ½À´Ï´Ù. ÀÌ º¯¼ö´Â Åë»ó Àд ¿ëµµ·Î »ç¿ëÇϸç ÀÌ º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù°í ½ÇÇàµÈ µð·ºÅ丮°¡ ¹Ù²î´Â ¿µÇâ·ÂÀ» °®Áö´Â ¸øÇÕ´Ï´Ù.
  • VPATH
    • ÀÌ º¯¼ö¿¡ ´ã°ÜÁø °æ·Î´Â °¡´ÉÇÑ ¸ðµç ÆÄÀÏ¸í¿¡ ´ëÇÑ ÀÚµ¿Å½»öÀÌ ¼öÇàµÇ¸ç ÀûöÇÑ Ã³¸®¸¦ ¼öÇàÇϵµ·Ï ÇÕ´Ï´Ù.
  • SUFFIXES
    • Á¢¹Ì»çµéÀÇ µðÆúÆ® ¸®½ºÆ®¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

1.9.2. Windows¿¡¼­ÀÇ GNU Make »ç¿ë

  • Upload new Attachment "gnumake.zip" : ÀÌ ½ÇÇàÆÄÀÏÀ» ´Ù¿î·Îµå ¹Þ¾Æ¼­ ÀûÀýÇÑ À§Ä¡¿¡ º¹»çÈÄ PATHȯ°æº¯¼ö¸¦ Àâ¾ÆÁÖ°í »ç¿ëÇÏ¸é µË´Ï´Ù. Åë»óÀûÀ¸·Î C:\Windows µð·ºÅ丮¿¡ º¹»çÇØÁÖ¸é ¸í·ÉÇà¿¡¼­ ÆíÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ°ÚÁÒ.
    • Windows¿ë GNU MakeÀÎÁö¸¦ Makefile ¿¡¼­ ½Äº°ÇÏ·Á¸é SHELL ȯ°æº¯¼ö°¡ "sh.exe" ·Î µÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇÏ¸é µË´Ï´Ù.
      ifneq ($(findstring sh.exe,$(SHELL)),)
      # sh.exe°¡ Make ȯ°æº¯¼öÀÎ SHELL ·Î ÁöÁ¤µÇ¾î ÀÖ´Â °æ¿ì Windows¿ë GNU Make °¡ ½ÇÇàµÇ¾úÀ½À» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ½ÇÁ¦·Î Windows¿¡¼­ÀÇ shell Àº "cmd /c" (ȯ°æ¿¡ µû¶ó ´Ù¸¦¼öµµ ÀÖÀ½) ÀÔ´Ï´Ù.
      endif
  • ±× ¹Û¿¡ ºôµå¿¡ ÇÊ¿äÇÑ Windows¿ë GNU tool µéÀº [http]http://gnuwin32.sourceforge.net/[] ¶Ç´Â [http]http://gnuwin64.sourceforge.net/[] ¿¡¼­ ÀÌ¹Ì ºôµåµÈ ½ÇÇàÆÄÀÏ ÇüÅ·Π´Ù¿î·Îµå ¹Þ¾Æ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
  • echo ¸í·É¿¡¼­ÀÇ Quote(") ¹®Á¦
    • WindowsÀÇ echo ¸í·ÉÀº ÀÎÀÚ¿¡ Quote(") °¡ ³ª¿À¸é Quote(") ÀÚüµµ Ãâ·ÂÇÏ°Ô µË´Ï´Ù. ¶§¹®¿¡ Unix ÀÇ echo ¸í·É°ú ´Ù¼Ò ȣȯ¹®Á¦°¡ °É¸®´Âµ¥¿ä. ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­ ¿ª½½·¡½¬(\)¸¦ »ç¿ëÇÒ ¶§¿Í ±×·¸Áö ¾ÊÀ»¶§ÀÇ Á¤È®ÇÑ ÀÌÇØ°¡ ÇÊ¿äÇÕ´Ï´Ù. Windows¿Í Unix °£ ȣȯ°¡´ÉÇÑ makefileÀ» ÀÛ¼ºÇϱâ À§Çؼ­´Â ¾Æ·¡ÀÇ ¿¹Á¦¸¦ °õ°õÈ÷ ºÐ¼®ÇÏ¿© ÀÌÇØÇÏ´Â°Ô ÇÊ¿äÇÕ´Ï´Ù.
      ifneq ($(findstring sh.exe,$(SHELL)),)
      # Windows GNU Make's echo command
        ECHO:=echo#
        QUOTE:=#
      else
      # Unix GNU Make's echo command
        ECHO:=echo#
        QUOTE:=$(subst \,,\")#
      endif

      .PHONY: all
      all: ; $(ECHO) $(QUOTE)Hello        world     !$(QUOTE)


1.9.3. º¹ÀâÇÑ Ä¡È¯

  • Source(*.c) ÆÄÀϵéÀÇ ¸ñ·ÏÀ¸·ÎºÎÅÍ Object(*.o)ÆÄÀϵéÀÇ ¸ñ·ÏÀ¸·Î º¯È¯Çϱâ (º¯¼öġȯÀÇ È°¿ë)
    SOURCE:=a.c b.c c.c d.d test.c example.c#
    OBJECT:=$(SOURCE:%.c=%.o)#
  • patsubst ÇÔ¼ö·Îµµ ÀÌ¿Í ºñ½ÁÇÑ °á°ú¸¦ ¸¸µé¼ö ÀÖ½À´Ï´Ù.
    SOURCE:=a.c b.c c.c d.d test.c example.c#
    OBJECT:=$(patsubst %.c,%.o,$(SOURCE))#
  • µð·ºÅ丮 ¸ñ·Ï¿¡ ´ëÇÏ¿© ´Ù¾çÇÑ ¸í·É ¼öÇàÇϱâ (foreach ÇÔ¼öÀÇ È°¿ë) ¾Æ·¡ÀÇ ¿¹Á¦¿¡¼­ ¸í·ÉÀÇ ±¸ºÐÀÚ·Î ¼¼¹ÌÄÝ·Ð(;)ÀÌ »ç¿ëµÇ¾ú´Âµ¥ ÀÌ°ÍÀº ½©¿¡¼­ Çؼ®ÇÏ´Â °ÍÀ̹ǷΠ¸¸¾à ½©¿¡¼­ ¸í·ÉÀÇ ±¸ºÐÀÚ°¡ ´Ù¸¥ ¹®ÀÚÀÎ °æ¿ì ÀûÀýÈ÷ ¹Ù²ãÁÙ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
    ###
    ### Copyright (C) MINZKN.COM
    ### All rights reserved.
    ### Author: JAEHYUK CHO <mailto:minzkn@minzkn.com>
    ###

    SUBDIRS :=alpha beta gamma MySource#

    .PHONY: all %
    all: ;@$(foreach s_sub_directory,$(SUBDIRS),$(MAKE) $(@) --no-print-directory --directory="$(s_sub_directory)";)
    %: ;@$(foreach s_sub_directory,$(SUBDIRS),$(MAKE) $(@) --no-print-directory --directory="$(s_sub_directory)";)

    # End of makefile


1.10. Á¦¾à»çÇ×

1.10.1. °ø¹éÀ» Æ÷ÇÔÇÑ µð·ºÅ丮¸í ¶Ç´Â ÆÄÀÏ¸í¿¡ ´ëÇÑ ¹®Á¦

  • make ÀÇ ¸¹Àº ³»Àå ÇÔ¼öµéÀº °ø¹éÀ» ³»ºÎÀûÀ¸·Î Ưº°ÇÑ ±¸ºÐÀÚ·Î ÀνÄÇϱ⠶§¹®¿¡ ġȯÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ÀÌ°ÍÀ» ÀûÀýÈ÷ º¯È¯Çϸ鼭 ´Ù·ç´õ¶óµµ Á¦´ë·Î °æ·Î¸¦ ´Ù·ê¼ö ¾ø´Â °æ¿ì°¡ ¹ß»ýÇÕ´Ï´Ù. ¶§¹®¿¡ °¡±ÞÀûÀ̸é make°¡ ´Ù·ï¾ß ÇÒ ´ë»ó µð·ºÅ丮¸íÀ̳ª ÆÄÀÏ¸í¿¡´Â °ø¹éÀ» »ç¿ëÇÏÁö ¾Êµµ·Ï ¸¸µé ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ¶Ç´Â °ø¹é´ë½Å¿¡ ¹ØÁÙ(_) ¹®ÀÚ·Î ¾ÖÃʺÎÅÍ ±¸Á¶¸¦ Àâ´Â°Ô ¹®Á¦¸¦ ¸¸µéÁö ¾Ê´Â °¡Àå ÁÁÀº ¿¹¹æÀÌ µÉ°Ì´Ï´Ù.
    • ÀÏ´Ü <target> ¿¡¼­ °ø¹éÀÌ µé¾î°¡¸é °ø¹é°£ ¹®ÀÚ¿­ÀÌ ¼­·Î ´Ù¸¥ targetÀ¸·Î ÀÎ½ÄµÇ¸ç ¿ª½½·¡½¬´Â ÀÇ¹Ì ¾ø´Â ¹®Á¦°¡ ÀÖ½À´Ï´Ù.
    • <depend>¿¡¼­ °ø¹éÀÌ ÀÖ´Â °æ¿ì ¿ª½½·¡½¬·Î À̸¦ ¹æ¾îÇÒ ¼ö´Â ÀÖÀ¸³ª <command>Ç׿¡¼­ ¿ª½½·¡½¬°¡ ¸ðµÎ Á¦°ÅµÈ´Ù´Â Á¡À¸·Î ÀÎÇÏ¿© notdir, dir, foreach, wildcard µîÀÇ ÇÔ¼ö¿Í ÇÔ²² È¥¿ë½Ã ġȯ±Ç¹ýÀ» ¾Æ¹«¸® ÀßÇصµ ¹®Á¦°¡ Ç®¸®Áö ¾Ê°Ô µÇ´Â »óȲµµ ÀÖ°Ô µË´Ï´Ù.
    • °Ô´Ù°¡ Windows¿¡¼­´Â OS ÀÚü°¡ path±¸ºÐÀÚ·Î ¿ª½½·¡½¬¸¦ »ç¿ëÇϱ⠶§¹®À̱⵵ ÇÏÁö¸¸ WindowsÀÇ echo ¶ÇÇÑ UnixÀÇ echo ¿Í ´Ù·ç´Â ¹®ÀÚ°ü°è°¡ ¸Å¿ì »óÀÌÇÏ¿© ±²ÀåÈ÷ ¾î·Á¿î ġȯÀ» ¿ä±¸ÇÏ°Ô µË´Ï´Ù.

1.10.2. GNU make v3.81 ÀÌÈÄ ¹öÁ¯°ú ±× ÀÌÀüÀÇ ¹öÁ¯°£ ±â´ÉÀÇ Á¦¾à

  • GNU make v3.81ºÎÅÍ ¸¹Àº ±â´É°ú ³»ÀåÇÔ¼ö, ±×¸®°í eval ±¸¹®µîÀÌ Áö¿øµÇ´Âµ¥ ºñ·Î¼Ò ¸¹Àº ºôµåÀÇ ¾î·Á¿òÀ» ÇؼÒÇÒ¼ö ÀÖ°Ô µÇ¾ú½À´Ï´Ù. ÇÏÁö¸¸ ±× ÀÌÀü ¹öÁ¯¿¡¼­´Â Áö¿øÇÏÁö ¾Ê´Â ±â´ÉµéÀÌ Àֱ⠶§¹®¿¡ ÀÌ ºÎºÐ¿¡ ´ëÇÑ ¸íÈ®ÇÑ ÀÌÇØ°¡ ÀÖÀ¸¸é ÁÁ½À´Ï´Ù. ¾Æ·¡ÀÇ ¿¹½Ã´Â ³»°¡ ¿øÇÏ´Â ±â´ÉÀÌ ÀÖ´Â make ¹öÁ¯ÀÎÁö ½Äº°Çϱâ À§Çؼ­ À¯¿ëÇÒ°Ì´Ï´Ù. ÀÌ·± Á¶Ä¡¸¦ ÇصÎÁö ¾ÊÀ¸¸é Áö¿øÇÏÁö ¾Ê´Â ±¸¹®ÀÌ ¿¹Àü ¹öÁ¯¿¡¼­ ÀǵµµÇÁö ¾ÊÀº °á°ú¸¦ µµÃâÇÒ ¼ö À־ ¹Ì¿¬¿¡ ¹æÁöÇÏ´Â °ÍÀÌ ÁÁÀ»°Ì´Ï´Ù.
    # check for minimal make version (NOTE: this check will break at make 10.x !)
    DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION:=3.81#
    ifneq ($(firstword $(sort $(MAKE_VERSION) $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION))),$(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION))
      $(error you have make "$(MAKE_VERSION)". GNU make >= $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION) is required !)
    endif


1.11. Åä·Ð¹× Àâ´ã

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

1.12. Âü°í¹®Çå

  • [http]http://korea.gnu.org/manual/[] : Make ¿¡ ´ëÇÏ¿© ±íÈ÷ ¾Ë°í ½Í´Ù¸é ²À! ÀÌ ¹®¼­¸¦ Àо½Ã±æ °­·ÂÈ÷ ÃßõÇÕ´Ï´Ù.

ID
Password
Join
Everybody ought to have a friend.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-02-06 16:11:57
Processing time 0.0132 sec