make °ÁÂ
¼Ò½º ÇѵΠ°³·Î ÀÌ·ç¾îÁø C/C++ ¾ð¾î ±³¾ç°ú¸ñ °úÁ¦¹°À» Á¦ÃâÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó¸é ¾à°£¸¸ ÇÁ·ÎÁ§Æ®°¡ Ä¿Á®µµ ¼Ò½º´Â °¨´çÇÒ ¼ö ¾øÀ» Á¤µµ·Î ºÒ¾î³ª°Ô µÇ°í ±×°ÍÀ» ÀÏÀÏÀÌ gcc ¸í·ÉÇà ¹æ½ÄÀ¸·Î ó¸®ÇÑ´Ù´Â °ÍÀº »ó´çÈ÷ °ï¿ª½º·¯¿î ÀÏÀÔ´Ï´Ù.
±×·¡¼ ÇϳªÀÇ ÇÁ·ÎÁ§Æ®¸¦ È¿À²ÀûÀ¸·Î °ü¸®ÇÏ°í ÀÏ°ü¼ºÀÖ°Ô °ü¸®Çϱâ À§ÇÏ¿© Makefile À̶ó´Â Çü½ÄÀ» »ç¿ëÇÏ°í make ¶ó´Â À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÕ´Ï´Ù.
¿©·¯ºÐÀÌ ¸®´ª½º¿¡¼ ¼Ò½º ÇüÅ·ΠµÇ¾î ÀÖ´Â °ÍÀ» °¡Á®¿Í¼ ÄÄÆÄÀÏÇÏ°Ô µÇ¸é º¸Åë ¸¶Áö¸·¿¡´Â make ¶ó´Â ¸í·É, ¶Ç´Â make <¾î¼±¸> ÀÌ·± ½ÄÀ¸·Î Ä¡°Ô µË´Ï´Ù.
make ¶ó´Â À¯Æ¿¸®Æ¼´Â º¸Åë ÇöÀç µð·ºÅ丮¿¡ Makefile ¶Ç´Â makefile À̶ó´Â ÀÏÁ¤ÇÑ ±ÔÄ¢À» ÁؼöÇÏ¿© ¸¸µç ÈÀÏÀÇ ³»¿ëÀ» ÀÐ¾î¼ ¸ñÇ¥ ÈÀÏ(target)À» ¸¸µé¾î³À´Ï´Ù. MakefileÀÇ À̸§À» ´Ù¸£°Ô ¸í½ÃÇÏ°í ½ÍÀ» ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.
$ make -f Makefile.linux
º¸Åë ¸ÖƼÇ÷§Æû¿ë ¼Ò½ºµéÀº Makefile.solaris, Makefile.freebsd, Makefile.hp ÀÌ·± ½ÄÀ¸·Î Makefile À» ¿©·¯ °³ ¸¸µé¾îµÎ´Â °æÇâÀÌ ÀÖÁö¿ä. ¶Ç´Â ÀûÀýÇÏ°Ô ¸¸µé¾îµÎ¾î ´ÙÀ½°ú °°ÀÌ make <Ç÷§Æû> ¶ó´Â ½ÄÀ¸·Î Çϸé ÄÄÆÄÀϵǵµ·Ï Çϱ⵵ ÇÕ´Ï´Ù.
$ make linux
ÀÌ·± ÀÏÀº º¸ÅëÀÇ °ü·ÊÀÏ »ÓÀÌÁÒ. ´õ ¿¹¸¦ µé¾îº¸ÀÚ¸é ÀÌ·± ½ÄÀÔ´Ï´Ù. ¿ì¸®°¡ Ä¿³Î ÄÄÆÄÀÏ ÀÛ¾÷ÇÒ ¶§¸¦ º¸½Ê½Ã¿ä.
$ make config /* ¼³Á¤ ÀÛ¾÷À» ÇÑ´Ù */ $ make dep /* ÈÀÏ ÀÇÁ¸¼ºÀ» °Ë»çÇÑ´Ù */ $ make clean /* ¸¸µç ÈÀϵéÀ» Áö¿ì°í ±ú±ßÇÑ »óÅ·Π¸¸µç´Ù */ $ make zImage /* zImage(¾ÐÃàÄ¿³Î)¸¦ ¸¸µç´Ù */ $ make zlilo /* Ä¿³ÎÀ» ¸¸µé°í LILO¸¦ ¼³Á¤ÇÑ´Ù */ $ make bzImage /* bzImage(ºñ´ë¾ÐÃàÄ¿³Î)¸¦ ¸¸µç´Ù */ $ make modules /* Ä¿³Î ¸ðµâÀ» ¸¸µç´Ù */ $ make modules_install /* Ä¿³Î ¸ðµâÀ» ÀνºÅçÇÑ´Ù */
º¹ÀâÇÑ °Í°°¾Æµµ ¿ì¸®´Â Ç×»ó make, make, make ... ÀÏ°ü¼ºÀÖ°Ô make ¶ó°í¸¸ ÃÄÁÖ¸é µË´Ï´Ù. ^^ ºÐ·®ÀÌ ÀÛÀº ¼Ò½ºµéÀÇ °æ¿ì¿¡´Â ÀϹÝÀûÀ¸·Î ´ÙÀ½¸¸ Çصµ µÇ´Â °æ¿ì°¡ ¸¹ÁÒ.
$ make ¶Ç´Â make all $ make install
¿µ¾î±Ç¿¡ »ç´Â »ç¶÷µé¿¡°Ô´Â ´õ¿í Ä£¹ÐÇÏ°Ô ´À²¸Áú °Ì´Ï´Ù. ±×·¸°ÚÁÒ? ``¸¸µé¶ó!''¶ó´Â µ¿»ç¸¦ »ç¿ëÇÏ°í ÀÖ´Â °ÍÀÌ°í ±× ´ÙÀ½¿¡´Â ±×µéÀÇ Á¤»óÀûÀÎ ¾î¼ø¿¡ µû¶ó ¸ñÀû¾î°¡ ³ª¿ÀÁÒ.
$ make install.man
¶ÇÇÑ °ü·Ê»ó ``¸ÇÆäÀÌÁö'' °°Àº °ÍÀº º°µµ·Î ÀνºÅçÇϵµ·Ï ¹è·ÁÇÏ´Â °æ¿ì°¡ ¸¹½À´Ï´Ù. ÇÁ·Î±×·¥¿¡ ´ëÇØ Àß ¾Æ´Â »ç¶÷À̶ó¸é ¸ÇÆäÀÌÁö¸¦ ÀÚÁú±¸·¹ÇÏ°Ô ¼³Ä¡ÇÏ°í ½ÍÁö ¾ÊÀ» ¶§µµ ¸¹À¸´Ï±î¿ä.
´Ù¸¥ »ç¶÷¿¡°Ô °ø°³ÇÏ´Â ¼Ò½º¶ó¸é ´õ¿í make ¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ±×µé»Ó ¾Æ´Ï¶ó ¿©·¯ºÐ Àڽŵµ make ¶ó°í¸¸ Ä¡¸é ¿øÇÏ´Â °á°ú°¡ ³ª¿Ã ¼ö ÀÖµµ·Ï ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ¸¹Àº ¼Ò½º¸¦ ÀÛ¼ºÇÏ´Ù º¸¸é ¿©·¯ºÐ ½º½º·Îµµ ±î¸Ô±â ½±»óÀÔ´Ï´Ù.
ÀÏ´Ü make¸¦ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ °ü·Ê¸¦ ÀÍÈ÷´Â °ÍÀÌ Áß¿äÇÏ´Ù°í º¾´Ï´Ù. ¸®´ª½º ¹èÆ÷ÆÇ ÆÐÅ°Áö¸¸ ¼³Ä¡ÇÏÁö ¸¶½Ã°í Àû±ØÀûÀ¸·Î ¼Ò½º¸¦ °¡Á®´Ù ÄÄÆÄÀÏÇغ¸½Ê½Ã¿ä. ½Ç·ÂÀÌµç ²Ç¼öµç ´Ã±â ½ÃÀÛÇÏ¸é ¿©·¯ºÐÀº ´õ¿í ÇູÇØÁö½Ç ¼ö ÀÖ½À´Ï´Ù. =)
ÀÏ°ü¼ºÀÖ°Ô make¶ó°í¸¸ Ä¡¸é ¸ðµç ÀÏÀÌ ¼ú¼ú Ç®·Á³ª°¡µµ·Ï ÇÏ´Â ¸¶¼úÀº MakefileÀ̶ó´Â °ÍÀ» ¾î¶»°Ô ¿©·¯ºÐÀÌ Àß ¸¸µé¾îµÎ´Â°¡¿¡ µû¶ó °áÁ¤µË´Ï´Ù. ¹Ù·Î ÀÌ Makefile À» ¾î¶»°Ô ¸¸µå´ÂÁö¿¡ ´ëÇÏ¿© ¿À´Ã ¾Ë¾Æº¾´Ï´Ù.
$ gcc -o foo foo.c bar.c
¿©±â¼ foo ¶ó´Â ½ÇÇàÈÀÏÀº foo.c, bar.c ¶ó´Â 2 °³ÀÇ ¼Ò½º·ÎºÎÅÍ ¸¸µé¾îÁö°í ÀÖ½À´Ï´Ù.
¿©·¯ºÐÀÌ Áö±Ý °è¼Ó ÄÚµùÀ» ÇÏ°í ÀÖ´Â ÁßÀ̶ó¸é ÀÌ Á¤µµÂëÀÌ¾ß °¡»óÄÜ¼Ö ¶Ç´Â X Å͹̳ÎÀ» ¿©·¯ °³ ¿¾îµÎ°í ÆíÁýÇÏ¸é¼ ½©ÀÇ È÷½ºÅ丮 ±â´ÉÀ» »ç¿ëÇÏ¸é ±×¸¸ÀÌÁö¸¸ ÇÏ·ç ÀÌƲ °è¼Ó ÇØ°£´Ù°í ÇÏ¸é °ï¿ª½º·¯¿î ÀÏÀÌ ¾Æ´Ò ¼ö ¾ø½À´Ï´Ù.
ÀÚ, ½ÇÀüÀ¸·Î µé¾î°¡¹ö¸®°Ú½À´Ï´Ù. vi Makefile Çؼ ¸¸µé¾îº¾½Ã´Ù. ( ÆíÁý±â´Â ¿©·¯ºÐ ¸¶À½ )
foo: foo.o bar.o gcc -o foo foo.o bar.o foo.o: foo.c gcc -c foo.c bar.o: bar.c gcc -c bar.c
ÀÔ·ÂÇϴµ¥ ÁÖÀÇÇÏ½Ç °ÍÀÌ ÀÖ½À´Ï´Ù. ÀÚ, À§ ÈÀÏÀ» º¸½Ê½Ã¿ä. Çü½ÄÀº ´ÙÀ½°ú °°½À´Ï´Ù.
¸ñÇ¥: ¸ñÇ¥¸¦ ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ±¸¼º¿ä¼Òµé... ¸ñÇ¥¸¦ ´Þ¼ºÇϱâ À§ÇÑ ¸í·É 1 ¸ñÇ¥¸¦ ´Þ¼ºÇϱâ À§ÇÑ ¸í·É 2 ...
MakefileÀº Á¶±Ý¸¸ ½Ç¼öÇصµ ÀÏÀ» ¸ÁÄ¡°Ô µË´Ï´Ù.
¸Ç ù¹ø° ¸ñÇ¥ÀÎ foo ¸¦ »ìÆ캸ÁÒ. ¸Ç ù Ä¿¡ foo: ¶ó°í ÀÔ·ÂÇÏ°í ³ª¼ foo°¡ ¸¸µé¾îÁö±â À§Çؼ ÇÊ¿äÇÑ ±¸¼º¿ä¼Ò¸¦ Àû¾îÁÝ´Ï´Ù. foo°¡ ¸¸µé¾îÁö±â À§Çؼ´Â ÄÄÆÄÀÏµÈ foo.o, bar.o °¡ ÇÊ¿äÇÕ´Ï´Ù. °¢ ¿ä¼Ò¸¦ ±¸ºÐÇϴµ¥ ÀÖ¾î ÄÞ¸¶(,) °°Àº °Ç »ç¿ëÇÏÁö ¾Ê°í °ø¹éÀ¸·Î ÇÕ´Ï´Ù.
Áß¿ä! Áß¿ä! ±× ´ÙÀ½ ÁÙ·Î ³Ñ¾î°¡¼´Â <ÅÇ>Å°¸¦ ´©¸¨´Ï´Ù. ²À ÇÑ ¹ø ÀÌ»óÀº ´·¯¾ß ÇÕ´Ï´Ù. Àý´ë ½ºÆäÀ̽ºÅ°³ª ´Ù¸¥ Å°´Â »ç¿ëÇؼ± ¾ÈµË´Ï´Ù. ¸ñÇ¥ ÈÀÏÀ» ¸¸µé¾î³»±â À§ÇÑ ¸í·É¿¡ ÇØ´çÇÏ´Â ÁÙµéÀº ¸ðµÎ <ÅÇ>Å°·Î ½ÃÀÛÇØ¾ß ÇÕ´Ï´Ù. Makefile ¸¸µé±â¿¡¼ Á¦ÀÏ Áß¿äÇÑ ³»¿ëÀÔ´Ï´Ù. <ÅÇ>Å°¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù´Â »ç½Ç, ¹Ù·Î ÀÌ°ÍÀÌ Áß¿äÇÑ »ç½ÇÀÔ´Ï´Ù.
foo¸¦ ¸¸µé±â À§ÇÑ ¸í·ÉÀº ¹Ù·Î gcc -o foo foo.o bar.o ÀÔ´Ï´Ù.
´Ù½Ã ÇÑ ¹ø Çؼ®Çϸé ÀÌ·¸½À´Ï´Ù. foo ¸¦ ¸¸µé±â À§Çؼ´Â foo.o¿Í bar.o°¡ ¿ì¼± ÇÊ¿äÇÏ´Ù.( foo: foo.o bar.o )
ÀÏ´Ü foo.o, bar.o °¡ ¸¸µé¾îÁ® ÀÖ´Ù¸é ¿ì¸®´Â gcc -o foo foo.o bar.o ¸¦ ½ÇÇàÇÏ¿© foo ¸¦ ¸¸µç´Ù.
ÀÚ, ÀÌÁ¦ºÎÅÍ »ç½½Ã³·³ ¿«¾î³ª°¡´Â Àϸ¸ ³²¾Ò½À´Ï´Ù.
foo¸¦ ¸¸µé·Á°í ÇÏ´Ï foo.o¿Í bar.o °¡ ÇÊ¿äÇÕ´Ï´Ù!
±×·¸´Ù¸é foo.o´Â ¾î¶»°Ô ¸¸µéÁÒ?
foo.o: foo.c gcc -c foo.c
¹Ù·Î ÀÌ ºÎºÐÀÔ´Ï´Ù. foo.o´Â foo.c¸¦ ÇÊ¿ä·Î ÇÏ¸ç ¸¸µå´Â ¹æ¹ýÀº gcc -c foo.cÀÔ´Ï´Ù.
±× ´ÙÀ½ bar.o ´Â ¾î¶»°Ô ¸¸µéÁÒ?
bar.o: bar.c gcc -c bar.c
ÀÌ°ÍÀ» ¸¸µé·Á¸é ÀÌ°ÍÀÌ ÇÊ¿äÇÏ°í ±×°ÍÀ» ¸¸µé±â À§Çؼ´Â ¶Ç ÀÌ°ÍÀÌ ÇÊ¿äÇÏ°í...
¼Ò½º¸¦ ¸¸µé¾î¼ Çغ¾½Ã´Ù.
extern void bar ( void ); int main ( void ) { bar (); return 0; }
#include <stdio.h> void bar ( void ) { printf ( "Good bye, my love.\n" ); }
MakefileÀ» À§Ã³·³ ¸¸µé¾îµÎ°í ±×³É Çغ¸ÁÒ.
$ make ¶Ç´Â make foo gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
¸í·ÉÀÌ ½ÇÇàµÇ´Â ¼ø¼¸¦ Àß º¸½Ê½Ã¿ä. ¿©±â¼ °¨ÀÌ ¿Í¾ß ÇÕ´Ï´Ù. ^^
$ ./foo Good bye, my love.
´Ù½Ã ÇÑ ¹ø ½ÇÇàÇغ¼±î¿ä?
$ make make: `foo' is up to date.
¶È¶ÈÇÑ make´Â foo¸¦ ´Ù½Ã ¸¸µé ÇÊ¿ä°¡ ¾ø´Ù°í »ý°¢ÇÏ°í ´õ ÀÌ»ó ó¸®ÇÏÁö ¾Ê½À´Ï´Ù.
À̹ø¿¡´Â foo.c ¸¦ ¾à°£¸¸ °íÃĺ¾½Ã´Ù. return 0; ¶ó´Â ¹®ÀåÀ» exit (0); ¶ó´Â¹®ÀåÀ¸·Î ¹Ù²Ù¾îº¸ÁÒ. ±×¸®°í ´Ù½Ã ÇÑ ¹ø ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.
$ make gcc -c foo.c gcc -o foo foo.o bar.o
ÀÚ, ¿ì¸®°¡ ¿øÇÏ´ø °á°úÀÔ´Ï´Ù. ´ç¿¬È÷ foo.c ¸¸ º¯ÈµÇ¾úÀ¸¹Ç·Î foo.o ¸¦ ¸¸µé°í foo.o°¡ °»½ÅµÇ¾úÀ¸¹Ç·Î fooµµ ´Ù½Ã ¸¸µì´Ï´Ù. ÇÏÁö¸¸ bar.c´Â ¾Æ¹«º¯È¸¦ °ÞÁö ¾Ê¾ÒÀ¸¹Ç·Î ÀÌ¹Ì ¸¸µé¾îµÐ bar.o ´Â ±×´ë·Î µÓ´Ï´Ù.
¼Ò½ºÅ©±â°¡ ´Ã¸é ´Ã¼ö·Ï ÀÌó·³ ¶È¶ÈÇÑ Ã³¸®°¡ ÇÊ¿äÇÏÁö¿ä.
$ rm -f foo $ make gcc -o foo foo.o bar.o
À̰͵µ ¿ì¸®°¡ ¿øÇÏ´ø °á°úÀÔ´Ï´Ù. foo ½ÇÇàÈÀϸ¸ »ì¦ Áö¿ü´õ´Ï make´Â ¾Ë¾Æ¼ ÀÌ¹Ì ÀÖ´Â foo.o, bar.o ¸¦ °¡Áö°í foo ¸¦ ¸¸µé¾î³À´Ï´Ù. :)
clean: rm -f foo foo.o bar.o
ÀÌ µÎ ÁÙÀ» À§¿¡¼ ¸¸µç Makefile µÞºÎºÐ¿¡ Ãß°¡Çغ¸µµ·Ï ÇսôÙ.
$ make clean rm -f foo foo.o bar.o $ make gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
make cleanÀ̶ó´Â ÀÛ¾÷ ¶ÇÇÑ Áß¿äÇÑ ÀÛ¾÷ÀÔ´Ï´Ù. È®½ÇÈ÷ û¼Ò¸¦ º¸ÀåÇØÁÖ¾î¾ß Çϰŵç¿ä.
make, make clean ÀÌ·± °ÍÀÌ µÇ¸é »ó´çÈ÷ ¸ÚÁø Makefile À̶ó°í º¼ ¼ö ÀÖÁÒ? À̹ø clean ¿¡¼ º¸¿©µå¸®°íÀÚ ÇÏ´Â ºÎºÐÀº ÀÌ·± °ÍÀÔ´Ï´Ù.
¿ì¸®ÀÇ ¸Ó¸® ¼Ó¿¡ clean À̶ó´Â ¸ñÇ¥´Â ´ÜÁö ÈÀϵéÀ» Áö¿ì´Â ÀÏÀÔ´Ï´Ù.
clean: ¿·¿¡ ¾Æ¹«·± ¿¬°ü ÈÀϵéÀÌ ¾øÁö¿ä?
±×¸®°í ¿À·ÎÁö rm -f foo foo.o bar.o ¶ó´Â ¸í·É¸¸ ÀÖÀ» »ÓÀÔ´Ï´Ù. cleanÀ̶ó´Â ¸ñÇ¥¸¦ ¼öÇàÇϱâ À§ÇØ ÇÊ¿äÇÑ °ÍÀº ¾ø½À´Ï´Ù. ±×·¯¹Ç·Î ÀûÁö ¾Ê¾ÒÀ¸¸ç Ÿ´çÇÑ make ¹®¹ýÀÔ´Ï´Ù.
all: foo
ÀÌ ÇÑ ÁÙÀ» Makefile ¸Ç ¾Õ¿¡ ³Ö¾îµÎµµ·Ï ÇսôÙ.
$ make clean $ make all gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
À̹ø¿¹´Â all À̶ó´Â ¸ñÇ¥¿¡ ±× ¹Ø¿¡ ³ª¿À´Â ´Ù¸¥ ¸ñÇ¥¸¸ÀÌ µé¾îÀÖÀ» »Ó, ¾Æ¹«·± ¸í·Éµµ ¾ø´Â °æ¿ìÀÔ´Ï´Ù. º¸Åë ¿ì¸®´Â make all ÇÏ¸é °ü·ÃµÈ ¸ðµç °ÍµéÀÌ ¸¸µé¾îÁö±æ ¿øÇÕ´Ï´Ù.
all: foo1 foo2 foo3 foo1: <»ý·«> foo2: <»ý·«> foo3: <»ý·«>
ÀÌ·± ½ÄÀ¸·Î ÇØµÎ¸é ¾î¶² ÀåÁ¡ÀÌ ÀÖ´ÂÁö ¾Ë¾Æº¾½Ã´Ù.
º¸Åë make all Çϸé foo1, foo2, foo3°¡ ¸ðµÎ ¸¸µé¾îÁý´Ï´Ù. ±×·±µ¥ ¾î¶² °æ¿ì¿¡´Â foo1¸¸ ¶Ç´Â foo2¸¸À» ¸¸µé°í ½ÍÀ» ¶§µµ ÀÖÀ» °Ì´Ï´Ù. ±¦È÷ ÇÊ¿ä¾ø´Â foo3 °°Àº °ÍÀ» ÄÄÆÄÀÏÇÏ´À¶ó ½Ã°£À» º¸³»±â ½ÈÀ¸¹Ç·Î ¿ì¸®´Â ´ÜÁö ´ÙÀ½°ú °°À̸¸ ÇÒ °Ì´Ï´Ù.
$ make foo1 $ make foo2
¹°·Ð ÀϹÝÀûÀ¸·Î ´Ù ¸¸µé°í ½ÍÀ» ¶§´Â make all À̶ó°í¸¸ ÇÏ¸é µË´Ï´Ù.
make all ÀÌ°Ç ¾ÆÁÖ ÀϹÝÀûÀÎ °ü·ÊÀÌÁö¿ä. ±×¸®°í ¿Ü¿ì±âµµ ½±Àݾƿä?
Àß °üÂûÇغ¸½Ã¸é ¾î¼±¸.c -----------> ¾î¼±¸.o ¶ó´Â °ü°è°¡ ¸Å¹ø µîÀåÇÔÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀ» ¸Å¹ø ¹Ýº¹ÇÑ´Ù´Â °ÍÀº ¼Ò½º ÈÀÏÀÌ ÇÑ µÎ °³ Á¤µµÀÏ ¶§¾ß ¸ð¸£Áö¸¸ ¼ö½Ê °³°¡ ³Ñ°Ô µÇ¸é Á¤¸» °ï¿ª½º·¯¿î ÀÏÀ̶ó°í ÇÏÁö ¾ÊÀ» ¼ö ¾øÁö¿ä.
´ÙÀ½°ú °°Àº Ç¥ÇöÀ» Makefile ¿¡¼ º¸´Â °æ¿ì°¡ ¸¹À» °Ì´Ï´Ù.
.c.o: gcc -c ${CFLAGS} $<
¿©±â¼ .c.o ÀÇ Àǹ̸¦ »ý°¢Çغ¸°Ú½À´Ï´Ù. ".c ¸¦ ÀÔ·ÂÈÀÏ·Î ¹Þ°í .o ÈÀÏÀ» ¸¸µç´Ù"
gcc -c ${CFLAGS} $<
ÀÌ ¹®ÀÚÀ» º¸¸é ÀÏ´Ü ´«¿¡ ¶ç´Â °ÍÀº ${CFLAGS}¶ó´Â Ç¥Çö°ú $< ¶ó´Â ¾ÏÈ£¿Íµµ °°Àº Ç¥ÇöÀÔ´Ï´Ù. ¿©±â¼´Â ÀÏ´Ü $< ¶ó´Â ±âÈ£ÀÇ Àǹ̸¦ ¾Ë¾Æº¸°Ú½À´Ï´Ù.
À¯´Ð½º¿¡¼ ½©À» Àß ±¸»çÇϽô ºÐµéÀº ´«Ä¡Ã¤¼ÌÀ» °Ì´Ï´Ù. À۴٠ǥ½Ã(<)´Â ¸®´ÙÀÌ·º¼Ç¿¡¼ ÀÔ·ÂÀ» ÀǹÌÇÏ´Â °ÍÀ» ¾Æ½Ê´Ï±î? ±×·¸´Ù¸é $< ´Â ¹Ù·Î .c.o ¶ó´Â Ç¥Çö¿¡¼ .c Áï C ¼Ò½º ÈÀÏÀ» ÀǹÌÇÕ´Ï´Ù.
¿¹¸¦ µé¾î foo.c °¡ ÀÖ´Ù¸é ÀÚµ¿À¸·Î
gcc -c ${CFLAGS} foo.c
°¡ ¼öÇàµÇ¸ç gcc ¿¡ -c ¿É¼ÇÀÌ ºÙ¾úÀ¸¹Ç·Î foo.o ÈÀÏÀÌ ¸¸µé¾îÁú °ÍÀÔ´Ï´Ù.
.c.o ¶ó´Â ÀüÅëÀûÀΠǥÇö ¸»°í GNU ¹öÀü( ¿ì¸®°¡ ¸®´ª½º¿¡¼ »ç¿ëÇÏ´Â °ÍÀº ¹Ù·Î ÀÌ°ÍÀÔ´Ï´Ù )ÀÇ make ¿¡¼ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¾½Ã´Ù.
À§¿¡¼ ¿¹·Î µç °ÍÀ» GNU ¹öÀüÀÇ make ¿¡¼ Áö¿øÇÏ´Â È®Àå¹®¹ýÀ» »ç¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.
%.o: %.c gcc -c -o $@ ${CFLAGS} $<
±×³É ¼³¸í Àü¿¡ Àß »ìÆ캸½Ã±â ¹Ù¶ø´Ï´Ù.
¿ì¸®°¡ À§¿¡¼ ¾Ë¾Æº¸¾Ò´ø Ç¥ÁØÀûÀÎ .c.o ¶ó´Â ²¿¸®¸» ±ÔÄ¢(Suffix rule)º¸´Ù ÈξÀ ³í¸®ÀûÀ̶ó´Â °ÍÀ» ¹ß°ßÇϼ̽À´Ï±î?
¿ì¸®°¡ ¹Ù·Î Àü °ÀÇ¿¡¼ main.o : main.c ÀÌ·± ½ÄÀ¸·Î Ç¥ÇöÇÑ °Í°ú °°Àº ¸Æ¶ôÀÌÁö¿ä? ÀÌ°ÍÀ» ¿ì¸®´Â ÆÐÅÏ ±ÔÄ¢(Pattern rule)À̶ó°í ºÎ¸¨´Ï´Ù. ÄÝ·Ð(:) ¿À¸¥ÂÊÀÌ ÀÔ·Â ÈÀÏÀÌ°í ¿ÞÂÊÀÌ ¸ñÇ¥ ÈÀÏÀÔ´Ï´Ù. ÈÀÏ¸í ´ë½Å ÆÛ¼¾Æ®(%) ¹®ÀÚ¸¦ »ç¿ëÇÑ °Í¸¸ À¯ÀÇÇÏ¸é µË´Ï´Ù. ¿©±â¼ foo.c ¶ó´Â ÀÔ·ÂÈÀÏÀÌ ÀÖ´Ù¸é % ±âÈ£´Â foo ¸¸À» ³ªÅ¸³À´Ï´Ù.
gcc -c -o $@ ${CFLAGS} $<
¶ó´Â Ç¥ÇöÀ» Çؼ®Çغ¾½Ã´Ù. ( ÈÄ  ¸¶Ä¡ °í´ë ¹®ÀÚÆÇÀ» Çؼ®ÇÏ´Â ±âºÐÀÌ ¾Èµå½Ê´Ï±î? ^^ )
$< ´Â ÀÔ·ÂÈÀÏÀ» ÀǹÌÇÏ°í $@ Àº Ãâ·ÂÈÀÏÀ» ÀǹÌÇÕ´Ï´Ù. .c.o¿Í °°Àº ²¿¸®¸» ±ÔÄ¢°ú º° ´Ù¸¦ ¹Ù ¾ø´Ù°í »ý°¢ÇÏ½Ç Áö ¸ð¸£³ª -o $@ ¸¦ ÅëÇÏ¿© .o ¶ó´Â À̸§ ¸»°í ÀüÇô ´Ù¸¥ Àϵµ Çس¾ ¼ö ÀÖ½À´Ï´Ù.
´ÙÀ½ ¿¹´Â ±×³É ÀÌ·± ¿¹°¡ ÀÖ´Ù´Â °Í¸¸ ÇÑ ¹ø º¸¾ÆµÎ½Ã±â ¹Ù¶ø´Ï´Ù.
%_dbg.o: %.c gcc -c -g -o $@ ${CFLAG} $< DEBUG_OBJECTS = main_dbg.o edit_dbg.o edimh_dbg: $(DEBUG_OBJECTS) gcc -o $@ $(DEBUG_OBJECTS)
%_dbg.o ¶ó´Â Ç¥ÇöÀ» Àß º¸½Ê½Ã¿ä. foobar.c ¶ó´Â ÀÔ·ÂÈÀÏ(%.c)ÀÌ ÀÖ´Ù¸é % ±âÈ£´Â foobar ¸¦ °¡¸®Å°¹Ç·Î %_dbg.o ´Â °á±¹ foobar_dbg.o °¡ µË´Ï´Ù.
$< ÀÔ·Â ÈÀÏÀ» ÀǹÌÇÕ´Ï´Ù. ÄÝ·ÐÀÇ ¿À¸¥ÂÊ¿¡ ¿À´Â ÆÐÅÏÀ» ġȯÇÕ´Ï´Ù. $@ Ãâ·Â ÈÀÏÀ» ÀǹÌÇÕ´Ï´Ù. ÄÝ·ÐÀÇ ¿ÞÂÊ¿¡ ¿À´Â ÆÐÅÏÀ» ġȯÇÕ´Ï´Ù. $* ÀÔ·Â ÈÀÏ¿¡¼ ²¿¸®¸»(.c, .s µî)À» ¶¼³Ù ÈÀϸíÀ» ³ªÅ¸³À´Ï´Ù.
¿ª½Ã GNU ¹öÀüÀ̶ó´Â »ý°¢ÀÌ µéÁö ¾ÊÀ¸½Ã´ÂÁö¿ä?
¾Õ¿¡¼µµ Àá±ñ¾¿ ³ª¿Â ${CFLAGS} ¶ó´Â Ç¥ÇöÀ» º¸µµ·Ï ÇսôÙ.
gcc ¿É¼Çµµ ¸¹ÀÌ ¾Ë°í makeÀ» ´É¼ö´É¶õÇÏ°Ô ´Ù·ê ¼ö ÀÖ´Â »ç¶÷µéÀº ´ÙÀ½°ú °°ÀÌ Çؼ ÀÚ½ÅÀÇ ÇÁ·Î±×·¥¿¡ µü ¸Â´Â gcc ¿É¼ÇÀÌ ¹«¾ùÀÎÁö ¾Ë¾Æ³»·Á°í ÇÒ °ÍÀÔ´Ï´Ù.
$ make CFLAGS="-O4" $ make CFLAGS="-g"
ÀÌÁ¦ ¸ÅÅ©·Î¿¡ ´ëÇÑ À̾߱⸦ ³ª´²º¼±î ÇÕ´Ï´Ù. ÀÌ À̾߱⸦ Á¶±Ý Çؾ߸¸ À§ÀÇ ¿¹¸¦ ÀÌÇØÇÒ ¼ö ÀÖ´Ù°í º¸±â ¶§¹®ÀÔ´Ï´Ù. ±×³É ½ÃÇè»ï¾Æ Çغ¸½Ê½Ã´Ù. »õ·Î¿î °ÍÀ» ¹è¿ì±â À§Çؼ´Â ²À ¾î¶² ´ñ°¡°¡ ¿Í¾ß¸¸ ÇÑ´Ù´Â »ý°¢À» ¹ö·Á¾ß°ÚÁö¿ä?
myprog: main.o foo.o gcc -o $@ main.o foo.o
ÀÌ°ÍÀ» ±¦È÷ ¾î·Æ°Ô ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© Ç¥ÇöÇغ¸±â·Î ÇÏ°Ú½À´Ï´Ù.
OBJECTS = main.o foo.o myprog: $(OBJECTS) gcc -o $@ $(OBJECTS)
¿©·¯ºÐÀº º¸Åë ±ä MakefileÀ» ÈÉÃÄ º¼ ¶§ ÀÌ·± ¸ÅÅ©·Î°¡ ¾öû³ª°Ô ¸¹´Ù´Â °ÍÀ» º¸½Å ÀûÀÌ ÀÖÀ» °Ì´Ï´Ù. ^^
ROOT = /usr/local HEADERS = $(ROOT)/include SOURCES = $(ROOT)/src
¿¹»óÇϽõí À§¿¡¼ HEADERS´Â ´ç¿¬È÷ /usr/local/include°¡ µÇ°ÚÁö¿ä?
´ÙÀ½°ú °°Àº ¹®Àåµµ ÀÖ½À´Ï´Ù.
ifdef XPM LINK_DEF = -DXPM endif
$ make XPM=yes
ÀÌ·¸°Ô Çϸé ifdef   endif ºÎºÐÀÌ Ã³¸®µË´Ï´Ù.
ÀÚ, make CFLAGS="-O" ÀÌ·± ¸í·ÉÀ» ÇÑ ¹ø º¾½Ã´Ù. ${CFLAGS}¿¡¼ {} Ç¥ÇöÀº À¯´Ð½º ½©¿¡¼ º¯¼ö°ªÀ» ¾Ë¾Æ³¾ ¶§ ¾²´Â Ç¥ÇöÀÔ´Ï´Ù. CFLAGS °ªÀ» ¿©·¯ºÐÀÌ Makefile¿¡ °íÁ¤ÀûÀ¸·Î Áý¾î³ÖÁö ¾Ê°í ±×³É make ¸¸ ½ÇÇàÇÏ´Â »ç¶÷¿¡°Ô ¼±ÅñÇÀ» ÁÖ±â À§Çؼ »ç¿ëÇϰųª Àڱ⠽º½º·Î ¾î¶² ¿É¼ÇÀÌ Á¦ÀÏ Àß ¸Â´ÂÁö ¾Ë¾Æº¸±â À§Çؼ »ç¿ëÇÕ´Ï´Ù. ´Ù¸¥ ¿É¼ÇÀ¸·Î ÄÄÆÄÀÏÇÏ´Â °Í¸¶´Ù ÀÏÀÏÀÌ ´Ù¸¥ MakefileÀ» ¸¸µéÁö ¸»°í °¡º¯ÀûÀÎ ºÎºÐÀ» º¯¼öÈÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.
target: cd obj HOST_DIR=/home/e mv *.o $HOST_DIR
ÇϳªÀÇ ¸ñÇ¥¿¡ ´ëÇÏ¿© ¿©·¯ ¸í·ÉÀ» ¾²¸é ¿¹±âÄ¡ ¾ÊÀº ÀÏÀÌ ¹ú¾îÁý´Ï´Ù. ±â¼úÀûÀ¸·Î ¸»ÇÏÀÚ¸é °¢ ¸í·ÉÀº °¢ÀÚÀÇ ¼ºê½©¿¡¼ ½ÇÇàµÇ¹Ç·Î ÀüÇô ¿¬°üÀÌ ¾ø½À´Ï´Ù. -.- cd obj µµ ÇϳªÀÇ ½©¿¡¼ HOST_DIR=/home/eµµ ÇϳªÀÇ ½©¿¡¼ ³ª¸ÓÁöµµ ¸¶Âù°¡ÁöÀÔ´Ï´Ù. °¢±â ´Ù¸¥ ½©¿¡¼ ÀÛ¾÷ÇÑ °Íó·³ µÇ¹Ç·Î cd obj Çß´Ù ÇÏ´õ¶óµµ ´ÙÀ½¹ø ¸í·ÉÀÇ À§Ä¡´Â obj µð·ºÅ丮°¡ ¾Æ´Ï¶ó ±×´ë·Î º¯ÇÔÀÌ ¾øÀÌ ÇöÀç µð·ºÅ丮ÀÔ´Ï´Ù. ¼¼¹ø° ¸í·É¿¡¼ HOST_DIR º¯¼ö¸¦ ãÀ¸·Á ÇÏÁö¸¸ µÎ¹ø° ¸í·ÉÀÌ Á¾·áÇÑ ÈÄ HOST_DIR º¯¼ö´Â »ç¶óÁý´Ï´Ù.
target: cd obj ; \ HOST_DIR=/hom/e ; \ mv *.o $$HOST_DIR
ÀÌ·¸°Ô Àû¾îÁÖ¼Å¾ß ÇÕ´Ï´Ù. ¼¼¹ÌÄÝ·ÐÀ¸·Î °¢ ¸í·ÉÀ» ±¸ºÐÇÏÁö¿ä. óÀ½ µÎ ÁÙÀÇ ¸¶Áö¸·¿¡ ¾²ÀÎ ¿ª½½·¡½¬(\) ¹®ÀÚ´Â ÇÑ ÁÙ¿¡ ¾µ °ÍÀ» ¿©·¯ ÁÙ·Î ³ª´©¾î ¾´´Ù´Â °ÍÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
ÁÖÀÇ! ¼¼¹ø° ÁÙ¿¡ $HOST_DIRÀÌ ¾Æ´Ï¶ó $$HOST_DIRÀÎ °ÍÀ» ¸í½ÉÇϽʽÿä. ¿¹¸¦ Çϳª µé¾îº¸ÁÒ. ^^
all: HELLO="¾È³çÇϼ¼¿ä?";\ echo $HELLO
MakefileÀÇ ³»¿ëÀ» ÀÌ·¸°Ô °£´ÜÇÏ°Ô ¸¸µì´Ï´Ù.
$ make HELLO="¾È³çÇϼ¼¿ä?";\ echo ELLO ELLO <verb> ¿ì¸®°¡ ¿øÇÏ´Â °á°ú°¡ ¾Æ´ÏÁÒ? $HELLO¸¦ $$HELLO·Î ¹Ù²Ù¾îº¸½Ê½Ã¿ä. <verb> $ make HELLO="¾È³çÇϼ¼¿ä?";\ echo $HELLO ¾È³çÇϼ¼¿ä?
all: @HELLO="¾È³çÇϼ¼¿ä?"; echo $$HELLO
¸í·ÉÀÇ ¸Ç óÀ½¿¡ @ ¹®ÀÚ¸¦ ºÙ¿©º¾½Ã´Ù.
$ make ¾È³çÇϼ¼¿ä?
Makefile¿¡ ´ëÇÑ ³»¿ëÀº À̰ͺ¸´Ù ÈξÀ ³»¿ëÀÌ ¸¹½À´Ï´Ù. ÇÏÁö¸¸ ¸ðµç °ÍÀ» ´Ù ¾Ë°í ½ÃÀÛÇÒ ¼ö´Â ¾ø°ÚÁö¿ä? ÀÌ Á¤µµ¸é ¾î´À Á¤µµ ÃæºÐÇÏ°Ô Ã¢ÇÇÇÏÁö ¾ÊÀ» Á¤µµÀÇ MakefileÀ» ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
Âü°í·Î autoconf/automake¶ó°í ÇÏ´Â ¾ÆÁÖ ÈǸ¢ÇÑ GNU make À¯Æ¿¸®Æ¼¸¦ ½Ã°£³ª¸é ¹è¿öº¸½Ã´Â °Íµµ ÁÁ½À´Ï´Ù.
½Ã°£À» ³»¼ ¸®´ª½º¿¡¼ÀÇ C ÇÁ·Î±×·¡¹Ö¿¡ ÇÊ¿äÇÑ ´Ù¸¥ ¿©·¯ °¡Áö À¯Æ¿¸®Æ¼µé( °£Á¢ÀûÀ̵ç Á÷Á¢ÀûÀ̵ç grep, awk, rcs, cvs µî )ÀÇ °£´Ü/½ÇÀü »ç¿ë¹ýµµ ¿Ã·Áµå¸±±î »ý°¢ ÁßÀÔ´Ï´Ù. ^^