¸ÞÀÎ ÄÁÅÙÃ÷·Î °¡±â


IBM ±â¼úÁ¤º¸

Application development on AIX

±è¼¼Èñ À̸ÞÀÏ·Î º¸³»±â kseh@kr.ibm.com

¾î¶² UNIX½Ã½ºÅÛ¿¡¼­µµ ¿ø½ÃÄÚµå·ÎºÎÅÍ ÇÁ·Î±×·¥À» °³¹ßÇÏ¿© À̰ÍÀ» ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ½ÇÇà °¡´ÉÇÑ ÇÁ·Î±×·¥À» ¸¸µé°í ÇÁ·Î±×·¥ÀÇ ¿À·ù¸¦ ¼öÁ¤ÇØ ³ª°¡´Â °úÁ¤Àº ºñ½ÁÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. AIX¿¡¼­´Â ÀϹÝÀûÀ¸·Î »ç¿ëÇÏ´Â Open Source Environment°¡ ¾Æ´Ñ AIX°íÀ¯ÀÇ °³¹ßÅøÀ» »ç¿ëÇϹǷÎ, AIX¿¡¼­ °³¹ßÀ̳ª Æ÷ÆÃ ÀÛ¾÷À» ÇÏ·Á´Â »ç¿ëÀÚ´Â °¢°¢ÀÇ °³¹ßÅøÀÇ À̸§À» ¼÷ÁöÇÏ°í ¸í·É¾î »ç¿ë¹ýÀ» ¾Ë¾ÆµÎ¾î¾ß ÇÒ Çʿ䰡 ÀÖ´Ù. ±×·¯³ª ÀüÇô ´Ù¸¥ ȯ°æÀº ¾Æ´Ï¹Ç·Î, ¸¸¾à Open Source Environment¿¡ Àͼ÷ÇÑ °³¹ßÀÚ¶ó¸é AIXÀÇ °³¹ßȯ°æ¿¡ Àͼ÷ÇØÁö´Âµ¥ ±×´ÙÁö ¿À·£ ½Ã°£ÀÌ °É¸®Áö ¾ÊÀ» °ÍÀ¸·Î ±â´ëµÈ´Ù.

ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ °³¹ß°úÁ¤Àº ´ÙÀ½°ú °°´Ù.

C, C++, PASCAL, FORTRANµîÀ¸·Î ÀÛ¼ºµÈ ¿ø½Ã ÇÁ·Î±×·¥
¡éCompiler
Object Code
¡éLiker
Executable Code
¡éDebugger
¿À·ù¸¦ ¼öÁ¤ÇÑ ¿ÏÀüÇÑ ½ÇÇàÆÄÀÏ

¿©±â¿¡¼­´Â AIX¿¡¼­ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯¿Í µð¹ö°ÅÀÇ »ç¿ë¹ý, ±×¸®°í makeÆÄÀÏÀ» ¸¸µå´Â ¹ý¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸°Ú´Ù.

 Source Code Compile    Compile Management - Make    Application Debugging

 Benchmark Test    ºÎ·Ï

Source Code Compile

¼Ò½º Äڵ带 compileÇϱâÀ§Çؼ­´Â ¹Ýµå½Ã compiler°¡ ÇÊ¿äÇÏ´Ù.
AIX¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â compiler·Î´Â FORTRAN compilerÀÎ xlf, PASCAL CompilerÀÎ xlp, C++À» compileÇÒ ¼ö ÀÖ´Â xlC , ±×¸®°í °¡Àå ³Î¸® »ç¿ëµÇ´Â C compilerÀÎ cc,xlc,c89°¡ ÀÖ´Ù. ÀÌ Áß C compiler cc,xlc,c89 ´Â ½ÇÁ¦·Î´Â °°Àº compiler¸¦ °¡¸®Å°°í ÀÖÁö¸¸ ¾î¶² À̸§À¸·Î ºÎ¸£´Â°¡¿¡ µû¶ó ´Ù¸¥ ½ÄÀ¸·Î source code¸¦ ÇØ¼®Çϸç, compile option ¼³Á¤ÀÌ ¾à°£ ´Ù¸£´Ù.
cc·Î ½ÇÇà½Ã۸é Kernighan and Ritchie formatÀ¸·Î ÇØ¼®Çϸç, xlc³ª c89·Î ½ÇÇà½Ã۸é ANSI C formatÀ¸·Î ÇØ¼®ÇÑ´Ù. °¢°¢ÀÇ compiler¸¦ ºÎ¸¦ ¶§ ¾î¶² ½ÄÀ¸·Î ½ÇÇà½Ãų Áö¿¡ ´ëÇÑ optionÀº /etc/xlC.cfg¿¡ ÀûÇôÀÖ´Ù. (5.0 compiler°°Àº °æ¿ì´Â /etc/vac.cfg¿¡ ÀÖ´Ù)

a) cc ±âº»»ç¿ë¹ý

$ cc test.c
test.c¸¦ compileÇÏ¿© a.outÀ¸·Î ¸¸µç´Ù.

$ cc -c test.c
test.c¸¦ compileÇÏ¿© test.o ·Î ¸¸µç´Ù.

$ cc -o test test.c /usr/lib/libm.a
test¶ó´Â À̸§ÀÇ ½ÇÇàÆÄÀÏ·Î test.c¸¦ compileÇϸç libm.a¿Í link½ÃŲ´Ù.

b) cc¿¡¼­ »ç¿ëÇÏ´Â Áß¿äÇÑ optionµé

