×÷Õß: lgms2008
2006-09-05 19:44:48
¡¡¡¡ÔÚ Unix ÉÏд³ÌʽµÄÈË´ó¸Å¶¼Åö¹ý Makefile£¬ÓÈÆäÊÇÓà C À´¿ª·¢³ÌʽµÄÈË¡£Óà make À´¿ª·¢ºÍ±àÒë³ÌʽµÄÈ·ºÜ·½±ã£¬¿ÉÊÇҪд³öÒ»¸ö Makefile¾Í²»¼òµ¥ÁË¡£Æ«Æ«½éÉÜ Makefile µÄÎļþ²»¶à£¬GNU Make ÄÇ·ÝÓ¡³öÀ´Òª¼¸°ÙÒ³µÄÎļþ£¬¹â¿´Íê Overview ¾Í¿ìÕóÍöÁË£¬ÄѹÖÐí¶àÈËÎÅ Unix É«±ä¡£±¾ÎĽ«½éÉÜÈçºÎÀûÓà GNU Autoconf ¼° Automake ÕâÁ½Ì×ÈíÌåÀ´ÐÖúÎÒÃÇ¡º×Ô¶¯¡»²úÉú Makefile µµ£¬²¢ÇÒÈÿª·¢³öÀ´µÄÈíÌå¿ÉÒÔÏñ Apache,MySQL ºÍ³£¼ûµÄ GNU ÈíÌåÒ»Ñù£¬Ö»Òª»á ``./configure'', ``make'',``make install'' ¾Í¿ÉÒ԰ѳÌʽ°²×°µ½ÏµÍ³ÖС£Èç¹ûÄúÓÐÐÄ¿ª·¢ OpenSource µÄÈíÌ壬»òÖ»ÊÇÏëÔÚ Unix ϵͳÏÂдд³Ìʽ¡£Ï£ÍûÕâ·Ý½éÉÜÎļþÄܰïÖúÄúÇáËɵؽøÈë Unix Programming µÄµîÌá£
1. ¼ò½é
¡¡¡¡Makefile »ù±¾ÉϾÍÊÇ¡ºÄ¿±ê¡»(target), ¡º¹ØÁ¬¡»(dependencies) ºÍ¡º¶¯×÷¡»ÈýÕßËù×é³ÉµÄÒ»Á¬´®¹æÔò¡£¶ø make ¾Í»á¸ù¾Ý Makefile µÄ¹æÔòÀ´¾ö¶¨ÈçºÎ±àÒë (compile) ºÍÁ¬½á (link) ³Ìʽ¡£Êµ¼ÊÉÏ£¬make ¿É×öµÄ²»Ö»ÊDZàÒëºÍÁ¬½á³Ìʽ£¬ÀýÈç FreeBSD µÄ port collection ÖУ¬Makefile »¹¿ÉÒÔ×öµ½×Ô¶¯ÏÂÔØÔʼ³ÌʽÌ×¼þ£¬½âѹËõ (extract) £¬ÐÞ²¹(patch)£¬É趨£¬È»áá±àÒ룬°²×°ÖÁϵͳÖС£
¡¡¡¡Makefile »ù±¾¹¹ÔìËäÈ»¼òµ¥£¬µ«ÊÇÍ×ÉÆÔËÓÃÕâЩ¹æÔò¾ÍÒ²¿ÉÒÔ±ä³öÐí¶à²»Í¬µÄ»¨ÕС£È´Ò²Òò´Ë£¬Ðí¶à¸Õ¿ªÊ¼Ñ§Ï°Ð´ Makefile ʱ»á¸Ðµ½Ã»Óй淶¿ÉÑ£¬Ã¿¸öÈËд³öÀ´µÄ Makefile ³¤µÃ¶¼²»Ì«Ò»Ñù£¬²»ÖªµÀ´ÓºÎÏÂÊÖ£¬¶øÇÒ³£³£»áÊÜÏÞì¶×Ô¼ºµÄ¿ª·¢»·¾³£¬Ö»Òª»·¾³±äÊý²»Í¬»ò·¾¶¸Äһϣ¬¿ÉÄÜMakefile ¾ÍµÃ¸ú×ÅÐ޸ġ£ËäÈ»ÓÐ GNU Makefile Conventions (GNUMakefile ¹ßÀý) ¶©³öһЩʹÓà GNU ³ÌʽÉè¼ÆÊ±×«Ð´ Makefile µÄһЩ±ê×¼ºÍ¹æ·¶£¬µ«ÊÇÄÚÈݺܳ¤¶øÇҺܸ´ÔÓ, ²¢ÇÒ¾³£×öЩµ÷Õû£¬ÎªÁ˼õÇá³ÌʽÉè¼ÆÊ¦Î¬»¤ Makefile µÄ¸ºµ££¬Òò´ËÓÐÁË Automake¡£
¡¡¡¡³ÌʽÉè¼ÆÊ¦Ö»ÐèдһЩԤÏȶ¨ÒåºÃµÄ¾Þ¼¯ (macro)£¬½»¸ø Automake ´¦Àíáá»á²úÉúÒ»¸ö¿É¹© Autoconf ʹÓÃµÄ Makefile.in µµ¡£ÔÙÅäºÏÀûÓÃAutoconf ²úÉúµÄ×Ô¶¯É趨µµ configure ¼´¿É²úÉúÒ»·Ý·ûºÏ GNU Makefile¹ßÀýµÄ Makeifle ÁË¡£
2. ÉÏ·֮ǰ
ÔÚ¿ªÊ¼ÊÔ×ÅÓà Automake ֮ǰ£¬ÇëÏÈÈ·ÈÏÄãµÄϵͳÒѾ°²×°ÒÔϵÄÈíÌ壺
1. GNU Automake
2. GNU Autoconf
3. GNU m4
4. perl
5. GNU Libtool (Èç¹ûÄãÐèÒª²úÉú shared library)
ÎһὨÒéÄã×îºÃҲʹÓà GNU C/C++ ±àÒëÆ÷ ¡¢GNU Make ÒÔ¼°ÆäËü GNU µÄ¹¤¾ß³ÌʽÀ´×öΪ¿ª·¢µÄ»·¾³£¬ÕâЩ¹¤¾ß¶¼ÊÇÊôì¶ Open Source Software²»½öÃâ·Ñ¶øÇÒ¹¦ÄÜÇ¿´ó¡£Èç¹ûÄãÊÇʹÓà Red Hat Linux ¿ÉÒÔÕÒµ½ËùÓÐÉÏÊöÈíÌåµÄ rpm µµ£¬FreeBSD Ò²ÓÐÏÖ³ÉµÄ package ¿ÉÒÔÖ±½Ó°²×°£¬»ò×ÅÄãÒ²¿ÉÒÔ×ÔÐÐÏÂÔØÕâЩÈíÌåµÄÔʼµµ»ØÀ´ DIY¡£ÒÔϵķ¶ÀýÊÇÔÚ Red HatLinux 5.2 + CLE2 µÄ»·¾³ÏÂËùÍê³ÉµÄ¡£
3. Ò»¸ö¼òµ¥µÄÀý×Ó
Automake Ëù²úÉúµÄ Makefile ³ýÁË¿ÉÒÔ×öµ½³ÌʽµÄ±àÒëºÍÁ¬½á£¬Ò²ÒѾ°ÑÈçºÎ²úÉú³ÌʽÎļþ (Èç manual page, info µµ¼° dvi µµ) µÄ¶¯×÷£¬»¹ÓаÑÔʼ³Ìʽ°ü×°ÆðÀ´ÒÔ¹©É¢¡¡µÄ¶¯×÷¶¼¿¼ÂǽøÈ¥ÁË£¬ËùÒÔÔʼ³ÌʽËù´æ·ÅµÄĿ¼¼Ü¹¹×îºÃ·ûºÏ GNU µÄ±ê×¼¹ßÀý£¬½ÓÏÂÀ´ÎÒÄà hello.c À´×öΪÀý×Ó¡£
ÔÚ¹¤×÷Ŀ¼Ï½¨Á¢Ò»¸öеÄ×ÓĿ¼ ``devel''£¬ÔÙÔÚ devel Ͻ¨Á¢Ò»¸ö``hello'' µÄ×ÓĿ¼£¬Õâ¸öĿ¼½«×÷ΪÎÒÃÇ´æ·Å hello Õâ¸ö³Ìʽ¼°ÆäÏà¹Øµµ°¸µÄµØ·½£º[code]% mkdir devel
% cd devel
% mkdir hello
% cd hello[/code]ÓÃ±à¼Æ÷д¸ö hello.c µµ£¬[code]#include
int main(int argc, char** argv)
{
printf(``Hello, GNU!\n'');
return 0;
}[/code]½ÓÏÂÀ´¾ÍÒªÓà Autoconf ¼° Automake À´°ïÎÒÃDzúÉú Makefile µµÁË£¬
1. Óà autoscan ²úÉúÒ»¸ö configure.in µÄ³ûÐÍ£¬Ö´ÐÐ autoscan áá»á²úÉúÒ»¸öconfigure.scan µÄµµ°¸£¬ÎÒÃÇ¿ÉÒÔÓÃËü×öΪ configure.inµµµÄÀ¶±¾¡£[code]% autoscan
% ls
configure.scan hello.c[/code]2. ±à¼ configure.scan µµ£¬ÈçÏÂËùʾ£¬²¢ÇÒ°ÑËüµÄµµÃû¸Ä³É configure.in[code]dnl Process this file with autoconf to produce a configure script.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)
dnl Checks for programs.
AC_PROG_CC
dnl Checks for libraries.
dnl Checks for header files.
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
AC_OUTPUT(Makefile)[/code]3. Ö´ÐÐ aclocal ºÍ autoconf £¬·Ö±ð»á²úÉú aclocal.m4 ¼° configure Á½¸öµµ°¸[code]% aclocal
% autoconf
% ls
aclocal.m4configureconfigure.inhello.c[/code]4. ±à¼ Makefile.am µµ£¬ÄÚÈÝÈçÏÂ[code]AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c[/code]5. Ö´ÐÐ automake --add-missing £¬Automake »á¸ù¾Ý Makefile.am µµ²úÉúһЩµµ°¸£¬°üº¬×îÖØÒªµÄ Makefile.in[code]% automake --add-missing
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'[/code]