· 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
The best prophet of the future is the past.


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.0149 sec