-g ¼Ò½º levelÀÇ µð¹ö±ëÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù
-O optimize optionÀ̸ç -O2¿Í °°´Ù
-O3 memory ¿Í compile time intensive optimizationÀ» ¼öÇà. ´õ °­·ÂÇÑ ÃÖÀûÈ­¸¦ À§ÇØ ÇÁ·Î±×·¥ÀÇ semanticÀ» ¹Ù²Ù±âµµ ÇÑ´Ù.
-qstrict optionÀ» »ç¿ëÇÏ¿© semanticÀº ¹Ù²ÙÁö ¸øÇϵµ·Ï ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù
-O4 -O4 -O3 + -qipa ¿Í °°´Ù. Ç÷§Æû¿¡ °¡Àå ÃÖÀûÈ­µÈ ÃÖÀûÈ­¸¦ ¼öÇàÇÑ´Ù.
Àû´çÇÑ ¼öÁØÀÇ optimization
-qipa interprocedural analysis
-Q ÁöÁ¤µÈ ¼ýÀÚ¸¸Å­ÀÇ ±æÀÌÀÇ ÇÔ¼ö´Â inlineÀ» ½ÃÄѼ­ ÃÖÀûÈ­ÇÑ´Ù.
Default·Î 15ÁÙ ÀÌÇÏÀÇ ÇÔ¼ö´Â inline½ÃŲ´Ù ex) -Q=12
-l linkÇÒ libraryÀ̸§ ex) -l libkey.a
-L library path¸¦ ÁöÁ¤ÇÑ´Ù ex) -L/usr/lib
-i include file directory¸¦ ÁöÁ¤ÇÑ´Ù
-S assembler fileÀ» »ý¼ºÇÑ´Ù
-v verbose option
-p prof¸¦ »ç¿ëÇÏ¿© runtime profilingÀ» °¡´ÉÇϵµ·Ï ÇÑ´Ù.
¾î¶² ¸ðµâ¿¡¼­ CPU timeÀÌ ¾ó¸¶³ª °É·È´ÂÁö ¸Þ¸ð¸® »ç¿ë·®Àº ¾ó¸¶³ª µÇ´ÂÁö µîÀ» ÃøÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î tuning½Ã »ç¿ëÇÒ ¼ö ÀÖ´Ù
-D preprocessor¿¡¼­ »ç¿ëÇÒ symbolÀ» Á¤ÀÇÇÑ´Ù ex) -DMAX_NUM
-U symbolÀ» undefineÇÑ´Ù
-M makeÀÇ dependency¿¡ Æ÷Ç﵃ Á¤º¸µéÀ» ¸¸µé¾î ³½´Ù.
OutputÀº [filename].u file·Î Ãâ·ÂµÈ´Ù


Compiler¿¡¼­ ÇÁ·Î±×·¥¿¡ ´ëÇØ ¸¸µé¾î³»´Â Á¤º¸¸¦ ƯÁ¤ listÆÄÀÏ·Î º¸³¾ ¼ö ÀÖÀ¸¸ç Á¤º¸´Â sourcename.lst¿¡ µé¾î°£´Ù.

-qattr    SymbolÀÇ attributeÁ¤º¸
-qxref    Cross reference listing
-qlist    object codeÀÇ list
-qlistopt    ½ÇÁ¦ ¿µÇâÀ» ÁÖ´Â compiler optionÀÇ list


Compile Management - Make

a) Why Make?

C·Î ÀÛ¼ºµÈ source code¸¦ ½ÇÁ¦ ½ÇÇà °¡´ÉÇÑ ÇÁ·Î±×·¥À¸·Î ¸¸µé±â À§Çؼ­´Â Å©°Ô ´ÙÀ½°ú °°Àº µÎ ´Ü°è°¡ ÇÊ¿äÇÏ´Ù.

1. c compiler·Î compile°úÁ¤À» °ÅÃÄ object programÀ» ¸¸µç´Ù.
2. libraryÆÄÀÏ ¹× °ü·Ã ÀÖ´Â ÆÄÀϳ¢¸® linkingÀÛ¾÷À» ÇÑ´Ù.

À̶§ °³¹ß°úÁ¤¿¡¼­ ²÷ÀÓ¾øÀÌ source programÀÇ ¼öÁ¤ ¹× Àç ÄÄÆÄÀÏ ÀÛ¾÷ÀÌ ¹ß»ýÇÑ´Ù. ±× »Ó ¾Æ´Ï¶ó Çö´ëÀÇ Ä¿´Ù¶õ ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇÏ´Â ÇÁ·Î±×·¥Àº ¿©·¯ »ç¶÷ÀÌ °°ÀÌ ÀÛ¾÷ÇÏ´Â °æ¿ì°¡ ¸¹À¸¸ç, ÇÑ °³ÀÇ ÆÄÀÏÀÌ ¿©·¯ °³ÀÇ ÆÄÀÏÀÌ ¿¬°üµÇ¾î ÇÑ ºÎºÐÀÇ ¼öÁ¤ÀÌ ´Ù¸¥ ÆÄÀÏÀÇ ¿©·¯ ºÎºÐ¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.
µû¶ó¼­ ÀÌ º¹ÀâÇÑ °úÁ¤À» Á»´õ ½±°Ô °ü¸®Çϵµ·Ï Çϸç, °³¹ßÀÚ°¡ ÇÁ·Î±×·¥ÀÇ ½ÇÇàȯ°æ°ú ¹«°üÇÏ°Ô ÇÁ·Î±×·¥ÀÇ ¿Ã¹Ù¸¥ ¼öÇà¿¡¸¸ Èû¾µ ¼ö ÀÖµµ·Ï ÇÏ´Â utilityÀÎ make°¡ ÇÊ¿äÇÏ´Ù. ÇÁ·Î±×·¥À» ±¸¼ºÇÏ´Â ÆÄÀÏÀÇ ¿¬°ü°ü°è ¹× ±¸Á¶´Â ¶Ç ´Ù¸¥ ÆÄÀÏÀÇ ÇüÅ·Πmake ÇÁ·Î±×·¥¿¡ Àü´ÞÇÏ°í ½ÇÁ¦ ÇÁ·Î±×·¥ÀÇ °ü¸®´Â make°¡ ´ã´çÇϵµ·Ï ÇÑ´Ù. ÀÌ·¯ÇÑ ¸ñÀûÀ¸·Î ÆÄÀϰ£ÀÇ ¿¬°ü¼ºÀ» ±â·ÏÇÑ ÆÄÀÏÀÌ Makefile ȤÀº makefileÀÌ´Ù.

