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

3. make °­ÁÂ

3.1 ¸Ó¸´¸»

¼Ò½º ÇѵΠ°³·Î ÀÌ·ç¾îÁø 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¸¦ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ °ü·Ê¸¦ ÀÍÈ÷´Â °ÍÀÌ Áß¿äÇÏ´Ù°í º¾´Ï´Ù. ¸®´ª½º ¹èÆ÷ÆÇ ÆÐÅ°Áö¸¸ ¼³Ä¡ÇÏÁö ¸¶½Ã°í Àû±ØÀûÀ¸·Î ¼Ò½º¸¦ °¡Á®´Ù ÄÄÆÄÀÏÇغ¸½Ê½Ã¿ä. ½Ç·ÂÀÌµç ²Ç¼öµç ´Ã±â ½ÃÀÛÇÏ¸é ¿©·¯ºÐÀº ´õ¿í ÇູÇØÁö½Ç ¼ö ÀÖ½À´Ï´Ù. =)

3.2 make ½ÃÀÛÇØ º¾½Ã´Ù.

ÀÏ°ü¼ºÀÖ°Ô make¶ó°í¸¸ Ä¡¸é ¸ðµç ÀÏÀÌ ¼ú¼ú Ç®·Á³ª°¡µµ·Ï ÇÏ´Â ¸¶¼úÀº MakefileÀ̶ó´Â °ÍÀ» ¾î¶»°Ô ¿©·¯ºÐÀÌ Àß ¸¸µé¾îµÎ´Â°¡¿¡ µû¶ó °áÁ¤µË´Ï´Ù. ¹Ù·Î ÀÌ Makefile À» ¾î¶»°Ô ¸¸µå´ÂÁö¿¡ ´ëÇÏ¿© ¿À´Ã ¾Ë¾Æº¾´Ï´Ù.

»óȲ 1)

        $ 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 ¸¦ ¸¸µé¾î³À´Ï´Ù. :)

»óȲ 2) Àç¹Ì¸¦ µé¿´´Ù¸é À̹ø¿¡´Â û¼ÒÀÛ¾÷À» Çغ¸±â·Î ÇսôÙ.


 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 ¹®¹ýÀÔ´Ï´Ù.

»óȲ 3)


 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 ÀÌ°Ç ¾ÆÁÖ ÀϹÝÀûÀÎ °ü·ÊÀÌÁö¿ä. ±×¸®°í ¿Ü¿ì±âµµ ½±Àݾƿä?

3.3 ²¿¸®¸» ±ÔÄ¢, ÆÐÅÏ ±ÔÄ¢

Àß °üÂûÇغ¸½Ã¸é ¾î¼±¸.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 È­ÀÏÀÌ ¸¸µé¾îÁú °ÍÀÔ´Ï´Ù.

3.4 GNU make È®Àå ±â´É

.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 ¹öÀüÀ̶ó´Â »ý°¢ÀÌ µéÁö ¾ÊÀ¸½Ã´ÂÁö¿ä?

3.5 ¸ÅÅ©·Î(Macro) ±â´É

¾Õ¿¡¼­µµ Àá±ñ¾¿ ³ª¿Â ${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À» ¸¸µéÁö ¸»°í °¡º¯ÀûÀÎ ºÎºÐÀ» º¯¼öÈ­ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.

3.6 ¸¶Áö¸· ÁÖÀÇ »çÇ×


 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
 ¾È³çÇϼ¼¿ä?

3.7 Àá½Ã ¸¶Ä¡¸é¼­

Makefile¿¡ ´ëÇÑ ³»¿ëÀº À̰ͺ¸´Ù ÈξÀ ³»¿ëÀÌ ¸¹½À´Ï´Ù. ÇÏÁö¸¸ ¸ðµç °ÍÀ» ´Ù ¾Ë°í ½ÃÀÛÇÒ ¼ö´Â ¾ø°ÚÁö¿ä? ÀÌ Á¤µµ¸é ¾î´À Á¤µµ ÃæºÐÇÏ°Ô Ã¢ÇÇÇÏÁö ¾ÊÀ» Á¤µµÀÇ MakefileÀ» ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

Âü°í·Î autoconf/automake¶ó°í ÇÏ´Â ¾ÆÁÖ ÈǸ¢ÇÑ GNU make À¯Æ¿¸®Æ¼¸¦ ½Ã°£³ª¸é ¹è¿öº¸½Ã´Â °Íµµ ÁÁ½À´Ï´Ù.

½Ã°£À» ³»¼­ ¸®´ª½º¿¡¼­ÀÇ C ÇÁ·Î±×·¡¹Ö¿¡ ÇÊ¿äÇÑ ´Ù¸¥ ¿©·¯ °¡Áö À¯Æ¿¸®Æ¼µé( °£Á¢ÀûÀ̵ç Á÷Á¢ÀûÀ̵ç grep, awk, rcs, cvs µî )ÀÇ °£´Ü/½ÇÀü »ç¿ë¹ýµµ ¿Ã·Áµå¸±±î »ý°¢ ÁßÀÔ´Ï´Ù. ^^


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