 |
Application development on AIX
¾î¶² UNIX½Ã½ºÅÛ¿¡¼µµ ¿ø½ÃÄÚµå·ÎºÎÅÍ ÇÁ·Î±×·¥À» °³¹ßÇÏ¿© À̰ÍÀ» ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ½ÇÇà °¡´ÉÇÑ ÇÁ·Î±×·¥À» ¸¸µé°í ÇÁ·Î±×·¥ÀÇ ¿À·ù¸¦ ¼öÁ¤ÇØ ³ª°¡´Â °úÁ¤Àº ºñ½ÁÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. AIX¿¡¼´Â ÀϹÝÀûÀ¸·Î »ç¿ëÇÏ´Â Open Source Environment°¡ ¾Æ´Ñ AIX°íÀ¯ÀÇ °³¹ßÅøÀ» »ç¿ëÇϹǷÎ, AIX¿¡¼ °³¹ßÀ̳ª Æ÷ÆÃ ÀÛ¾÷À» ÇÏ·Á´Â »ç¿ëÀÚ´Â °¢°¢ÀÇ °³¹ßÅøÀÇ À̸§À» ¼÷ÁöÇÏ°í ¸í·É¾î »ç¿ë¹ýÀ» ¾Ë¾ÆµÎ¾î¾ß ÇÒ Çʿ䰡 ÀÖ´Ù. ±×·¯³ª ÀüÇô ´Ù¸¥ ȯ°æÀº ¾Æ´Ï¹Ç·Î, ¸¸¾à Open Source Environment¿¡ Àͼ÷ÇÑ °³¹ßÀÚ¶ó¸é AIXÀÇ °³¹ßȯ°æ¿¡ Àͼ÷ÇØÁö´Âµ¥ ±×´ÙÁö ¿À·£ ½Ã°£ÀÌ °É¸®Áö ¾ÊÀ» °ÍÀ¸·Î ±â´ëµÈ´Ù.
ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ °³¹ß°úÁ¤Àº ´ÙÀ½°ú °°´Ù.
| C, C++, PASCAL, FORTRANµîÀ¸·Î ÀÛ¼ºµÈ ¿ø½Ã ÇÁ·Î±×·¥ |
| ¡éCompiler |
| Object Code |
| ¡éLiker |
| Executable Code |
| ¡éDebugger |
| ¿À·ù¸¦ ¼öÁ¤ÇÑ ¿ÏÀüÇÑ ½ÇÇàÆÄÀÏ |
¿©±â¿¡¼´Â AIX¿¡¼ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯¿Í µð¹ö°ÅÀÇ »ç¿ë¹ý, ±×¸®°í makeÆÄÀÏÀ» ¸¸µå´Â ¹ý¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸°Ú´Ù.
¼Ò½º Äڵ带 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
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
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 : ÄÚµå ÇÑ ÁÙÀ̳ª ÇÔ¼ö ¾È¿¡ ÀÖÀ¸¸é ÇÔ¼ö ³¡±îÁö ÁøÇàÇÑ´Ù
Hanoi¿Í bubble sortµÎ°³ÀÇ ÇÁ·Î±×·¥À» °¢°¢ÀÇ °æ¿ì¿¡ ´Ù¸¥ compile optimization optionÀ» »ç¿ëÇÏ¿© compileÇÏ¿© ¼º´ÉÀ» ºñ±³ÇÏ¿´´Ù.
a) Hanoi
°¢°¢ -O,-O3 -qstrict,-O4 optionÀ» »ç¿ëÇÏ¿© compileÇÑ °á°úÀÌ´Ù.

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

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}
|