b) make ±âº»»ç¿ë¹ý

$ make
MakefileÀ̳ª makefileÀÌ ÇöÀç µð·ºÅ丮¿¡ ÀÖ´Â °æ¿ì ÀÚµ¿À¸·Î ±× ÆÄÀÏÀ» Àо ½ÇÇàÇÑ´Ù

$ make [target]
Makefile³»ÀÇ Æ¯º°ÇÑ targetÀ̳ª actionÀ» ÁöÁ¤ÇÏ´Â °æ¿ì make ´ÙÀ½¿¡ labelÀÇ À̸§À» ¾´´Ù.
ex) make clean ; make install

$ make -f [filename]
makefile·Î MakefileÀ̳ª makefileÀÌ ¾Æ´Ñ ´Ù¸¥ ÆÄÀÏÀ̸§À» »ç¿ëÇßÀ» ¶§ »ç¿ëÇÑ´Ù.

$ make -s
makefileÁß°£¿¡ Ãâ·ÂµÇ´Â outputÀÌ º¸±â ½ÈÀ¸¸é À§ÀÇ ¿¹Ã³·³ »ç¿ëÇÑ´Ù.

c) MakefileÀÇ ±âº»¹®¹ý

Target : precondition
preconditionÀº target¿¡ ÀÇÁ¸ÇÏ´Â ÆÄÀÏÀ» ¸»ÇÑ´Ù. Áï targetÀÌ ¹Ù²î¸é Àç compileÇØ¾ß ÇÏ´Â ÆÄÀϵéÀ» ¸»ÇÑ´Ù.
[TAB]action
shell·Î Àü´ÞµÇ¾î ½ÇÇàµÇ´Â ÇàÀ̸ç Çϳª ÀÌ»óÀÇ actionÀº ; ·Î ºÐ¸®ÇÑ´Ù.
ÇÑ ÇàÀÇ actionÀº °íÀ¯ÀÇ shell environment¸¦ °¡Áö¸ç ´Ù¸¥ action¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù.
´Ü Directory´Â HOMEº¯¼ö¿¡ ÀÇÁ¸ÇÏÁö ¾Ê°í make¸¦ ½ÇÇàÇÑ µð·ºÅ丮¸¦ À¯ÁöÇÑ´Ù.
EX) cd /user; rm a.out;

ÀÌ °æ¿ì /userÀÇ a.outÀ» Áö¿ì´Â °ÍÀÌ ¾Æ´Ï¶ó ÇöÀç make¸¦ ½ÃÀÛÇÑ µð·ºÅ丮ÀÇ a.outÀ» »èÁ¦ÇÏ°Ô µÈ´Ù. ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸·Á¸é
cd /user; rm a.out
ȤÀº
cd /user; ¡¬
rm a.out;
À̶ó°í ÇÏ¿© directory¸¦ À¯ÁöÇÒ ¼ö ÀÖ´Ù.

ÀÌ µÎ °¡ÁöÀÇ ±âº» ¹®¹ý ¿Ü¿¡ targetºÎºÐ¿¡ label¸¸ ÀÖ´Ù¸é makeÀÇ targetÀ¸·Î ÇØ¼®ÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.
EX) make all , make install , make clean

ÁÖ¼®¹®À» ´Þ ¶§´Â ¾Õ¿¡ # À» ¾²¸é ÁÙÀÌ ¹Ù²ð ¶§±îÁö ÁÖ¼®À¸·Î ÇØ¼®ÇÑ´Ù.
EX) # THIS IS A COMMENT

actionÀÇ Áß°£Áß°£¿¡ ³ª¿À´Â ¸Þ½ÃÁö°¡ ³Ê¹« ¸¹¾Æ¼­ ÇØµ¶ÀÌ ¾î·Á¿ï ¶§´Â ¸í·É¾îÀÇ ¾ÕºÎºÐ¿¡ @À» ºÙÀÌ¸é µÈ´Ù.
EX) @cc -o test ${SOURCE}

d) °£´ÜÇÑ Makefile ÀÛ¼ºÇϱâ

