make À¯Æ¿¸®Æ¼ °ÁÂ
¸ñÂ÷.
1. make ( ¸¸µç´Ù? )
1.1 make À¯Æ¿¸®Æ¼.
1.2 makeÀÇ Çʿ伺.
2. °£´ÜÇÑ Makefile
2.1 MakefileÀÇ ³»ºÎ±¸¼º.
2.2 Makefile ¿¹Á¦
2.3 ¸ÅÅ©·ÎÀÇ »ç¿ë
2.4 ·¹À̺íÀÇ ÀÌ¿ë
1. make (¸¸µç´Ù?)
1.1 make À¯Æ¿¸®Æ¼.
¿µ¾î»çÀü¿¡¼ make¶õ ¶æÀº ´©±¸³ª ¾ËµíÀÌ '¸¸µé´Ù'¶ó´Â ¶æÀÇ µ¿»çÀÌ´Ù. ±×·³ make À¯Æ¿¸®Æ¼´Â ¿Ö À̸§ÀÌ makeÀÎÁö ¾Ë Çʿ䰡 ÀÖÀ» °Í °°´Ù. manÀ¸·Î ã¾Æº¸¸é make¿¡ ´ëÇØ ´ÙÀ½°ú °°ÀÌ ¼³¸íÇϰí ÀÖ´Ù.
make - GNU make utility to maintain groups of programs
The purpose of the make utility is to determine automatically which pieces of a large program need to be recompiled, and issue the commands to recompile them.
¿ì¸®¸»·Î Çϸé make´Â ÇÁ·Î±×·¥ ±×·ìÀ» À¯ÁöÇϴµ¥ ÇÊ¿äÇÑ À¯Æ¿¸®Æ¼ÀÌ´Ù. make À¯Æ¿¸®Æ¼ÀÇ ¸ñÀûÀº ÇÁ·Î±×·¥ ±×·ì Áß¿¡¼ ¾î´À ºÎºÐÀÌ »õ·Ó°Ô ÄÄÆÄÀÏ µÇ¾î¾ß ÇÏ´ÂÁö¸¦ ÀÚµ¿ÀûÀ¸·Î ÆÇ´ÜÇØ¼ ÇÊ¿äÇÑ Ä¿¸Çµå(gcc µûÀ§)¸¦ ÀÌ¿ëÇØ¼ ±×µéÀ» ÀçÄÄÆÄÀÏ ½ÃŲ´Ù°í µÇ¾î ÀÖ´Ù.
make´Â ÀÏ·ÃÀÇ ÇÁ·Î±×·¥ °³¹ß¿¡¸¸ ¾²ÀÌÁö ¾Ê°í, ÄÄÆÄÀÏ·¯Ã³·³ ÀÏÁ¾ÀÇ ¸í·É¾î ¹æ½ÄÀ¸·Î 󸮵Ǵ ¸ðµç °÷¿¡¼ ¾²ÀÏ ¼ö°¡ ÀÖ´Ù. °¡·É latex¿Í °°Àº °æ¿ìµµ .tex ÆÄÀÏ¿¡¼ .dvi ÆÄÀÏÀ» ¸¸µé°í ´Ù½Ã .ps ÆÄÀÏ·Î ¸¸µå´Â °úÁ¤À» make¸¦ »ç¿ëÇØ¼ °£´ÜÇÏ°Ô ¸¸µé ¼ö°¡ ÀÖ´Ù.
--------------------------------------------------------------------
°í - ½±°Ô ¸»ÇÏ¸é ´ÙÀ½°ú °°Àº °æ¿ì¿¡ make ¸¦ ¾²¸é À¯¸®ÇÕ´Ï´Ù.
. ÀÔ·ÂÆÄÀÏÀÌ ¹Ù²î¸é ÀÚµ¿ÀûÀ¸·Î °á°úÆÄÀÏÀ» ¹Ù²ãÁáÀ½ ÁÁÀ» ¶§. ±â¿ÕÀ̸é Á» Áö´ÉÀûÀ¸·Î ÀÏÀ» ¼öÇàÇÏ°í ¸»ÀÔ´Ï´Ù.
. À§ÀÇ latex ÆÄÀÏó·³ ÀÚµ¿ÀûÀ¸·Î ÇÁ·Î±×·¥ÀÌ ¼öÇàÀÌ µÇ¾úÀ¸¸é ÁÁÀ» ¶§.(batchÀÇ °³³äÀÌÁÒ)
make´Â À§ÀÇ µÎ °¡Áö °³³äÀ» ¸ðµÎ Æ÷ÇÔÇϰí ÀÖ´Ù°í º¾´Ï´Ù. º¸Åë ¸®´ª½º ÇÁ·Î±×·¥¿¡¼ make all Çϸé ÀÚ¼¼ÇÑ ³»¸·Àº ¸ð¸£Áö¸¸ ÀڱⰡ ¾Ë¾Æ¼ ´ÙÇÏÁÒ.. ±× ´ÙÀ½ÀÌ make install À̱¸¿ä..
--------------------------------------------------------------------
GNU make´Â º¸Åë GNUmakefile, Makefile, makefile Áß¿¡¼ Çϳª°¡ ÀÖÀ¸¸é ±× ÆÄÀÏÀ» ÀÐ°Ô µÈ´Ù. ÇÏÁö¸¸ ÀϹÝÀûÀ¸·Î MakefileÀ» ÃßõÀ» ÇÏ°Ô µÇ´Âµ¥ ±× ÀÌÀ¯´Â ¿ì¼± GNUmake fileÀº ±âÁ¸ÀÇ make¿¡¼ ÀνÄÀ» ¸øÇÑ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ°í, makefileÀº º¸Åë ¼Ò½ºÆÄÀÏ¿¡ ¹¯Çô¼ Àß ¾Èº¸ÀÌ°Ô µÇ±â ¶§¹®ÀÌ´Ù.
MakefileÀº make°¡ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï ÀÏÁ¾ÀÇ ½© ½ºÅ©¸³Æ® ¾ð¾î °°ÀÌ µÇ¾î ÀÖ´Ù.(makefile database¶ó°íµµ ÇÑ´Ù) ÀÌ ÆÄÀÏ¿¡´Â °á°ú ÆÄÀÏÀ» »ý¼º½Ã۱â À§ÇÑ ÆÄÀÏµé °£ÀÇ °ü°è, ¸í·É¾î µîÀ» ±â¼úÇϰí Àִµ¥ ÀÌ °ÁÂÀÇ ÁÖµÈ ¸ñÀûÀÌ ¹Ù·Î MakefileÀÇ ÀÛ¼º¿¡ ÀÖ´Ù.
1.2 makeÀÇ Çʿ伺
¿ì¼±Àº makeÀÇ »ç¿ëÀ» ÇÁ·Î±×·¥ °³¹ß°ú À¯ÁöÂÊÀ¸·Î ±¹ÇѽÃ۱â·Î ÇÑ´Ù. º¸Åë ¶óÀμö°¡ ¸¹¾ÆÁö¸é ¿©·¯ °³ÀÇ ÆÄÀÏ·Î ³ª´©¾î(¸ðµâ·Î ³ª´©¾î) °³¹ßÀ» ÇÏ°Ô µÈ´Ù. À̵éÀº ¾Ë°Ô ¸ð¸£°Ô ¼·Î °ü°è¸¦ °¡Áö°í Àִµ¥, ¾î´À Çϳª¸¦ Çʿ信 ÀÇÇØ ¹Ù²Ù°Ô µÇ¾úÀ» ¶§ ±× ÆÄÀÏ¿¡ ÀÖ´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â ´Ù¸¥ ÆÄÀϵµ »õ·Ó°Ô ÄÄÆÄÀÏ µÇ¾î¾ß ÇÑ´Ù.
ÇÏÁö¸¸ ÆÄÀϼö°¡ ¸¹Àº °æ¿ì À̸¦ ÀÏÀÏÀÌ ÄÄÆÄÀÏÀ» ÇÏ°Ô µÉ ¶§, ±× ºÒÆíÇÔ°ú ÇÔ²² ÄÄÆÄÀÏ ÇÏÁö ¾Ê¾Æµµ µÉ °Íµµ ÄÄÆÄÀÏÀ» ÇÏ°Ô µÉ ¼öµµ ÀÖ°í, ÄÄÆÄÀÏ ÇØ¾ß ÇÒ °Íµµ ¹Ìó ¸øÇÏ°Ô µÇ´Â °æ¿ì°¡ ÀÖ´Ù. (¸µÅ©¿¡·¯ÀÇ ¿øÀÎÀÌ µÇ±âµµ Çϴµ¥ ¿¡·¯ÀÇ ¿øÀÎÀ» Á¦´ë·Î ã±â°¡ ÈûÀÌ µç´Ù.)
¾Õ¿¡¼µµ ¾ê±âÇßµíÀÌ ÀÌ·± »óȲ¿¡¼ Áö´ÉÀûÀ¸·Î °ü°è ÀÖ´Â °Í¸¸ »õ·Ó°Ô °»½ÅÀ» ÇÒ Çʿ䰡 ÀÖÀ» ¶§ make ÆÄÀÏÀº ºûÀ» ¹ßÇÏ°Ô µÈ´Ù.
2. °£´ÜÇÑ Makefile
2.1 Makefile ÀÇ ³»ºÎ±¸¼º
MakefileÀº ±âº»ÀûÀ¸·Î ¾Æ·¡¿Í °°ÀÌ ¸ñÇ¥(target), ÀÇÁ¸°ü°è(dependency), ¸í·É(command)ÀÇ 3°³·Î ÀÌ·ç¾îÁø ±âºÐÀûÀÎ ±ÔÄ¢(rule)µéÀÌ °è¼ÓÀûÀ¸·Î ³ª¿µÇ¾î ÀÖ´Ù°í ºÁµµ ¹«¹æÇÏ´Ù. make°¡ Áö´ÉÀûÀ¸·Î ÆÄÀÏÀ» °»½ÅÇÏ´Â °Íµµ ¸ðµÎ ÀÌ °£´ÜÇÑ ±ÔÄ¢¿¡ ÀÇÇϱ⠶§¹®ÀÌ´Ù.
target ... : dependency ...
command
...
...
¿©±â¼ ¸ñÇ¥(target) ºÎºÐÀº ¸í·É(command)ÀÌ ¼öÇàÀÌ µÇ¾î¼ ³ª¿Â °á°ú ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù. ´ç¿¬È÷ ¸ñÀûÆÄÀÏ(object file)À̳ª ½ÇÇàÆÄÀÏÀÌ µÉ °ÍÀÌ´Ù.
¸í·É(command)ºÎºÐ¿¡ Á¤ÀÇµÈ ¸í·ÉµéÀº ÀÇÁ¸°ü°è(dependency)ºÎºÐ¿¡ Á¤ÀÇµÈ ÆÄÀÏÀÇ ³»¿ëÀÌ ¹Ù²î¾ú°Å³ª, ¸ñÇ¥ºÎºÐ¿¡ ÇØ´çÇÏ´Â ÆÄÀÏÀÌ ¾øÀ» ¶§ À̰÷¿¡ Á¤ÀÇµÇ °ÍµéÀÌ Â÷·Ê´ë·Î ½ÇÇàÀÌ µÈ´Ù. ÀϹÝÀûÀ¸·Î ½©»ó¿¡¼ ¾µ ¼ö ÀÖ´Â ¸ðµç ¸í·É¾îµéÀ» »ç¿ëÇÒ ¼ö°¡ ÀÖÀ¸¸ç bash¿¡ ±â¹ÝÇÏ´Â ½© ½ºÅ©¸³Æ®µµ Áö¿øÇÑ´Ù.
--------------------------------------------------------------------
Âü°í - Âü°í·Î ¸ñÇ¥ºÎºÐ¿¡´Â °á°úÆÄÀϸ¸ ¿Ã ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Ï°í, º¸Åë make clean¿¡¼¿Í °°ÀÌ °£´ÜÇÑ ·¹À̺í(label) ±â´ÉÀ» Á¦°øÇϱ⵵ ÇÑ´Ù.
¸í·É ºÎºÐÀº ²À TAB ±ÛÀÚ·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù. ±×³É ½ºÆäÀ̽ºµîÀ» »ç¿ëÇϸé make ½ÇÇà Áß¿¡ ¿¡·¯°¡ ³´Ù. ¸í½ÉÇϼ¼¿ä. make°¡ ¸í·É¾îÀÎÁö ¾Æ´ÑÁö¸¦ TAB °¡Áö°í ±¸º°Çϱ⠶§¹®ÀÌÁÒ
--------------------------------------------------------------------
2.2 Makefile ¿¹Á¦.
°£´ÜÇÑ MakefileÀ» ¸¸µé¾î º»´Ù. ¿ì¸®°¡ ¸¸µé·Á°í ÇÏ´Â ÇÁ·Î±×·¥Àº main.c read.c write.c ·Î ±¸¼ºµÇ¾î ÀÖ°í ¸ðµÎ io.h ¶ó´Â Çì´õÆÄÀÏÀ» »ç¿ëÇÑ´Ù°í °¡Á¤ÇÑ´Ù. (±¸¼ºÀ» °£´ÜÈ ½Ãŵ½Ã´Ù.) À̵éÀ» °¢°¢ ÄÄÆÄÀÏ ÇØ¼ test¶ó´Â ½ÇÇàÆÄÀÏÀ» »ý¼º½ÃŲ´Ù.
% gcc -c main.c
% gcc -c read.c
% gcc -c write.c
% gcc -o test main.o read.o write.o
À§ÀÇ ¹æ½ÄÀº make¸¦ ¾²Áö ¾Ê°í ±×³É ¸í·É¾î¸¦ ÁÖ´Â ¹æ½ÄÀÌ´Ù. ÆÄÀÏÀÇ ¼ö°¡ À۾Ƽ ¿ÀÈ÷·Á ´õ °£´ÜÇÏ°Ô º¸ÀÏ ¼ö ÀÖÀ¸³ª, ÆÄÀÏÀÌ 100°³ Á¤µµ µÈ´Ù°í °¡Á¤Çϸé .... ¾ÆÂñ...
¸®°í ¾Æ·¡´Â À§¿Í ¶È°°Àº ÀÏÀ» ¼öÇàÇÏ´Â Makefile ÀÇ ³»¿ëÀÌ´Ù.
[¿¹Á¦1]
est : main.o read.o write.o
gcc -o test main.o read.o write.o
main.o : io.h main.c
gcc -c main.c
read.o : io.h read.c
gcc -c read.c
write.o: io.h write.c
gcc -c write.c
(´ëÃæ ¾Ë¾Æº¸½Ã°Ú¾î¿ä? , Âü TAB ¹®ÀÚ ¾²´Â°Å ÀÖÁö ¸¶¼¼¿ä)
make´Â MakefileÀÇ ³»¿ëÀ» º¸°í, ³»ºÎÀûÀ¸·Î ¾î¶»°Ô ÆÄÀϵéÀÌ ÀÇÁ¸Çϰí ÀÖ´ÂÁö Á¶»çÇÑ´Ù. À§ÀÇ MakefileÀ» ¹ÙÅÁÀ¸·Î ÀÇÁ¸°ü°è¸¦ ³ªÅ¸³»º¸¸é ¾Æ·¡¿Í °°´Ù.
test°¡ ¸¸µé¾îÁö±â À§Çؼ´Â main.o read.o write.o°¡ ÇÊ¿äÇϰí, °¢°¢ÀÇ ¸ñÀû ÆÄÀϵéÀº ¸ðµÎ ÀÚ½ÅÀÇ ¼Ò½ºÆÄÀϰú io.h¿¡ ÀÇÁ¸ÇÔÀ» ¾Ë ¼ö°¡ ÀÖ´Ù. °¡·É main.c¸¦ °íÃÆ´Ù°í »ý°¢ÇÑ´Ù¸é main.o°¡ ÄÄÆÄÀÏ µÇ¼ ´Ù½Ã »ý±â°í, testµµ ´Ù½Ã ¸µÅ©µÇ¾î¼ °»½ÅµÈ´Ù. ¸¸¾à io.h°¡ ¹Ù²î¾ú´Ù°í °¡Á¤ÇÏ¸é ¸ðµç ÆÄÀϵéÀÌ ÄÄÆÄÀÏ µÇ¾î¼ ¸ñÀûÆÄÀÏÀÌ »ý±â°í, ±×°ÍµéÀÌ ¸µÅ©°¡ µÇ¾î test°¡ »ý±ä´Ù. À§¿Í °°ÀÌ ÆÄÀϵéÀ» ±¸¼ºÇÑ ´ÙÀ½ MakefileÀ» ½ÇÇà½ÃÄѺ¸ÀÚ. MakefileÀÇ ½ÇÇàÀº ±×³É make ¶ó°í Ä¡¸é µÈ´Ù.
% make
gcc -c main.c
gcc -c read.c
gcc -c write.c
gcc -o test main.o read.o write.o <-- OK
--------------------------------------------------------------------
Âü°í - ±×³É Å×½ºÆ®±â ¶§¹®¿¡ read.c write.c io.h´Â ¸ðµÎ ³»¿ë ¾øÀÌ ÆÄÀϸ¸ ¸¸µé¾îµÎ±â·Î Çϰí, main.c¿¡ °£´ÜÈ÷ printf ÇÔ¼ö¸¸ Àû¾îº¾½Ã´Ù. Á¤¸» À§¿Í °°ÀÌ µÊÀ» ½Ç°¨ÇÒ ²¨¿¡¿ä.. ½Å±âÇϰÔ.
--------------------------------------------------------------------
2.3 ¸ÅÅ©·ÎÀÇ »ç¿ë
°£´ÜÇÑ ¸ÞÅ©·Î ±â´ÉÀ» »ç¿ëÇØº¸ÀÚ. main.o read.o write.o¶ó´Â °ÍÀ» OBJECTS ¶ó´Â ¸ÅÅ©·Î·Î ¹Ù²Ù´Â °ÍÀÌ ¾Æ·¡ÀÇ [¿¹Á¦2]¿¡ ³ª¿ÍÀÖ´Ù.
[¿¹Á¦2]
OBJECTS = main.o read.o write.o
test : $(OBJECTS)
gcc -o $(OBJECTS)
main.o : io.h main.c
gcc -c main.c
read.o : io.h read.c
gcc -c read.c
write.o: io.h write.c
gcc -c write.c
À§¿¡¼ º¸´Ù½ÃÇÇ ¸ÅÅ©·Î´Â ±×³É ÇÁ·Î±×·¥ © ¶§¿Í °°ÀÌ »ç¿ëÇØ¼ °ªÀ» ´ëÀÔÇÑ´Ù. ´ë½Å »ç¿ëÇÒ ¶§´Â ¹Ýµå½Ã $(..) ¾È¿¡ ³Ö¾î¼ »ç¿ëÇÑ´Ù. ¸ÅÅ©·Î ġȯÀ» À§ÇÑ Æ¯¼öÇÑ ¹æ¹ýÀÌ ¾Æ´Ò±î.. È÷.. ¸ÅÅ©·ÎÀÇ »ç¿ë¹ýÀº À§¿Í °°ÀÌ °£´ÜÇϹǷΠ´Ù¾çÇÏ°Ô Á¤ÀÇÇØ¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸ÅÅ©·Î¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ´ÙÀ½ °Á¿¡¼ ¾ð±ÞÇϱâ·Î ÇÑ´Ù.
2.4 ·¹À̺íÀÇ »ç¿ë
¸ñÇ¥ºÎºÐ¿¡ ÇØ´çÇÏ´Â ºÎºÐÀÌ ±×³É ·¹À̺í°ú °°ÀÌ »ç¿ëµÉ ¼öµµ ÀÖ´Ù°í ÀÌ¹Ì ¼³¸íÇÏ¿´´Ù. [¿¹Á¦2]¿¡´Ù°¡ ¸ñÀûÆÄÀϵéÀ» ¸ðµÎ »èÁ¦ÇÏ´Â ¸í·É¾î¸¦ Ãß°¡Çϱâ·Î ÇÑ´Ù.
¿¹Á¦3]
OBJECTS = main.o read.o write.o
test : $(OBJECTS)
gcc -o $(OBJECTS)
main.o : io.h main.c
gcc -c main.c
read.o : io.h read.c
gcc -c read.c
write.o: io.h write.c
gcc -c write.c
clean :
rm $(OBECTS)
·¹À̺í·Î »ç¿ëµÉ ¶§´Â ´ç¿¬È÷ ÀÇÁ¸°ü°è ºÎºÐÀº ¾ø¾îµµ µÈ´Ù. ±×¸®°í cleanÀ» ½ÇÇà½ÃŰ·Á¸é ¾Æ·¡¿Í °°ÀÌ ÇÑ´Ù.
% make clean
rm main.o read.o write.o <-- OK