ProgramÀ̶ó´Â ÇÁ·Î±×·¥À» compileÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ.
±¸¼ºÆÄÀÏÀº input.c, sum.c, mean.c, output.cÀ̸ç output.c´Â XYplane.c¸¦ ÂüÁ¶Çϸç, Àüü ½ÇÇàÆÄÀÏÀº /usr/lib/libc.aÀ» ÂüÁ¶ÇÑ´Ù.
ProgramÀ̶ó´Â applicationÀ» ÀÛ¼ºÇÏ·Á¸é ´ÙÀ½°ú °°Àº °úÁ¤À» ¸Å¹ø ÀÏÀÏÀÌ Å¸ÀÌÇÎÇØ¾ß ÇÑ´Ù.

$ cc -c input.c
$ cc -c sum.c
$ cc -c mean.c
$ cc -o output.o output.c XYplane.c 
$ cc  -o program input.o sum.o mean.o output.o ¡¬
	/usr/lib/libc.a


À§ÀÇ °úÁ¤À» ÀÚµ¿È­ÇÏ´Â MakefileÀº ´ÙÀ½Ã³·³ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

¨ç program : input.o sum.o mean.o output.o 				    
¨è 	         cc -o program input.o sum.o mean.o output.o ¡¬			
¨é	         /usr/lib/libc.a							                
¨ê output.o : output.c XYplane.c						        
¨ë	          cc -c output.o output.c XYplane.c				        
¨ì input.o : input.c							                
¨í	         cc -c input.c							                
¨î sum.o : sum.c								               
¨ï	       cc -c sum.c							                    
¨ð mean.o :mean.c								                
¨ñ	       cc -c mean.c							                


ÀÌÁ¦ À§ÀÇ MakefileÀ» ÇÑ ÁÙ¾¿ »ìÆìº¸ÀÚ.
¨ç programÀ» ¸¸µé±â À§ÇØ input.o, sum.o, mean.o, output.o ³× °³ÀÇ ÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù.
¨è programÀ» ¸¸µé±â À§Çؼ­ cc compiler·Î ÇÊ¿äÇÑ ³× °³ÀÇ ÆÄÀÏÀ» ¸ðµÎ compileÇÑ´Ù.
¨é 2¹øÂ° ÁÙ¿¡¼­ ÆÄÀÏÀÇ À̸§À» ´Ù ¾µ ÀÚ¸®°¡ ¸ðÀÚ¶úÀ¸¹Ç·Î ¡¬ À» Ä¡°í ´ÙÀ½ ÁÙ±îÁö ¿¬ÀåÇß´Ù.
   ¿ª½Ã programÀ» ¸¸µé±â À§Çؼ­´Â ³× °³ÀÇ object file¿Ü¿¡µµ libc.a°¡ ÇÊ¿äÇÏ´Ù.
¨ê programÀ» ¸¸µé±â À§ÇØ ÇÊ¿äÇÑ ³× °³ÀÇ ÆÄÀÏ Áß output.o¸¦ ¸¸µé±â À§Çؼ­´Â µÎ°³ÀÇ c ÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù.
¨ë output.o¸¦ ¸¸µé±â À§Çؼ­´Â ´ÙÀ½°ú °°Àº ¸í·É¾î¸¦ ¼öÇàÇØ¾ß ÇÑ´Ù.
   cc·Î output.c¿Í XYplance.c¸¦ compileÇÑ´Ù.
¨ì input.o¸¦ ¸¸µé±â À§ÇØ input.c°¡ ÇÊ¿äÇÏ´Ù.
¨í input.o¸¦ ¸¸µé±â À§Çؼ­ cc·Î input.c¸¦ compileÇØ¾ß ÇÑ´Ù.
   ÀÌÈÄ´Â ºñ½ÁÇÑ ³»¿ëÀÇ ¹Ýº¹À̹ǷΠ»ý·«Çϵµ·Ï ÇϰڴÙ.

Âü°í·Î MakefileÀº Å©°Ô macro/¸í·É¾î Á¤ÀÇ/dependencyÀÇ ¼¼ ºÎºÐÀ¸·Î ³ª´©¾î ÀÛ¼ºÇϴµ¥, À̶§ Makefile µÞºÎºÐ¿¡ ³ª¿À´Â dependency¸¦ ÀÛ¼ºÇÒ ¶§ ÆÄÀϰ£ÀÇ ÂüÁ¶°ü°è¸¦ ÀÏÀÏÀÌ ¸¸µé¾î³»±â°¡ ½±Áö ¾Ê´Ù. ÀÌ °úÁ¤À» ½±°Ô Çϱâ À§ÇØ compilerÀÇ ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

$ cc -M test.c
test.u·Î ÆÄÀÏÀÇ ÀÇÁ¸°ü°è°¡ Ãâ·ÂµÇ¸é, ÀÌ ÆÄÀÏÀÇ ³»¿ëÀ» ±×´ë·Î cut-and-pasteÇÏ¿© MakefileÀÇ ³¡ºÎºÐ¿¡ ³Ö¾îÁÖ¸é µÈ´Ù. ±×·¯¸é test.c°¡ ¾î¶² ÆÄÀÏÀ» ÂüÁ¶ÇÏ´ÂÁö header file°ú ¼Ò½º ÆÄÀÏÀÇ dependency¸¦ ¾Ë ¼ö ÀÖÀ¸¹Ç·Î, ±× ÁßÀÇ ÇÑ °³ ÀÌ»óÀÇ ÆÄÀÏÀÌ º¯°æµÇ¸é ±×¶§ test.c¸¦ ´Ù½Ã compileÇÏ¿© resourceÀÇ ³¶ºñ¸¦ ¸·À» ¼ö ÀÖ´Ù.
gccmakedep°°Àº ÇÁ·Î±×·¥À» »ç¿ëÇϸé makefile¿¡ ÀÚµ¿ÀûÀ¸·Î dependency¸¦ ºÙ¿© ÁÙ ¼ö ÀÖ´Ù.

dep :
gccmakedep $(SRCS)
$ make dep

e) ¸ÅÅ©·Î

ºñ½Áºñ½ÁÇÑ ¸í·É¾î³ª ÆÄÀÏÀÇ À̸§À» macro·Î ¸¸µé¾î¼­ ±â¾ï½Ã۸é ÇÁ·Î±×·¥ÀÇ À¯Áöº¸¼ö¿¡ µµ¿òÀÌ µÉ »Ó¸¸ ¾Æ´Ï¶ó º¹ÀâÇÑ ÀÛ¾÷À» °£´ÜÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.

¸ÅÅ©·Î À̸§ = ¹®ÀÚ¿­

¸ÅÅ©·Î¸¦ »ç¿ëÇÒ ¶§´Â
${¸ÅÅ©·Î À̸§}À̳ª $(¸ÅÅ©·Î À̸§)À¸·Î »ç¿ëÇϸç, À§ÀÇ ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÒ ¶§ ¿À¸¥ÂÊ¿¡ ´ëÀÔµÈ ³»¿ëÀÌ ±×´ë·Î ġȯµÈ´Ù.

EX) 
CC=cc
CFLAGS= -g -O
SOURCE = a.c b.c c.c d.c
output : ${SOURCE}
	   ${CC}	${CFLAGS} -o output ${SOURCE}


¸ÅÅ©·Î·Î Á¤ÀÇµÈ ¹®ÀÚ¿­Àº ƯÁ¤ºÎºÐÀÌ ´Ù¸¥ ¹®ÀÚ¿­·Î ¹Ù²ð ¼öµµ ÀÖ´Ù.

SOURCE = a.c b.c c.c d.c
OBJECTS = ${SOURCE:.c=.o} <- OBJECTS = a.o b.o c.o d.o

´ÙÀ½ MakefileÀº ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¿© Á»´õ º¸±â ÁÁ°Ô ¸¸µé¾ú´Ù.

OBJECTS = main.o read.o write.o
test : $(OBJECTS)
                gcc -o test $(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)


Âü°í)
Áß¿ä ¸ÅÅ©·Î ÀÏÀÏÀÌ updateÇϱâ Èûµé°Å³ª ¸¹ÀÌ »ç¿ëÇÏ´Â °ÍÀº Ư¼ö¹®ÀÚ¸¦ »ç¿ëÇÏ¿© ¸ÅÅ©·Î·Î ¾²°í ÀÖ´Ù. MakefileÀ» ¾î·Æ°Ô º¸À̵µ·Ï ÇÏ´Â °¡Àå Å« ¿øÀÎÀ̹ǷΠ°¢°¢ÀÇ Àǹ̸¦ Àß ¾Ë¾ÆµÎ¾î¾ß ÇÑ´Ù.

$* targetº¸´Ù ³ªÁß¿¡ º¯°æµÈ preconditionµéÀÇ ÆÄÀÏÀ̸§.
È®ÀåÀÚ´Â Æ÷ÇÔµÇÁö ¾Ê´Â´Ù .SUFFIXESºÎºÐ¿¡¼­¸¸ »ç¿ëÇÏ°í º¸Åë ¶§´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù.
$< targetº¸´Ù ³ªÁß¿¡ º¯°æµÈ preconditionµéÀÇ ÆÄÀÏÀ̸§. .SUFFIXES¿¡¼­¸¸ »ç¿ëÇÑ´Ù.
$$@ target : dependency¿¡¼­ ¿ÞÂÊ labelÀÇ À̸§.
ÇöÀç »ç¿ëÇϰí ÀÖ´Â targetÆÄÀÏÀÇ À̸§. : (colon)ÀÇ ¿À¸¥ÂÊ¿¡¼­¸¸ »ç¿ë°¡´É
$@ ÇöÀç »ç¿ëÇϰí ÀÖ´Â targetÆÄÀÏÀÇ À̸§
$? targetº¸´Ù ³ªÁß¿¡ º¯°æµÈ preconditionµéÀÇ ÆÄÀÏÀ̸§.
SUFFIXESºÎºÐ¿¡¼­ »ç¿ëÇÏÁö ¾Ê°í º¸Åë ¶§ »ç¿ëÇÑ´Ù.
$% ÇöÀçÀÇ targetÀÌ library ¸ðµâÀÎ °æ¿ì ÀÏÄ¡ÇÏ´Â '.o'ÆÄÀÏÀÇ À̸§


f) Suffix rule

UNIX¿¡¼­ »ç¿ëÇÏ´Â ÀϹÝÀûÀÎ È®ÀåÀÚ ±ÔÄ¢°ü·Ê¿¡ µû¶ó È®ÀåÀÚ À̸§À» Ưº°È÷ ¹Ù²Ù´Â ÀÏÀÌ ¾ø´Ù¸é makeÀÚüÀÇ suffix rule·Î ÀÛ¾÷À» ¼öÇàÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î ´ëºÎºÐÀÇ °æ¿ì [filename].c ÆÄÀÏÀº [filename].o ÆÄÀÏ·Î compileÇÑ´Ù. ÀÌ·¸°Ô ´ëºÎºÐÀÇ °æ¿ì Àû¿ëµÇ´Â ruleÀº make°¡ ÀÚüÀûÀ¸·Î °¡Áö°í rule¿¡ µû¶ó ó¸®ÇÑ´Ù.

.c.o :
	${CC} ${CFLAGS} -c $<


make³»ºÎ¿¡¼­ ÀÚüÀûÀ¸·Î Á¤ÀÇÇϰí ÀÖ´Â suffix ruleÀ» º¸°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
# make -p

Makefile³»ºÎ¿¡¼­ .SUFFIXES ¸ÅÅ©·ÎÀÇ °ªÀ» ¼¼ÆÃÇØ ÁÖ¸é ³»ºÎÀûÀ¸·Î Á¤ÀÇµÈ È®ÀåÀÚÀÇ ¿¬»êÀÌ µ¿ÀÛÀ» ÇÏ°Ô µÇ¸ç, È®ÀåÀÚ¸¦ º¸°í ¾î¶² suffix ruleÀ» Àû¿ëÇÒÁö´Â .SUFFIXESÇàÀÇ È®ÀåÀÚ ¼ø¼­¸¦ µû¸¥´Ù. ¿¹¸¦ µé¾î test.o¸¦ »ý¼ºÇϱâ À§ÇØ test.c¸¦ compileÇÒ °ÍÀÎÁö test.f¸¦ compileÇÒ °ÍÀÎÁö´Â .SUFFIXES¿¡¼­ ¾Õ ÂʺÎÅÍ ³ª¿À´Â ¼ø¼­¿¡ µû¸¥´Ù.
TargetºÎºÐ¿¡ È®ÀåÀÚ°¡ ÇÑ °³¸¸ ³ª¿À´Â °æ¿ì´Â ½ÇÇàÆÄÀÏÀÌ ´Ü ÇÑ °³ÀÇ source file·Î ¸¸µé¾î Áö´Â °æ¿ì object file±îÁö ¸¸µé Çʿ䰡 ¾ø±â ¶§¹®¿¡ ¹Ù·Î ½ÇÇà ÆÄÀÏÀ» ¸¸µé ¼ö ÀÖµµ·Ï ÇÏ´Â °æ¿ìÀÌ´Ù.

EX)  .c :
	${CC} ${CFLAGS} @{LDFLAGS} $< -o $@


g) MakefileÇØ¼®¼ø¼­

1. preconditionÀÇ ÆÄÀϵéÀ» ã´Â´Ù.
2. preconditionÀ» targetÀ¸·Î ÇÏ´Â ÇàÀÌ ÀÖ´ÂÁö ã´Â´Ù.
3. °¡Àå ÇϺηΠ³»·Á°¥ ¶§±îÁö 1°ú 2¸¦ ¹Ýº¹
4. ´õ ÀÌ»ó ¾øÀ¸¸é preconditionÀÇ È®ÀåÀÚ°¡ make¿¡¼­ ¹Ì¸® Á¤ÀÇµÈ .SUFFIXESÇà¿¡ ÀÖ´ÂÁö º»´Ù.
5. .SUFFIXESÇà¿¡ ÀÖÀ¸¸é È®ÀåÀÚ ±ÔÄ¢À» °Ë»çÇÏ°í ¾øÀ¸¸é target°ú preconditionÀÇ º¯°æ½Ã°£À» ºñ±³ÇÏ¿© targetº¸´Ù ÀÌÈÄ¿¡ º¯°æµÈ preconditionÀÌ Á¸ÀçÇϸé actionÀ» ¼öÇàÇÑ´Ù
6. 3±îÁö »ý¼ºµÈ °æ·Î¸¦ °Å²Ù·Î ¿Ã¶ó°¡¸ç target°ú preconditionÀÇ º¯°æ½Ã°£À» ºñ±³ÇÏ¿© targetº¸´Ù ÀÌÈÄ¿¡ º¯°æµÈ preconditionÀÌ ÀÖÀ¸¸é actionÀ» ¼öÇàÇÑ´Ù.


h) Makefile¿¹Á¦

°¡) ¿¹Á¦ 1
.SUFFIXES : .c .o 

OBJECTS = main.o \
		read.o \
		write.o
SRCS = 	main.c \
		read.c \
		write.c
CC = gcc
CFLAGS = -g -c
TARGET = test
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
clean : 
                rm -rf $(OBJECTS) $(TARGET) core 
main.o : io.h main.c
read.o : io.h read.c
write.o: io.h write.c


³ª) ¿¹Á¦ 2
.SUFFIXES : .c .o 
OBJECTS = main.o read.o write.o
SRCS = main.c read.c write.c
CC = gcc 
CFLAGS = -g -c 
INC = -I/usr/include <- include ÆÐ½º Ãß°¡
TARGET = test
$(TARGET) : $(OBJECTS)
                $(CC) -o $(TARGET) $(OBJECTS)
.c.o : <-  Á÷Á¢ È®ÀåÀÚ ±ÔÄ¢À» ±¸Çö
                $(CC) $(INC) $(CFLAGS) $<
clean : 
                rm -rf $(OBJECTS) $(TARGET) core 
main.o : io.h main.c
read.o : io.h read.c
write.o : io.h write.c


´Ù) ¿¹Á¦ 3

¿©·¯ °³ÀÇ directory¿¡ ÀÖ´Â makefileÀ» ÇѲ¨¹ø¿¡ ¼öÇàÇÒ ¶§ ´ÙÀ½Ã³·³ ¾µ ¼ö ÀÖ´Ù.
.SUFFIXES : .c .o
CC = gcc
CFLAGS = -O2 -g
all : DataBase Test
DataBase:
                cd db ; $(MAKE)
Test: 
                cd test ; $(MAKE)


¶ó) ¿¹Á¦ 4

º¸ÅëÀÇ MakefileÀº ¾ÕºÎºÐºÎÅÍ macro/¸í·É¾î Á¤ÀÇ/dependency¼ø¼­·Î ÀÛ¼ºÇÏ°Ô µÈ´Ù.
.SUFFIXES : .c .o
CFLAGS = -g
OBJS = 	main.o \
		read.o \
		write.o
SRCS = $(OBJS:.o=.c)
TARGET = test
$(TARGET): $(OBJS)
                $(CC) -o $@ $(OBJS)
dep :
                gccmakedep $(SRCS)
new :
                touch $(SRCS) ; $(MAKE)
clean :
                $(RM) $(OBJS) $(TARGET) core



Application Debugging

AIX´Â µÎ °¡ÁöÀÇ debugger¸¦ Á¦°øÇÑ´Ù. Text±â¹ÝÀÇ dbx¿Í dbx¿¡ GUI interface¸¦ ¾º¿î xldbÀÌ´Ù.
Debugger¸¦ »ç¿ëÇÏ·Á¸é ¹Ýµå½Ã source code¸¦ compileÇÒ ¶§ -g optionÀ» »ç¿ëÇÏ¿© compileÇØ¾ß debugger¿¡¼­ »ç¿ëÇÒ Á¤º¸¸¦ ¸¸µé¾î ÁÙ ¼ö ÀÖ´Ù.
DebuggingÀÌ ÀüºÎ ¿Ï·áµÈ ´ÙÀ½¿¡´Â -g optionÀ» »©°í ´Ù½Ã compileÇØ¾ß ÇÁ·Î±×·¥ÀÇ Å©±â°¡ ÁÙ¾îµç´Ù.

a) dbx ±âº»»ç¿ë¹ý

$ dbx [½ÇÇàÆÄÀÏÀ̸§]
°¡Àå °£´ÜÇÑ ½ÇÇà¹æ¹ýÀÌ¸ç µ¶¸³µÈ ÇÁ·Î±×·¥À» debuggingÇÒ ¼ö ÀÖ´Ù.
¸¸¾à ÇöÀç ¼öÇàµÇ°í ÀÖ´Â ÇÁ·Î¼¼½º¸¦ debuggingÇÑ´Ù¸é ´ÙÀ½Ã³·³ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

$ dbx -a [process id]
¹°·Ð ÀÌ ÇÁ·Î¼¼½ºµµ -g optionÀ¸·Î compileµÇ¾î ÀÖ¾î¾ß Çϸç, processÀÌ debuggingÀÌ ³¡³ª°í process¸¦ Á¾·á ½ÃŰÁö ¾ÊÀº ä·Î dbx¸¦ Á¾·áÇÏ·Á¸é detach¸í·É¾î·Î Á¾·áÇϵµ·Ï ÇÑ´Ù.

b) dbx ¸í·É¾î ¸ñ·Ï

´ÙÀ½Àº dbx¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·É¾îÀÇ ¸ñ·ÏÀÌ´Ù.
¸ðµÎ dbx prompt»ó¿¡¼­ help ¸¦ ÀÔ·ÂÇÏ¸é »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·É¾î°¡ º¸ÀÌ°í »ç¿ë¹æ¹ýÀº help [command name]À̶ó°í ÀÔ·ÂÇÏ¸é ¾Ë ¼ö ÀÖ´Ù.

-LIST
(dbx) list ¼Ò½ºÄڵ带 º¸¿©ÁØ´Ù
(dbx) list 23,25 23¹øÂ° ÁÙ¿¡¼­ 25¹øÂ° ÁÙ±îÁö º¸¿©ÁØ´Ù
(dbx) list foo foo ÇÔ¼ö¸¦ º¸¿©ÁØ´Ù
(dbx) file [file_name] ÇöÀç À§Ä¡¸¦ file_nameÀ¸·Î À̵¿ÇÑ´Ù
(dbx) func [function_name] ÇöÀç À§Ä¡¸¦ function_nameÀ¸·Î À̵¿ÇÑ´Ù
(dbx) where ÇöÀç À§Ä¡¸¦ ¾Ë·ÁÁØ´Ù


-PRINT
(dbx) print [expression] expressionÀÇ °á°ú¸¦ º¸¿©ÁØ´Ù
(dbx) print [variable] variableÀÇ °ªÀ» º¸¿©ÁØ´Ù
(dbx) print [function_name] functionÀÇ return°ªÀ» º¸¿©ÁØ´Ù


-ASSIGN
(dbx) assign variable = expression     variableÀÇ expressionÀÇ °ªÀ» ³Ö´Â´Ù

- BREAKPOINT
(dbx) stop at [source_line_number] [if condition]
conditionÀÌ ¸¸Á·µÇ¸é source_line_number¿¡¼­ ¸ØÃßµµ·Ï breakpoint¸¦ ¼³Á¤ÇÑ´Ù.

(dbx) stop at "[file_name]":[source_line_number] [if condition]
conditionÀÌ ¸¸Á·µÇ¸é ƯÁ¤ÆÄÀÏÀÇ ¸î ¹øÂ° ÁÙ¿¡¼­ ¸ØÃßµµ·Ï breakpoint¸¦ ¼³Á¤ÇÑ´Ù

(dbx) stop if [condition]
conditionÀÌ ¸¸Á·µÇ¸é ¸ØÃßµµ·Ï breakpoint¸¦ ¼³Á¤ÇÑ´Ù

(dbx) stop if [variable]
variableÀÇ °ªÀÌ ¹Ù²î°Ô µÇ¸é ¸ØÃßµµ·Ï breakpoint¸¦ ¼³Á¤ÇÑ´Ù

(dbx) status : ¸ðµç breakpoint¸¦ º¸¿©ÁØ´Ù

(dbx) delete break_point_number
¹øÈ£¿¡ ÇØ´çÇÏ´Â break point¸¦ Áö¿î´Ù. Break point¹øÈ£´Â status·Î ¾Ë ¼ö ÀÖ´Ù

(dbx) cont : ´ÙÀ½ break point³ª ÄÚµå ³¡±îÁö ÁøÇàÇÑ´Ù

(dbx) step : ÄÚµå ÇÑ ÁÙ¾¿ ÁøÇàÇÑ´Ù

(dbx) next : ÄÚµå ÇÑ ÁÙÀ̳ª ÇÔ¼ö ¾È¿¡ ÀÖÀ¸¸é ÇÔ¼ö ³¡±îÁö ÁøÇàÇÑ´Ù


Benchmark Test

Hanoi¿Í bubble sortµÎ°³ÀÇ ÇÁ·Î±×·¥À» °¢°¢ÀÇ °æ¿ì¿¡ ´Ù¸¥ compile optimization optionÀ» »ç¿ëÇÏ¿© compileÇÏ¿© ¼º´ÉÀ» ºñ±³ÇÏ¿´´Ù.

a) Hanoi

°¢°¢ -O,-O3 -qstrict,-O4 optionÀ» »ç¿ëÇÏ¿© compileÇÑ °á°úÀÌ´Ù.

hanoi

Hanoi°°Àº °æ¿ì´Â calculation-intensive ÇÁ·Î±×·¥À̹ǷΠOptimize option¿¡ µû¶ó Â÷À̰¡ ³ª°í ÀÖ´Ù.
-O4°¡ -O3¿¡ ºñÇÏ¿© ±×´ÙÁö ÁÁÀº ÆíÀÌ ¾Æ´Ñµ¥ procedure°£ÀÇ operationÀ» ÇÒ ÀÏÀÌ º°·Î ¾ø¾î¼­ interprocedural optimizationÀÌ ±×´ÙÁö ¿µÇâÀ» ÁÖÁö ¾Ê´Â °ÍÀ¸·Î º¸ÀδÙ.

b) Bubble Sort

°¢°¢ -O, -O3 -qstrict, -O3, -O4 optionÀ» »ç¿ëÇÏ¿© compileÇÑ °á°úÀÌ´Ù.


bubble


Bubble sort°°Àº °æ¿ì´Â memory-intensive ÇÁ·Î±×·¥À̹ǷΠoptimize option¿¡ ±×´ÙÁö ¿µÇâ ¹ÞÁö ¾Ê´Â´Ù. ÀÌ °æ¿ì semanticÀ» ¹Ù²Ü ÀÏÀÌ ¾ø¾î¼­ strict optionÀ» »ç¿ëÇÏÁö ¾Ê°í compileÇÑ °æ¿ìµµ Ãß°¡Çߴµ¥ -qstrict¸¦ »ç¿ëÇÑ °æ¿ì¿Í ¸¹Àº Â÷À̰¡ ¹ß»ýÇϰí ÀÖ´Ù.


ºÎ·Ï

a) stream compile

stream bmt program¿¡¼­ MakefileÀÌ Æ÷ÇԵǾî ÀÖÁö ¾ÊÀ¸¹Ç·Î ´ÙÀ½ MakefileÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. °á°ú¹°·Î CPU timeÀ» Àç´Â stream_d1°ú wall clockÀ» Àç´Â stream_d2µÎ°³ÀÇ ½ÇÇàÆÄÀÏÀÌ ¸¸µé¾î Áø´Ù.

#
#	stream bmt program Makefile
#
#		03/28/2001 Kim Sehee
#
DEFINES = -DUNIX
CFLAGS = $(DEFINES) -O
FILES1 = second_cpu.c stream_d.c
FILES2 = second_wall.c stream_d.c
CC = cc
all : stream_d1 stream_d2
# Estimate CPU time
stream_d1 : ${FILES1} 
	$(CC) ${CFLAGS} -o $@ ${FILES1} /usr/lib/libm.a
# Estimate wall clock time
stream_d2 : ${FILES2} 
	$(CC) ${CFLAGS} -o $@ ${FILES2} /usr/lib/libm.a
clean:
	rm -rf stream_d1 stream_d2 ${FILES1:.c=.o} {FILES2:.c=.o}

Âü°í ¹®Çå
  • UNIX°³³ä°ú ½Ç½À, °í°Ç, Á¤ÀÍ»ç
  • Managing Projects with make, 2nd Edition, Andrew Oram & Steve Talbott, O'reilly
  • Programming with GNU Software, Mike Loukides & Andy Oram, O'reilly
  • http://kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html
  • AIX Application Programming±³Àç