¸úÎÒÒ»Æðд Makefile


¸ÅÊö
¡ª¡ª

ʲôÊÇmakefile£¿»òÐíºÜ¶àWinodwsµÄ³ÌÐòÔ±¶¼²»ÖªµÀÕâ¸ö¶«Î÷£¬ÒòΪÄÇЩWindowsµÄIDE¶¼ÎªÄã×öÁËÕâ¸ö¹¤×÷£¬µ«ÎÒ¾õµÃÒª×÷Ò»¸öºÃµÄºÍprofessionalµÄ³ÌÐòÔ±£¬makefile»¹ÊÇÒª¶®¡£Õâ¾ÍºÃÏñÏÖÔÚÓÐÕâô¶àµÄHTMLµÄ±à¼­Æ÷£¬µ«Èç¹ûÄãÏë³ÉΪһ¸öרҵÈËÊ¿£¬Ä㻹ÊÇÒªÁ˽âHTMLµÄ±êʶµÄº¬Òå¡£ÌØ±ðÔÚunixϵÄÈí¼þ±àÒ룬Äã¾Í²»Äܲ»×Ô¼ºÐ´makefileÁË£¬»á²»»áдmakefile£¬´ÓÒ»¸ö²àÃæËµÃ÷ÁËÒ»¸öÈËÊÇ·ñ¾ß±¸Íê³É´óÐ͹¤³ÌµÄÄÜÁ¦¡£

ÒòΪ£¬makefile¹ØÏµµ½ÁËÕû¸ö¹¤³ÌµÄ±àÒë¹æÔò¡£Ò»¸ö¹¤³ÌÖеÄÔ´Îļþ²»¼ÆÊý£¬Æä°´ÀàÐÍ¡¢¹¦ÄÜ¡¢Ä£¿é·Ö±ð·ÅÔÚÈô¸É¸öĿ¼ÖУ¬makefile¶¨ÒåÁËһϵÁеĹæÔòÀ´Ö¸¶¨£¬ÄÄЩÎļþÐèÒªÏȱàÒ룬ÄÄЩÎļþÐèÒªºó±àÒ룬ÄÄЩÎļþÐèÒªÖØÐ±àÒ룬ÉõÖÁÓÚ½øÐиü¸´ÔӵŦÄܲÙ×÷£¬ÒòΪmakefile¾ÍÏñÒ»¸öShell½Å±¾Ò»Ñù£¬ÆäÖÐÒ²¿ÉÒÔÖ´ÐвÙ×÷ϵͳµÄÃüÁî¡£

makefile´øÀ´µÄºÃ´¦¾ÍÊÇ¡ª¡ª¡°×Ô¶¯»¯±àÒ롱£¬Ò»µ©Ð´ºÃ£¬Ö»ÐèÒªÒ»¸ömakeÃüÁÕû¸ö¹¤³ÌÍêÈ«×Ô¶¯±àÒ룬¼«´óµÄÌá¸ßÁËÈí¼þ¿ª·¢µÄЧÂÊ¡£makeÊÇÒ»¸öÃüÁ¾ß£¬ÊÇÒ»¸ö½âÊÍmakefileÖÐÖ¸ÁîµÄÃüÁ¾ß£¬Ò»°ãÀ´Ëµ£¬´ó¶àÊýµÄIDE¶¼ÓÐÕâ¸öÃüÁ±ÈÈ磺DelphiµÄmake£¬Visual C++µÄnmake£¬linuxÏÂGNUµÄmake¡£¿É¼û£¬makefile¶¼³ÉΪÁËÒ»ÖÖÔÚ¹¤³Ì·½ÃæµÄ±àÒë·½·¨¡£

ÏÖÔÚ½²ÊöÈçºÎдmakefileµÄÎÄÕ±ȽÏÉÙ£¬ÕâÊÇÎÒÏëдÕâÆªÎÄÕµÄÔ­Òò¡£µ±È»£¬²»Í¬²úÉ̵Ämake¸÷²»Ïàͬ£¬Ò²Óв»Í¬µÄÓï·¨£¬µ«Æä±¾Öʶ¼ÊÇÔÚ¡°ÎļþÒÀÀµÐÔ¡±ÉÏ×öÎÄÕ£¬ÕâÀÎÒ½ö¶ÔGNUµÄmake½øÐн²Êö£¬ÎҵĻ·¾³ÊÇRedHat linux 8.0£¬makeµÄ°æ±¾ÊÇ3.80¡£±Ø¾¹£¬Õâ¸ömakeÊÇÓ¦ÓÃ×îΪ¹ã·ºµÄ£¬Ò²ÊÇÓõÃ×î¶àµÄ¡£¶øÇÒÆä»¹ÊÇ×î×ñÑ­ÓÚIEEE 1003.2-1992 ±ê×¼µÄ£¨POSIX.2£©¡£

ÔÚÕâÆªÎĵµÖУ¬½«ÒÔC/C++µÄÔ´Âë×÷ΪÎÒÃÇ»ù´¡£¬ËùÒÔ±ØÈ»É漰һЩ¹ØÓÚC/C++µÄ±àÒëµÄ֪ʶ£¬Ïà¹ØÓÚÕâ·½ÃæµÄÄÚÈÝ£¬»¹Çë¸÷λ²é¿´Ïà¹ØµÄ±àÒëÆ÷µÄÎĵµ¡£ÕâÀïËùĬÈϵıàÒëÆ÷ÊÇunixϵÄGCCºÍCC¡£

 

¹ØÓÚ³ÌÐòµÄ±àÒëºÍÁ´½Ó
¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª

ÔÚ´Ë£¬ÎÒÏë¶à˵¹ØÓÚ³ÌÐò±àÒëµÄһЩ¹æ·¶ºÍ·½·¨£¬Ò»°ãÀ´Ëµ£¬ÎÞÂÛÊÇC¡¢C++¡¢»¹ÊÇpas£¬Ê×ÏÈÒª°ÑÔ´Îļþ±àÒë³ÉÖмä´úÂëÎļþ£¬ÔÚWindowsÏÂÒ²¾ÍÊÇ .obj Îļþ£¬unixÏÂÊÇ .o Îļþ£¬¼´ Object File£¬Õâ¸ö¶¯×÷½Ð×ö±àÒ루compile£©¡£È»ºóÔÙ°Ñ´óÁ¿µÄObject FileºÏ³ÉÖ´ÐÐÎļþ£¬Õâ¸ö¶¯×÷½Ð×÷Á´½Ó£¨link£©¡£

±àÒëʱ£¬±àÒëÆ÷ÐèÒªµÄÊÇÓï·¨µÄÕýÈ·£¬º¯ÊýÓë±äÁ¿µÄÉùÃ÷µÄÕýÈ·¡£¶ÔÓÚºóÕߣ¬Í¨³£ÊÇÄãÐèÒª¸æËß±àÒëÆ÷Í·ÎļþµÄËùÔÚλÖã¨Í·ÎļþÖÐÓ¦¸ÃÖ»ÊÇÉùÃ÷£¬¶ø¶¨ÒåÓ¦¸Ã·ÅÔÚC/C++ÎļþÖУ©£¬Ö»ÒªËùÓеÄÓï·¨ÕýÈ·£¬±àÒëÆ÷¾Í¿ÉÒÔ±àÒë³öÖмäÄ¿±êÎļþ¡£Ò»°ãÀ´Ëµ£¬Ã¿¸öÔ´Îļþ¶¼Ó¦¸Ã¶ÔÓ¦ÓÚÒ»¸öÖмäÄ¿±êÎļþ£¨OÎļþ»òÊÇOBJÎļþ£©¡£

Á´½Óʱ£¬Ö÷ÒªÊÇÁ´½Óº¯ÊýºÍÈ«¾Ö±äÁ¿£¬ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÕâЩÖмäÄ¿±êÎļþ£¨OÎļþ»òÊÇOBJÎļþ£©À´Á´½ÓÎÒÃǵÄÓ¦ÓóÌÐò¡£Á´½ÓÆ÷²¢²»¹Üº¯ÊýËùÔÚµÄÔ´Îļþ£¬Ö»¹Üº¯ÊýµÄÖмäÄ¿±êÎļþ£¨Object File£©£¬ÔÚ´ó¶àÊýʱºò£¬ÓÉÓÚÔ´ÎļþÌ«¶à£¬±àÒëÉú³ÉµÄÖмäÄ¿±êÎļþÌ«¶à£¬¶øÔÚÁ´½ÓʱÐèÒªÃ÷ÏÔµØÖ¸³öÖмäÄ¿±êÎļþÃû£¬Õâ¶ÔÓÚ±àÒëºÜ²»·½±ã£¬ËùÒÔ£¬ÎÒÃÇÒª¸øÖмäÄ¿±êÎļþ´ò¸ö°ü£¬ÔÚWindowsÏÂÕâÖÖ°ü½Ð¡°¿âÎļþ¡±£¨Library File)£¬Ò²¾ÍÊÇ .lib Îļþ£¬ÔÚunixÏ£¬ÊÇArchive File£¬Ò²¾ÍÊÇ .a Îļþ¡£

×ܽáһϣ¬Ô´ÎļþÊ×ÏÈ»áÉú³ÉÖмäÄ¿±êÎļþ£¬ÔÙÓÉÖмäÄ¿±êÎļþÉú³ÉÖ´ÐÐÎļþ¡£ÔÚ±àÒëʱ£¬±àÒëÆ÷Ö»¼ì²â³ÌÐòÓï·¨£¬ºÍº¯Êý¡¢±äÁ¿ÊÇ·ñ±»ÉùÃ÷¡£Èç¹ûº¯Êýδ±»ÉùÃ÷£¬±àÒëÆ÷»á¸ø³öÒ»¸ö¾¯¸æ£¬µ«¿ÉÒÔÉú³ÉObject File¡£¶øÔÚÁ´½Ó³ÌÐòʱ£¬Á´½ÓÆ÷»áÔÚËùÓеÄObject FileÖÐÕÒѰº¯ÊýµÄʵÏÖ£¬Èç¹ûÕÒ²»µ½£¬Äǵ½¾Í»á±¨Á´½Ó´íÎóÂ루Linker Error£©£¬ÔÚVCÏ£¬ÕâÖÖ´íÎóÒ»°ãÊÇ£ºLink 2001´íÎó£¬Òâ˼˵ÊÇ˵£¬Á´½ÓÆ÷δÄÜÕÒµ½º¯ÊýµÄʵÏÖ¡£ÄãÐèÒªÖ¸¶¨º¯ÊýµÄObject File.

ºÃ£¬ÑÔ¹éÕý´«£¬GNUµÄmakeÓÐÐí¶àµÄÄÚÈÝ£¬ÏÐÑÔÉÙÐ𣬻¹ÊÇÈÃÎÒÃÇ¿ªÊ¼°É¡£

 

Makefile ½éÉÜ
¡ª¡ª¡ª¡ª¡ª¡ª¡ª

makeÃüÁîÖ´ÐÐʱ£¬ÐèÒªÒ»¸ö Makefile Îļþ£¬ÒÔ¸æËßmakeÃüÁîÐèÒªÔõôÑùµÄÈ¥±àÒëºÍÁ´½Ó³ÌÐò¡£

Ê×ÏÈ£¬ÎÒÃÇÓÃÒ»¸öʾÀýÀ´ËµÃ÷MakefileµÄÊéд¹æÔò¡£ÒÔ±ã¸ø´ó¼ÒÒ»¸ö¸ÐÐËÈÏʶ¡£Õâ¸öʾÀýÀ´Ô´ÓÚGNUµÄmakeʹÓÃÊֲᣬÔÚÕâ¸öʾÀýÖУ¬ÎÒÃǵŤ³ÌÓÐ8¸öCÎļþ£¬ºÍ3¸öÍ·Îļþ£¬ÎÒÃÇҪдһ¸öMakefileÀ´¸æËßmakeÃüÁîÈçºÎ±àÒëºÍÁ´½ÓÕ⼸¸öÎļþ¡£ÎÒÃǵĹæÔòÊÇ£º
    1£©Èç¹ûÕâ¸ö¹¤³ÌûÓбàÒë¹ý£¬ÄÇôÎÒÃǵÄËùÓÐCÎļþ¶¼Òª±àÒë²¢±»Á´½Ó¡£
    2£©Èç¹ûÕâ¸ö¹¤³ÌµÄij¼¸¸öCÎļþ±»Ð޸ģ¬ÄÇôÎÒÃÇÖ»±àÒë±»Ð޸ĵÄCÎļþ£¬²¢Á´½ÓÄ¿±ê³ÌÐò¡£
    3£©Èç¹ûÕâ¸ö¹¤³ÌµÄÍ·Îļþ±»¸Ä±äÁË£¬ÄÇôÎÒÃÇÐèÒª±àÒëÒýÓÃÁËÕ⼸¸öÍ·ÎļþµÄCÎļþ£¬²¢Á´½ÓÄ¿±ê³ÌÐò¡£

Ö»ÒªÎÒÃǵÄMakefileдµÃ¹»ºÃ£¬ËùÓеÄÕâÒ»ÇУ¬ÎÒÃÇÖ»ÓÃÒ»¸ömakeÃüÁî¾Í¿ÉÒÔÍê³É£¬makeÃüÁî»á×Ô¶¯ÖÇÄܵظù¾Ýµ±Ç°µÄÎļþÐ޸ĵÄÇé¿öÀ´È·¶¨ÄÄЩÎļþÐèÒªÖØ±àÒ룬´Ó¶ø×Ô¼º±àÒëËùÐèÒªµÄÎļþºÍÁ´½ÓÄ¿±ê³ÌÐò¡£


Ò»¡¢MakefileµÄ¹æÔò

ÔÚ½²ÊöÕâ¸öMakefile֮ǰ£¬»¹ÊÇÈÃÎÒÃÇÏÈÀ´´ÖÂԵؿ´Ò»¿´MakefileµÄ¹æÔò¡£

    target ... : prerequisites ...
            command
            ...
            ...

    targetÒ²¾ÍÊÇÒ»¸öÄ¿±êÎļþ£¬¿ÉÒÔÊÇObject File£¬Ò²¿ÉÒÔÊÇÖ´ÐÐÎļþ¡£»¹¿ÉÒÔÊÇÒ»¸ö±êÇ©£¨Label£©£¬¶ÔÓÚ±êÇ©ÕâÖÖÌØÐÔ£¬ÔÚºóÐøµÄ¡°Î±Ä¿±ê¡±Õ½ÚÖлáÓÐÐðÊö¡£

    prerequisites¾ÍÊÇ£¬ÒªÉú³ÉÄǸötargetËùÐèÒªµÄÎļþ»òÊÇÄ¿±ê¡£

    commandÒ²¾ÍÊÇmakeÐèÒªÖ´ÐеÄÃüÁî¡££¨ÈÎÒâµÄShellÃüÁ

ÕâÊÇÒ»¸öÎļþµÄÒÀÀµ¹ØÏµ£¬Ò²¾ÍÊÇ˵£¬targetÕâÒ»¸ö»ò¶à¸öµÄÄ¿±êÎļþÒÀÀµÓÚprerequisitesÖеÄÎļþ£¬ÆäÉú³É¹æÔò¶¨ÒåÔÚcommandÖС£Ëµ°×Ò»µã¾ÍÊÇ˵£¬prerequisitesÖÐÈç¹ûÓÐÒ»¸öÒÔÉϵÄÎļþ±ÈtargetÎļþÒªÐµĻ°£¬commandËù¶¨ÒåµÄÃüÁî¾Í»á±»Ö´ÐС£Õâ¾ÍÊÇMakefileµÄ¹æÔò¡£Ò²¾ÍÊÇMakefileÖÐ×îºËÐĵÄÄÚÈÝ¡£

˵µ½µ×£¬MakefileµÄ¶«Î÷¾ÍÊÇÕâÑùÒ»µã£¬ºÃÏñÎÒµÄÕâÆªÎĵµÒ²¸Ã½áÊøÁË¡£ºÇºÇ¡£»¹²»¾¡È»£¬ÕâÊÇMakefileµÄÖ÷ÏߺͺËÐÄ£¬µ«ÒªÐ´ºÃÒ»¸öMakefile»¹²»¹»£¬ÎÒ»áÒÔºóÃæÒ»µãÒ»µãµØ½áºÏÎҵŤ×÷¾­Ñ鏸ÄãÂýÂýµ½À´¡£ÄÚÈÝ»¹¶à×ÅÄØ¡££º£©


¶þ¡¢Ò»¸öʾÀý

ÕýÈçÇ°ÃæËù˵µÄ£¬Èç¹ûÒ»¸ö¹¤³ÌÓÐ3¸öÍ·Îļþ£¬ºÍ8¸öCÎļþ£¬ÎÒÃÇΪÁËÍê³ÉÇ°ÃæËùÊöµÄÄÇÈý¸ö¹æÔò£¬ÎÒÃǵÄMakefileÓ¦¸ÃÊÇÏÂÃæµÄÕâ¸öÑù×ӵġ£

    edit : main.o kbd.o command.o display.o \
           insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o \
                       insert.o search.o files.o utils.o

    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit main.o kbd.o command.o display.o \
               insert.o search.o files.o utils.o

·´Ð±¸Ü£¨\£©ÊÇ»»ÐзûµÄÒâ˼¡£ÕâÑù±È½Ï±ãÓÚMakefileµÄÒ×¶Á¡£ÎÒÃÇ¿ÉÒÔ°ÑÕâ¸öÄÚÈݱ£´æÔÚÎļþΪ¡°Makefile¡±»ò¡°makefile¡±µÄÎļþÖУ¬È»ºóÔÚ¸ÃĿ¼ÏÂÖ±½ÓÊäÈëÃüÁî¡°make¡±¾Í¿ÉÒÔÉú³ÉÖ´ÐÐÎļþedit¡£Èç¹ûҪɾ³ýÖ´ÐÐÎļþºÍËùÓеÄÖмäÄ¿±êÎļþ£¬ÄÇô£¬Ö»Òª¼òµ¥µØÖ´ÐÐһϡ°make clean¡±¾Í¿ÉÒÔÁË¡£

ÔÚÕâ¸ömakefileÖУ¬Ä¿±êÎļþ£¨target£©°üº¬£ºÖ´ÐÐÎļþeditºÍÖмäÄ¿±êÎļþ£¨*.o£©£¬ÒÀÀµÎļþ£¨prerequisites£©¾ÍÊÇðºÅºóÃæµÄÄÇЩ .c ÎļþºÍ .hÎļþ¡£Ã¿Ò»¸ö .o Îļþ¶¼ÓÐÒ»×éÒÀÀµÎļþ£¬¶øÕâЩ .o ÎļþÓÖÊÇÖ´ÐÐÎļþ edit µÄÒÀÀµÎļþ¡£ÒÀÀµ¹ØÏµµÄʵÖÊÉϾÍÊÇ˵Ã÷ÁËÄ¿±êÎļþÊÇÓÉÄÄЩÎļþÉú³ÉµÄ£¬»»ÑÔÖ®£¬Ä¿±êÎļþÊÇÄÄЩÎļþ¸üеġ£

ÔÚ¶¨ÒåºÃÒÀÀµ¹ØÏµºó£¬ºóÐøµÄÄÇÒ»Ðж¨ÒåÁËÈçºÎÉú³ÉÄ¿±êÎļþµÄ²Ù×÷ϵͳÃüÁһ¶¨ÒªÒÔÒ»¸öTab¼ü×÷Ϊ¿ªÍ·¡£¼Çס£¬make²¢²»¹ÜÃüÁîÊÇÔõô¹¤×÷µÄ£¬ËûÖ»¹ÜÖ´ÐÐËù¶¨ÒåµÄÃüÁî¡£make»á±È½ÏtargetsÎļþºÍprerequisitesÎļþµÄÐÞ¸ÄÈÕÆÚ£¬Èç¹ûprerequisitesÎļþµÄÈÕÆÚÒª±ÈtargetsÎļþµÄÈÕÆÚҪУ¬»òÕßtarget²»´æÔڵϰ£¬ÄÇô£¬make¾Í»áÖ´ÐкóÐø¶¨ÒåµÄÃüÁî¡£

ÕâÀïҪ˵Ã÷Ò»µãµÄÊÇ£¬clean²»ÊÇÒ»¸öÎļþ£¬ËüÖ»²»¹ýÊÇÒ»¸ö¶¯×÷Ãû×Ö£¬ÓеãÏñCÓïÑÔÖеÄlableÒ»Ñù£¬ÆäðºÅºóʲôҲûÓУ¬ÄÇô£¬make¾Í²»»á×Ô¶¯È¥ÕÒÎļþµÄÒÀÀµÐÔ£¬Ò²¾Í²»»á×Ô¶¯Ö´ÐÐÆäºóËù¶¨ÒåµÄÃüÁî¡£ÒªÖ´ÐÐÆäºóµÄÃüÁ¾ÍÒªÔÚmakeÃüÁîºóÃ÷ÏÔµÃÖ¸³öÕâ¸ölableµÄÃû×Ö¡£ÕâÑùµÄ·½·¨·Ç³£ÓÐÓã¬ÎÒÃÇ¿ÉÒÔÔÚÒ»¸ömakefileÖж¨Òå²»ÓõıàÒë»òÊǺͱàÒëÎ޹صÄÃüÁ±ÈÈç³ÌÐòµÄ´ò°ü£¬³ÌÐòµÄ±¸·Ý£¬µÈµÈ¡£

 


Èý¡¢makeÊÇÈçºÎ¹¤×÷µÄ

ÔÚĬÈϵķ½Ê½Ï£¬Ò²¾ÍÊÇÎÒÃÇÖ»ÊäÈëmakeÃüÁî¡£ÄÇô£¬

    1¡¢make»áÔÚµ±Ç°Ä¿Â¼ÏÂÕÒÃû×ֽС°Makefile¡±»ò¡°makefile¡±µÄÎļþ¡£
    2¡¢Èç¹ûÕÒµ½£¬Ëü»áÕÒÎļþÖеĵÚÒ»¸öÄ¿±êÎļþ£¨target£©£¬ÔÚÉÏÃæµÄÀý×ÓÖУ¬Ëû»áÕÒµ½¡°edit¡±Õâ¸öÎļþ£¬²¢°ÑÕâ¸öÎļþ×÷Ϊ×îÖÕµÄÄ¿±êÎļþ¡£
    3¡¢Èç¹ûeditÎļþ²»´æÔÚ£¬»òÊÇeditËùÒÀÀµµÄºóÃæµÄ .o ÎļþµÄÎļþÐÞ¸Äʱ¼äÒª±ÈeditÕâ¸öÎļþУ¬ÄÇô£¬Ëû¾Í»áÖ´ÐкóÃæËù¶¨ÒåµÄÃüÁîÀ´Éú³ÉeditÕâ¸öÎļþ¡£
    4¡¢Èç¹ûeditËùÒÀÀµµÄ.oÎļþÒ²´æÔÚ£¬ÄÇômake»áÔÚµ±Ç°ÎļþÖÐÕÒÄ¿±êΪ.oÎļþµÄÒÀÀµÐÔ£¬Èç¹ûÕÒµ½ÔòÔÙ¸ù¾ÝÄÇÒ»¸ö¹æÔòÉú³É.oÎļþ¡££¨ÕâÓеãÏñÒ»¸ö¶ÑÕ»µÄ¹ý³Ì£©
    5¡¢µ±È»£¬ÄãµÄCÎļþºÍHÎļþÊÇ´æÔÚµÄÀ²£¬ÓÚÊÇmake»áÉú³É .o Îļþ£¬È»ºóÔÙÓà .o ÎļþÉúÃümakeµÄÖÕ¼«ÈÎÎñ£¬Ò²¾ÍÊÇÖ´ÐÐÎļþeditÁË¡£

Õâ¾ÍÊÇÕû¸ömakeµÄÒÀÀµÐÔ£¬make»áÒ»²ãÓÖÒ»²ãµØÈ¥ÕÒÎļþµÄÒÀÀµ¹ØÏµ£¬Ö±µ½×îÖÕ±àÒë³öµÚÒ»¸öÄ¿±êÎļþ¡£ÔÚÕÒѰµÄ¹ý³ÌÖУ¬Èç¹û³öÏÖ´íÎ󣬱ÈÈç×îºó±»ÒÀÀµµÄÎļþÕÒ²»µ½£¬ÄÇômake¾Í»áÖ±½ÓÍ˳ö£¬²¢±¨´í£¬¶ø¶ÔÓÚËù¶¨ÒåµÄÃüÁîµÄ´íÎ󣬻òÊDZàÒë²»³É¹¦£¬make¸ù±¾²»Àí¡£makeÖ»¹ÜÎļþµÄÒÀÀµÐÔ£¬¼´£¬Èç¹ûÔÚÎÒÕÒÁËÒÀÀµ¹ØÏµÖ®ºó£¬Ã°ºÅºóÃæµÄÎļþ»¹ÊDz»ÔÚ£¬ÄÇô¶Ô²»Æð£¬ÎҾͲ»¹¤×÷À²¡£

ͨ¹ýÉÏÊö·ÖÎö£¬ÎÒÃÇÖªµÀ£¬ÏñcleanÕâÖÖ£¬Ã»Óб»µÚÒ»¸öÄ¿±êÎļþÖ±½Ó»ò¼ä½Ó¹ØÁª£¬ÄÇôËüºóÃæËù¶¨ÒåµÄÃüÁ²»»á±»×Ô¶¯Ö´ÐУ¬²»¹ý£¬ÎÒÃÇ¿ÉÒÔÏÔʾҪmakeÖ´ÐС£¼´ÃüÁ¡ª¡°make clean¡±£¬ÒÔ´ËÀ´Çå³ýËùÓеÄÄ¿±êÎļþ£¬ÒÔ±ãÖØ±àÒë¡£

ÓÚÊÇÔÚÎÒÃDZà³ÌÖУ¬Èç¹ûÕâ¸ö¹¤³ÌÒѱ»±àÒë¹ýÁË£¬µ±ÎÒÃÇÐÞ¸ÄÁËÆäÖÐÒ»¸öÔ´Îļþ£¬±ÈÈçfile.c£¬ÄÇô¸ù¾ÝÎÒÃǵÄÒÀÀµÐÔ£¬ÎÒÃǵÄÄ¿±êfile.o»á±»ÖرàÒ루Ҳ¾ÍÊÇÔÚÕâ¸öÒÀÐÔ¹ØÏµºóÃæËù¶¨ÒåµÄÃüÁ£¬ÓÚÊÇfile.oµÄÎļþÒ²ÊÇ×îеÄÀ²£¬ÓÚÊÇfile.oµÄÎļþÐÞ¸Äʱ¼äÒª±ÈeditҪУ¬ËùÒÔeditÒ²»á±»ÖØÐÂÁ´½ÓÁË£¨Ïê¼ûeditÄ¿±êÎļþºó¶¨ÒåµÄÃüÁ¡£

¶øÈç¹ûÎÒÃǸıäÁË¡°command.h¡±£¬ÄÇô£¬kdb.o¡¢command.oºÍfiles.o¶¼»á±»ÖرàÒ룬²¢ÇÒ£¬edit»á±»ÖØÁ´½Ó¡£


ËÄ¡¢makefileÖÐʹÓñäÁ¿

ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÏÈÈÃÎÒÃÇ¿´¿´editµÄ¹æÔò£º

      edit : main.o kbd.o command.o display.o \
                  insert.o search.o files.o utils.o
            cc -o edit main.o kbd.o command.o display.o \
                       insert.o search.o files.o utils.o

ÎÒÃÇ¿ÉÒÔ¿´µ½[.o]ÎļþµÄ×Ö·û´®±»Öظ´ÁËÁ½´Î£¬Èç¹ûÎÒÃǵŤ³ÌÐèÒª¼ÓÈëÒ»¸öеÄ[.o]Îļþ£¬ÄÇôÎÒÃÇÐèÒªÔÚÁ½¸öµØ·½¼Ó£¨Ó¦¸ÃÊÇÈý¸öµØ·½£¬»¹ÓÐÒ»¸öµØ·½ÔÚcleanÖУ©¡£µ±È»£¬ÎÒÃǵÄmakefile²¢²»¸´ÔÓ£¬ËùÒÔÔÚÁ½¸öµØ·½¼ÓÒ²²»ÀÛ£¬µ«Èç¹ûmakefile±äµÃ¸´ÔÓ£¬ÄÇôÎÒÃǾÍÓпÉÄÜ»áÍüµôÒ»¸öÐèÒª¼ÓÈëµÄµØ·½£¬¶øµ¼Ö±àÒëʧ°Ü¡£ËùÒÔ£¬ÎªÁËmakefileµÄÒ×ά»¤£¬ÔÚmakefileÖÐÎÒÃÇ¿ÉÒÔʹÓñäÁ¿¡£makefileµÄ±äÁ¿Ò²¾ÍÊÇÒ»¸ö×Ö·û´®£¬Àí½â³ÉCÓïÑÔÖеĺê¿ÉÄÜ»á¸üºÃ¡£

±ÈÈ磬ÎÒÃÇÉùÃ÷Ò»¸ö±äÁ¿£¬½Ðobjects, OBJECTS, objs, OBJS, obj, »òÊÇ OBJ£¬·´Õý²»¹ÜʲôÀ²£¬Ö»ÒªÄܹ»±íʾobjÎļþ¾ÍÐÐÁË¡£ÎÒÃÇÔÚmakefileÒ»¿ªÊ¼¾ÍÕâÑù¶¨Ò壺

     objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

ÓÚÊÇ£¬ÎÒÃǾͿÉÒԺܷ½±ãµØÔÚÎÒÃǵÄmakefileÖÐÒÔ¡°$(objects)¡±µÄ·½Ê½À´Ê¹ÓÃÕâ¸ö±äÁ¿ÁË£¬ÓÚÊÇÎÒÃǵĸÄÁ¼°æmakefile¾Í±ä³ÉÏÂÃæÕâ¸öÑù×Ó£º

    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)
    main.o : main.c defs.h
            cc -c main.c
    kbd.o : kbd.c defs.h command.h
            cc -c kbd.c
    command.o : command.c defs.h command.h
            cc -c command.c
    display.o : display.c defs.h buffer.h
            cc -c display.c
    insert.o : insert.c defs.h buffer.h
            cc -c insert.c
    search.o : search.c defs.h buffer.h
            cc -c search.c
    files.o : files.c defs.h buffer.h command.h
            cc -c files.c
    utils.o : utils.c defs.h
            cc -c utils.c
    clean :
            rm edit $(objects)


ÓÚÊÇÈç¹ûÓÐÐ嵀 .o Îļþ¼ÓÈ룬ÎÒÃÇÖ»Ðè¼òµ¥µØÐÞ¸ÄһϠobjects ±äÁ¿¾Í¿ÉÒÔÁË¡£

¹ØÓÚ±äÁ¿¸ü¶àµÄ»°Ì⣬ÎÒ»áÔÚºóÐø¸øÄãÒ»Ò»µÀÀ´¡£


Îå¡¢ÈÃmake×Ô¶¯ÍƵ¼

GNUµÄmakeºÜÇ¿´ó£¬Ëü¿ÉÒÔ×Ô¶¯ÍƵ¼ÎļþÒÔ¼°ÎļþÒÀÀµ¹ØÏµºóÃæµÄÃüÁÓÚÊÇÎÒÃǾÍû±ØÒªÈ¥ÔÚÿһ¸ö[.o]Îļþºó¶¼Ð´ÉÏÀàËÆµÄÃüÁÒòΪ£¬ÎÒÃǵÄmake»á×Ô¶¯Ê¶±ð£¬²¢×Ô¼ºÍƵ¼ÃüÁî¡£

Ö»Òªmake¿´µ½Ò»¸ö[.o]Îļþ£¬Ëü¾Í»á×Ô¶¯µÄ°Ñ[.c]Îļþ¼ÓÔÚÒÀÀµ¹ØÏµÖУ¬Èç¹ûmakeÕÒµ½Ò»¸öwhatever.o£¬ÄÇôwhatever.c£¬¾Í»áÊÇwhatever.oµÄÒÀÀµÎļþ¡£²¢ÇÒ cc -c whatever.c Ò²»á±»ÍƵ¼³öÀ´£¬ÓÚÊÇ£¬ÎÒÃǵÄmakefileÔÙÒ²²»ÓÃдµÃÕâô¸´ÔÓ¡£ÎÒÃǵÄÊÇеÄmakefileÓÖ³ö¯ÁË¡£


    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)

    main.o : defs.h
    kbd.o : defs.h command.h
    command.o : defs.h command.h
    display.o : defs.h buffer.h
    insert.o : defs.h buffer.h
    search.o : defs.h buffer.h
    files.o : defs.h buffer.h command.h
    utils.o : defs.h

    .PHONY : clean
    clean :
            rm edit $(objects)

ÕâÖÖ·½·¨£¬Ò²¾ÍÊÇmakeµÄ¡°Òþ»Þ¹æÔò¡±¡£ÉÏÃæÎļþÄÚÈÝÖУ¬¡°.PHONY¡±±íʾ£¬cleanÊǸöαĿ±êÎļþ¡£

¹ØÓÚ¸üΪÏêϸµÄ¡°Òþ»Þ¹æÔò¡±ºÍ¡°Î±Ä¿±êÎļþ¡±£¬ÎÒ»áÔÚºóÐø¸øÄãÒ»Ò»µÀÀ´¡£


Áù¡¢ÁíÀà·ç¸ñµÄmakefile

¼´È»ÎÒÃǵÄmake¿ÉÒÔ×Ô¶¯ÍƵ¼ÃüÁÄÇôÎÒ¿´µ½ÄǶÑ[.o]ºÍ[.h]µÄÒÀÀµ¾ÍÓе㲻ˬ£¬ÄÇô¶àµÄÖØ¸´µÄ[.h]£¬Äܲ»ÄÜ°ÑÆäÊÕ£ÆðÀ´£¬ºÃ°É£¬Ã»ÓÐÎÊÌ⣬Õâ¸ö¶ÔÓÚmakeÀ´ËµºÜÈÝÒ×£¬Ë­½ÐËüÌṩÁË×Ô¶¯ÍƵ¼ÃüÁîºÍÎļþµÄ¹¦ÄÜÄØ£¿À´¿´¿´×îзç¸ñµÄmakefile°É¡£

    objects = main.o kbd.o command.o display.o \
              insert.o search.o files.o utils.o

    edit : $(objects)
            cc -o edit $(objects)

    $(objects) : defs.h
    kbd.o command.o files.o : command.h
    display.o insert.o search.o files.o : buffer.h

    .PHONY : clean
    clean :
            rm edit $(objects)

ÕâÖÖ·ç¸ñ£¬ÈÃÎÒÃǵÄmakefile±äµÃºÜ¼òµ¥£¬µ«ÎÒÃǵÄÎļþÒÀÀµ¹ØÏµ¾ÍÏÔµÃÓеãÁèÂÒÁË¡£ÓãºÍÐÜÕÆ²»¿É¼æµÃ¡£»¹¿´ÄãµÄϲºÃÁË¡£ÎÒÊDz»Ï²»¶ÕâÖÖ·ç¸ñµÄ£¬Ò»ÊÇÎļþµÄÒÀÀµ¹ØÏµ¿´²»Çå³þ£¬¶þÊÇÈç¹ûÎļþÒ»¶à£¬Òª¼ÓÈ뼸¸öеÄ.oÎļþ£¬ÄǾÍÀí²»Çå³þÁË¡£


Æß¡¢Çå¿ÕÄ¿±êÎļþµÄ¹æÔò

ÿ¸öMakefileÖж¼Ó¦¸Ãдһ¸öÇå¿ÕÄ¿±êÎļþ£¨.oºÍÖ´ÐÐÎļþ£©µÄ¹æÔò£¬Õâ²»½ö±ãÓÚÖØ±àÒ룬ҲºÜÀûÓÚ±£³ÖÎļþµÄÇå½à¡£ÕâÊÇÒ»¸ö¡°ÐÞÑø¡±£¨ºÇºÇ£¬»¹¼ÇµÃÎҵġ¶±à³ÌÐÞÑø¡·Â𣩡£Ò»°ãµÄ·ç¸ñ¶¼ÊÇ£º

        clean:
            rm edit $(objects)

¸üΪÎȽ¡µÄ×ö·¨ÊÇ£º

        .PHONY : clean
        clean :
                -rm edit $(objects)

Ç°ÃæËµ¹ý£¬.PHONYÒâ˼±íʾcleanÊÇÒ»¸ö¡°Î±Ä¿±ê¡±£¬¡£¶øÔÚrmÃüÁîÇ°Ãæ¼ÓÁËÒ»¸öС¼õºÅµÄÒâ˼¾ÍÊÇ£¬Ò²ÐíijЩÎļþ³öÏÖÎÊÌ⣬µ«²»Òª¹Ü£¬¼ÌÐø×öºóÃæµÄÊ¡£µ±È»£¬cleanµÄ¹æÔò²»Òª·ÅÔÚÎļþµÄ¿ªÍ·£¬²»È»£¬Õâ¾Í»á±ä³ÉmakeµÄĬÈÏÄ¿±ê£¬ÏàÐÅË­Ò²²»Ô¸ÒâÕâÑù¡£²»³ÉÎÄµÄ¹æ¾ØÊÇ¡ª¡ª¡°clean´ÓÀ´¶¼ÊÇ·ÅÔÚÎļþµÄ×îºó¡±¡£


ÉÏÃæ¾ÍÊÇÒ»¸ömakefileµÄ¸Åò£¬Ò²ÊÇmakefileµÄ»ù´¡£¬ÏÂÃæ»¹ÓкܶàmakefileµÄÏà¹ØÏ¸½Ú£¬×¼±¸ºÃÁËÂð£¿×¼±¸ºÃÁ˾ÍÀ´¡£


Ò»¡¢MakefileÀïÓÐʲô£¿

MakefileÀïÖ÷Òª°üº¬ÁËÎå¸ö¶«Î÷£ºÏÔʽ¹æÔò¡¢Òþ»Þ¹æÔò¡¢±äÁ¿¶¨Òå¡¢ÎļþָʾºÍ×¢ÊÍ¡£

1¡¢ÏÔʽ¹æÔò¡£ÏÔʽ¹æÔò˵Ã÷ÁË£¬ÈçºÎÉú³ÉÒ»¸ö»ò¶àµÄµÄÄ¿±êÎļþ¡£ÕâÊÇÓÉMakefileµÄÊéдÕßÃ÷ÏÔÖ¸³ö£¬ÒªÉú³ÉµÄÎļþ£¬ÎļþµÄÒÀÀµÎļþ£¬Éú³ÉµÄÃüÁî¡£

2¡¢Òþ»Þ¹æÔò¡£ÓÉÓÚÎÒÃǵÄmakeÓÐ×Ô¶¯ÍƵ¼µÄ¹¦ÄÜ£¬ËùÒÔÒþ»ÞµÄ¹æÔò¿ÉÒÔÈÃÎÒÃDZȽϴֲڵؼòÂÔµØÊéдMakefile£¬ÕâÊÇÓÉmakeËùÖ§³ÖµÄ¡£

3¡¢±äÁ¿µÄ¶¨Òå¡£ÔÚMakefileÖÐÎÒÃÇÒª¶¨ÒåһϵÁеıäÁ¿£¬±äÁ¿Ò»°ã¶¼ÊÇ×Ö·û´®£¬Õâ¸öÓеãÄãCÓïÑÔÖеĺ꣬µ±Makefile±»Ö´ÐÐʱ£¬ÆäÖеıäÁ¿¶¼»á±»À©Õ¹µ½ÏàÓ¦µÄÒýÓÃλÖÃÉÏ¡£

4¡¢Îļþָʾ¡£Æä°üÀ¨ÁËÈý¸ö²¿·Ö£¬Ò»¸öÊÇÔÚÒ»¸öMakefileÖÐÒýÓÃÁíÒ»¸öMakefile£¬¾ÍÏñCÓïÑÔÖеÄincludeÒ»Ñù£»ÁíÒ»¸öÊÇÖ¸¸ù¾ÝijЩÇé¿öÖ¸¶¨MakefileÖеÄÓÐЧ²¿·Ö£¬¾ÍÏñCÓïÑÔÖеÄÔ¤±àÒë#ifÒ»Ñù£»»¹ÓоÍÊǶ¨ÒåÒ»¸ö¶àÐеÄÃüÁî¡£ÓйØÕâÒ»²¿·ÖµÄÄÚÈÝ£¬ÎÒ»áÔÚºóÐøµÄ²¿·ÖÖн²Êö¡£

5¡¢×¢ÊÍ¡£MakefileÖÐÖ»ÓÐÐÐ×¢ÊÍ£¬ºÍunixµÄShell½Å±¾Ò»Ñù£¬Æä×¢ÊÍÊÇÓá°#¡±×Ö·û£¬Õâ¸ö¾ÍÏñC/C++Öеġ°//¡±Ò»Ñù¡£Èç¹ûÄãÒªÔÚÄãµÄMakefileÖÐʹÓá°#¡±×Ö·û£¬¿ÉÒÔÓ÷´Ð±¿ò½øÐÐתÒ壬È磺¡°\#¡±¡£

×îºó£¬»¹ÖµµÃÒ»ÌáµÄÊÇ£¬ÔÚMakefileÖеÄÃüÁ±ØÐëÒªÒÔ[Tab]¼ü¿ªÊ¼¡£


¶þ¡¢MakefileµÄÎļþÃû

ĬÈϵÄÇé¿öÏ£¬makeÃüÁî»áÔÚµ±Ç°Ä¿Â¼Ï°´Ë³ÐòÕÒѰÎļþÃûΪ¡°GNUmakefile¡±¡¢¡°makefile¡±¡¢¡°Makefile¡±µÄÎļþ£¬ÕÒµ½Á˽âÊÍÕâ¸öÎļþ¡£ÔÚÕâÈý¸öÎļþÃûÖУ¬×îºÃʹÓá°Makefile¡±Õâ¸öÎļþÃû£¬ÒòΪ£¬Õâ¸öÎļþÃûµÚÒ»¸ö×Ö·ûΪ´óд£¬ÕâÑùÓÐÒ»ÖÖÏÔÄ¿µÄ¸Ð¾õ¡£×îºÃ²»ÒªÓá°GNUmakefile¡±£¬Õâ¸öÎļþÊÇGNUµÄmakeʶ±ðµÄ¡£ÓÐÁíÍâһЩmakeÖ»¶ÔȫСдµÄ¡°makefile¡±ÎļþÃûÃô¸Ð£¬µ«ÊÇ»ù±¾ÉÏÀ´Ëµ£¬´ó¶àÊýµÄmake¶¼Ö§³Ö¡°makefile¡±ºÍ¡°Makefile¡±ÕâÁ½ÖÖĬÈÏÎļþÃû¡£

µ±È»£¬Äã¿ÉÒÔʹÓñðµÄÎļþÃûÀ´ÊéдMakefile£¬±ÈÈ磺¡°Make.linux¡±£¬¡°Make.Solaris¡±£¬¡°Make.AIX¡±µÈ£¬Èç¹ûÒªÖ¸¶¨Ìض¨µÄMakefile£¬Äã¿ÉÒÔʹÓÃmakeµÄ¡°-f¡±ºÍ¡°--file¡±²ÎÊý£¬È磺make -f Make.linux»òmake --file Make.AIX¡£


Èý¡¢ÒýÓÃÆäËüµÄMakefile

ÔÚMakefileʹÓÃinclude¹Ø¼ü×Ö¿ÉÒ԰ѱðµÄMakefile°üº¬½øÀ´£¬ÕâºÜÏñCÓïÑÔµÄ#include£¬±»°üº¬µÄÎļþ»áÔ­Ä£Ô­ÑùµÄ·ÅÔÚµ±Ç°ÎļþµÄ°üº¬Î»Öá£includeµÄÓï·¨ÊÇ£º

    include <filename>;

    filename¿ÉÒÔÊǵ±Ç°²Ù×÷ϵͳShellµÄÎļþģʽ£¨¿ÉÒÔ±£º¬Â·¾¶ºÍͨÅä·û£©

ÔÚincludeÇ°Ãæ¿ÉÒÔÓÐһЩ¿Õ×Ö·û£¬µ«ÊǾø²»ÄÜÊÇ[Tab]¼ü¿ªÊ¼¡£includeºÍ<filename>;¿ÉÒÔÓÃÒ»¸ö»ò¶à¸ö¿Õ¸ñ¸ô¿ª¡£¾Ù¸öÀý×Ó£¬ÄãÓÐÕâÑù¼¸¸öMakefile£ºa.mk¡¢b.mk¡¢c.mk£¬»¹ÓÐÒ»¸öÎļþ½Ðfoo.make£¬ÒÔ¼°Ò»¸ö±äÁ¿$(bar)£¬Æä°üº¬ÁËe.mkºÍf.mk£¬ÄÇô£¬ÏÂÃæµÄÓï¾ä£º

    include foo.make *.mk $(bar)

    µÈ¼ÛÓÚ£º

    include foo.make a.mk b.mk c.mk e.mk f.mk

makeÃüÁʼʱ£¬»á°ÑÕÒѰincludeËùÖ¸³öµÄÆäËüMakefile£¬²¢°ÑÆäÄÚÈݰ²ÖÃÔÚµ±Ç°µÄλÖ᣾ͺÃÏñC/C++µÄ#includeÖ¸ÁîÒ»Ñù¡£Èç¹ûÎļþ¶¼Ã»ÓÐÖ¸¶¨¾ø¶Ô·¾¶»òÊÇÏà¶Ô·¾¶µÄ»°£¬make»áÔÚµ±Ç°Ä¿Â¼ÏÂÊ×ÏÈѰÕÒ£¬Èç¹ûµ±Ç°Ä¿Â¼ÏÂûÓÐÕÒµ½£¬ÄÇô£¬make»¹»áÔÚÏÂÃæµÄ¼¸¸öĿ¼ÏÂÕÒ£º

    1¡¢Èç¹ûmakeÖ´ÐÐʱ£¬ÓС°-I¡±»ò¡°--include-dir¡±²ÎÊý£¬ÄÇômake¾Í»áÔÚÕâ¸ö²ÎÊýËùÖ¸¶¨µÄĿ¼ÏÂȥѰÕÒ¡£
    2¡¢Èç¹ûĿ¼<prefix>;/include£¨Ò»°ãÊÇ£º/usr/local/bin»ò/usr/include£©´æÔڵϰ£¬makeÒ²»áÈ¥ÕÒ¡£

Èç¹ûÓÐÎļþûÓÐÕÒµ½µÄ»°£¬make»áÉú³ÉÒ»Ìõ¾¯¸æÐÅÏ¢£¬µ«²»»áÂíÉϳöÏÖÖÂÃü´íÎó¡£Ëü»á¼ÌÐøÔØÈëÆäËüµÄÎļþ£¬Ò»µ©Íê³ÉmakefileµÄ¶ÁÈ¡£¬make»áÔÙÖØÊÔÕâЩûÓÐÕÒµ½£¬»òÊDz»ÄܶÁÈ¡µÄÎļþ£¬Èç¹û»¹ÊDz»ÐУ¬make²Å»á³öÏÖÒ»ÌõÖÂÃüÐÅÏ¢¡£Èç¹ûÄãÏëÈÃmake²»ÀíÄÇЩÎÞ·¨¶ÁÈ¡µÄÎļþ£¬¶ø¼ÌÐøÖ´ÐУ¬Äã¿ÉÒÔÔÚincludeǰ¼ÓÒ»¸ö¼õºÅ¡°-¡±¡£È磺

    -include <filename>;
    Æä±íʾ£¬ÎÞÂÛinclude¹ý³ÌÖгöÏÖʲô´íÎ󣬶¼²»Òª±¨´í¼ÌÐøÖ´ÐС£ºÍÆäËü°æ±¾make¼æÈݵÄÏà¹ØÃüÁîÊÇsinclude£¬Æä×÷ÓúÍÕâÒ»¸öÊÇÒ»ÑùµÄ¡£


ËÄ¡¢»·¾³±äÁ¿ MAKEFILES 

Èç¹ûÄãµÄµ±Ç°»·¾³Öж¨ÒåÁË»·¾³±äÁ¿MAKEFILES£¬ÄÇô£¬make»á°ÑÕâ¸ö±äÁ¿ÖеÄÖµ×öÒ»¸öÀàËÆÓÚincludeµÄ¶¯×÷¡£Õâ¸ö±äÁ¿ÖеÄÖµÊÇÆäËüµÄMakefile£¬Óÿոñ·Ö¸ô¡£Ö»ÊÇ£¬ËüºÍinclude²»Í¬µÄÊÇ£¬´ÓÕâ¸ö»·¾³±äÖÐÒýÈëµÄMakefileµÄ¡°Ä¿±ê¡±²»»áÆð×÷Óã¬Èç¹û»·¾³±äÁ¿Öж¨ÒåµÄÎļþ·¢ÏÖ´íÎó£¬makeÒ²»á²»Àí¡£

µ«ÊÇÔÚÕâÀïÎÒ»¹Êǽ¨Ò鲻ҪʹÓÃÕâ¸ö»·¾³±äÁ¿£¬ÒòΪֻҪÕâ¸ö±äÁ¿Ò»±»¶¨Ò壬ÄÇôµ±ÄãʹÓÃmakeʱ£¬ËùÓеÄMakefile¶¼»áÊܵ½ËüµÄÓ°Ï죬Õâ¾ø²»ÊÇÄãÏë¿´µ½µÄ¡£ÔÚÕâÀïÌáÕâ¸öÊ£¬Ö»ÊÇΪÁ˸æËß´ó¼Ò£¬Ò²ÐíÓÐʱºòÄãµÄMakefile³öÏÖÁ˹ÖÊ£¬ÄÇôÄã¿ÉÒÔ¿´¿´µ±Ç°»·¾³ÖÐÓÐûÓж¨ÒåÕâ¸ö±äÁ¿¡£


Îå¡¢makeµÄ¹¤×÷·½Ê½

GNUµÄmake¹¤×÷ʱµÄÖ´Ðв½ÖèÈëÏ£º£¨ÏëÀ´ÆäËüµÄmakeÒ²ÊÇÀàËÆ£©

    1¡¢¶ÁÈëËùÓеÄMakefile¡£
    2¡¢¶ÁÈë±»includeµÄÆäËüMakefile¡£
    3¡¢³õʼ»¯ÎļþÖеıäÁ¿¡£
    4¡¢ÍƵ¼Òþ»Þ¹æÔò£¬²¢·ÖÎöËùÓйæÔò¡£
    5¡¢ÎªËùÓеÄÄ¿±êÎļþ´´½¨ÒÀÀµ¹ØÏµÁ´¡£
    6¡¢¸ù¾ÝÒÀÀµ¹ØÏµ£¬¾ö¶¨ÄÄЩĿ±êÒªÖØÐÂÉú³É¡£
    7¡¢Ö´ÐÐÉú³ÉÃüÁî¡£

1-5²½ÎªµÚÒ»¸ö½×¶Î£¬6-7ΪµÚ¶þ¸ö½×¶Î¡£µÚÒ»¸ö½×¶ÎÖУ¬Èç¹û¶¨ÒåµÄ±äÁ¿±»Ê¹ÓÃÁË£¬ÄÇô£¬make»á°ÑÆäÕ¹¿ªÔÚʹÓõÄλÖᣵ«make²¢²»»áÍêÈ«ÂíÉÏÕ¹¿ª£¬makeʹÓõÄÊÇÍÏÑÓÕ½Êõ£¬Èç¹û±äÁ¿³öÏÖÔÚÒÀÀµ¹ØÏµµÄ¹æÔòÖУ¬ÄÇô½öµ±ÕâÌõÒÀÀµ±»¾ö¶¨ÒªÊ¹ÓÃÁË£¬±äÁ¿²Å»áÔÚÆäÄÚ²¿Õ¹¿ª¡£

µ±È»£¬Õâ¸ö¹¤×÷·½Ê½Äã²»Ò»¶¨ÒªÇå³þ£¬µ«ÊÇÖªµÀÕâ¸ö·½Ê½ÄãÒ²»á¶Ômake¸üΪÊìϤ¡£ÓÐÁËÕâ¸ö»ù´¡£¬ºóÐø²¿·ÖÒ²¾ÍÈÝÒ׿´¶®ÁË¡£

 


Êéд¹æÔò


¹æÔò°üº¬Á½¸ö²¿·Ö£¬Ò»¸öÊÇÒÀÀµ¹ØÏµ£¬Ò»¸öÊÇÉú³ÉÄ¿±êµÄ·½·¨¡£

ÔÚMakefileÖУ¬¹æÔòµÄ˳ÐòÊǺÜÖØÒªµÄ£¬ÒòΪ£¬MakefileÖÐÖ»Ó¦¸ÃÓÐÒ»¸ö×îÖÕÄ¿±ê£¬ÆäËüµÄÄ¿±ê¶¼ÊDZ»Õâ¸öÄ¿±êËùÁ¬´ø³öÀ´µÄ£¬ËùÒÔÒ»¶¨ÒªÈÃmakeÖªµÀÄãµÄ×îÖÕÄ¿±êÊÇʲô¡£Ò»°ãÀ´Ëµ£¬¶¨ÒåÔÚMakefileÖеÄÄ¿±ê¿ÉÄÜ»áÓкܶ࣬µ«ÊǵÚÒ»Ìõ¹æÔòÖеÄÄ¿±ê½«±»È·Á¢Îª×îÖÕµÄÄ¿±ê¡£Èç¹ûµÚÒ»Ìõ¹æÔòÖеÄÄ¿±êÓкܶà¸ö£¬ÄÇô£¬µÚÒ»¸öÄ¿±ê»á³ÉΪ×îÖÕµÄÄ¿±ê¡£makeËùÍê³ÉµÄÒ²¾ÍÊÇÕâ¸öÄ¿±ê¡£

ºÃÁË£¬»¹ÊÇÈÃÎÒÃÇÀ´¿´Ò»¿´ÈçºÎÊéд¹æÔò¡£


Ò»¡¢¹æÔò¾ÙÀý

    foo.o : foo.c defs.h       # fooÄ£¿é
            cc -c -g foo.c

¿´µ½Õâ¸öÀý×Ó£¬¸÷λӦ¸Ã²»ÊǺÜİÉúÁË£¬Ç°ÃæÒ²ÒÑ˵¹ý£¬foo.oÊÇÎÒÃǵÄÄ¿±ê£¬foo.cºÍdefs.hÊÇÄ¿±êËùÒÀÀµµÄÔ´Îļþ£¬¶øÖ»ÓÐÒ»¸öÃüÁî¡°cc -c -g foo.c¡±£¨ÒÔTab¼ü¿ªÍ·£©¡£Õâ¸ö¹æÔò¸æËßÎÒÃÇÁ½¼þÊ£º

    1¡¢ÎļþµÄÒÀÀµ¹ØÏµ£¬foo.oÒÀÀµÓÚfoo.cºÍdefs.hµÄÎļþ£¬Èç¹ûfoo.cºÍdefs.hµÄÎļþÈÕÆÚÒª±Èfoo.oÎļþÈÕÆÚҪУ¬»òÊÇfoo.o²»´æÔÚ£¬ÄÇôÒÀÀµ¹ØÏµ·¢Éú¡£
    2¡¢Èç¹ûÉú³É£¨»ò¸üУ©foo.oÎļþ¡£Ò²¾ÍÊÇÄǸöccÃüÁÆä˵Ã÷ÁË£¬ÈçºÎÉú³Éfoo.oÕâ¸öÎļþ¡££¨µ±È»foo.cÎļþincludeÁËdefs.hÎļþ£©


¶þ¡¢¹æÔòµÄÓï·¨

      targets : prerequisites
        command
        ...

      »òÊÇÕâÑù£º 

      targets : prerequisites ; command
            command
            ...

targetsÊÇÎļþÃû£¬ÒÔ¿Õ¸ñ·Ö¿ª£¬¿ÉÒÔʹÓÃͨÅä·û¡£Ò»°ãÀ´Ëµ£¬ÎÒÃǵÄÄ¿±ê»ù±¾ÉÏÊÇÒ»¸öÎļþ£¬µ«Ò²ÓпÉÄÜÊǶà¸öÎļþ¡£

commandÊÇÃüÁîÐУ¬Èç¹ûÆä²»Óë¡°target:prerequisites¡±ÔÚÒ»ÐУ¬ÄÇô£¬±ØÐëÒÔ[Tab¼ü]¿ªÍ·£¬Èç¹ûºÍprerequisitesÔÚÒ»ÐУ¬ÄÇô¿ÉÒÔÓ÷ֺÅ×öΪ·Ö¸ô¡££¨¼ûÉÏ£©

prerequisitesÒ²¾ÍÊÇÄ¿±êËùÒÀÀµµÄÎļþ£¨»òÒÀÀµÄ¿±ê£©¡£Èç¹ûÆäÖеÄij¸öÎļþÒª±ÈÄ¿±êÎļþҪУ¬ÄÇô£¬Ä¿±ê¾Í±»ÈÏΪÊÇ¡°¹ýʱµÄ¡±£¬±»ÈÏΪÊÇÐèÒªÖØÉú³ÉµÄ¡£Õâ¸öÔÚÇ°ÃæÒѾ­½²¹ýÁË¡£

Èç¹ûÃüÁîÌ«³¤£¬Äã¿ÉÒÔʹÓ÷´Ð±¿ò£¨¡®\¡¯£©×÷Ϊ»»Ðзû¡£make¶ÔÒ»ÐÐÉÏÓжàÉÙ¸ö×Ö·ûûÓÐÏÞÖÆ¡£¹æÔò¸æËßmakeÁ½¼þÊ£¬ÎļþµÄÒÀÀµ¹ØÏµºÍÈçºÎ³É³ÉÄ¿±êÎļþ¡£

Ò»°ãÀ´Ëµ£¬make»áÒÔunixµÄ±ê×¼Shell£¬Ò²¾ÍÊÇ/bin/shÀ´Ö´ÐÐÃüÁî¡£


Èý¡¢ÔÚ¹æÔòÖÐʹÓÃͨÅä·û

Èç¹ûÎÒÃÇÏ붨ÒåһϵÁбȽÏÀàËÆµÄÎļþ£¬ÎÒÃǺÜ×ÔÈ»µØ¾ÍÏëÆðʹÓÃͨÅä·û¡£makeÖ§³ÖÈý¸÷ͨÅä·û£º¡°*¡±£¬¡°?¡±ºÍ¡°[...]¡±¡£ÕâÊǺÍunixµÄB-ShellÊÇÏàͬµÄ¡£

²¨À˺ţ¨¡°~¡±£©×Ö·ûÔÚÎļþÃûÖÐÒ²ÓбȽÏÌØÊâµÄÓÃ;¡£Èç¹ûÊÇ¡°~/test¡±£¬Õâ¾Í±íʾµ±Ç°Óû§µÄ$HOMEĿ¼ÏµÄtestĿ¼¡£¶ø¡°~hchen/test¡±Ôò±íʾÓû§hchenµÄËÞÖ÷Ŀ¼ÏµÄtestĿ¼¡££¨ÕâЩ¶¼ÊÇunixϵÄС֪ʶÁË£¬makeÒ²Ö§³Ö£©¶øÔÚWindows»òÊÇMS-DOSÏ£¬Óû§Ã»ÓÐËÞÖ÷Ŀ¼£¬ÄÇô²¨À˺ÅËùÖ¸µÄĿ¼Ôò¸ù¾Ý»·¾³±äÁ¿¡°HOME¡±¶ø¶¨¡£

ͨÅä·û´úÌæÁËÄãһϵÁеÄÎļþ£¬Èç¡°*.c¡±±íʾËùÒÔºó׺ΪcµÄÎļþ¡£Ò»¸öÐèÒªÎÒÃÇ×¢ÒâµÄÊÇ£¬Èç¹ûÎÒÃǵÄÎļþÃûÖÐÓÐͨÅä·û£¬È磺¡°*¡±£¬ÄÇô¿ÉÒÔÓÃתÒå×Ö·û¡°\¡±£¬Èç¡°\*¡±À´±íÊ¾ÕæÊµµÄ¡°*¡±×Ö·û£¬¶ø²»ÊÇÈÎÒⳤ¶ÈµÄ×Ö·û´®¡£

ºÃ°É£¬»¹ÊÇÏÈÀ´¿´¼¸¸öÀý×Ó°É£º

    clean:
         rm -f *.o

    ÉÏÃæÕâ¸öÀý×ÓÎÒ²»²»¶à˵ÁË£¬ÕâÊDzÙ×÷ϵͳShellËùÖ§³ÖµÄͨÅä·û¡£ÕâÊÇÔÚÃüÁîÖеÄͨÅä·û¡£

    print: *.c
         lpr -p $?
         touch print

    ÉÏÃæÕâ¸öÀý×Ó˵Ã÷ÁËͨÅä·ûÒ²¿ÉÒÔÔÚÎÒÃǵĹæÔòÖУ¬Ä¿±êprintÒÀÀµÓÚËùÓеÄ[.c]Îļþ¡£ÆäÖеġ°$?¡±ÊÇÒ»¸ö×Ô¶¯»¯±äÁ¿£¬ÎÒ»áÔÚºóÃæ¸øÄã½²Êö¡£

    objects = *.o

    ÉÏÃæÕâ¸öÀý×Ó£¬±íʾÁË£¬Í¨·ûͬÑù¿ÉÒÔÓÃÔÚ±äÁ¿ÖС£²¢²»ÊÇ˵[*.o]»áÕ¹¿ª£¬²»£¡objectsµÄÖµ¾ÍÊÇ¡°*.o¡±¡£MakefileÖеıäÁ¿Æäʵ¾ÍÊÇC/C++ÖеĺꡣÈç¹ûÄãÒªÈÃͨÅä·ûÔÚ±äÁ¿ÖÐÕ¹¿ª£¬Ò²¾ÍÊÇÈÃobjectsµÄÖµÊÇËùÓÐ[.o]µÄÎļþÃûµÄ¼¯ºÏ£¬ÄÇô£¬Äã¿ÉÒÔÕâÑù£º

    objects := $(wildcard *.o)

ÕâÖÖÓ÷¨Óɹؼü×Ö¡°wildcard¡±Ö¸³ö£¬¹ØÓÚMakefileµÄ¹Ø¼ü×Ö£¬ÎÒÃǽ«ÔÚºóÃæÌÖÂÛ¡£


ËÄ¡¢ÎļþËÑѰ

ÔÚһЩ´óµÄ¹¤³ÌÖУ¬ÓдóÁ¿µÄÔ´Îļþ£¬ÎÒÃÇͨ³£µÄ×ö·¨ÊǰÑÕâÐí¶àµÄÔ´Îļþ·ÖÀ࣬²¢´æ·ÅÔÚ²»Í¬µÄĿ¼ÖС£ËùÒÔ£¬µ±makeÐèҪȥÕÒѰÎļþµÄÒÀÀµ¹ØÏµÊ±£¬Äã¿ÉÒÔÔÚÎļþǰ¼ÓÉÏ·¾¶£¬µ«×îºÃµÄ·½·¨ÊǰÑÒ»¸ö·¾¶¸æËßmake£¬ÈÃmakeÔÚ×Ô¶¯È¥ÕÒ¡£

MakefileÎļþÖеÄÌØÊâ±äÁ¿¡°VPATH¡±¾ÍÊÇÍê³ÉÕâ¸ö¹¦Äܵģ¬Èç¹ûûÓÐÖ¸Ã÷Õâ¸ö±äÁ¿£¬makeÖ»»áÔÚµ±Ç°µÄĿ¼ÖÐÈ¥ÕÒѰÒÀÀµÎļþºÍÄ¿±êÎļþ¡£Èç¹û¶¨ÒåÁËÕâ¸ö±äÁ¿£¬ÄÇô£¬make¾Í»áÔÚµ±µ±Ç°Ä¿Â¼ÕÒ²»µ½µÄÇé¿öÏ£¬µ½ËùÖ¸¶¨µÄĿ¼ÖÐÈ¥ÕÒѰÎļþÁË¡£

    VPATH = src:../headers

ÉÏÃæµÄµÄ¶¨ÒåÖ¸¶¨Á½¸öĿ¼£¬¡°src¡±ºÍ¡°../headers¡±£¬make»á°´ÕÕÕâ¸ö˳Ðò½øÐÐËÑË÷¡£Ä¿Â¼ÓÉ¡°Ã°ºÅ¡±·Ö¸ô¡££¨µ±È»£¬µ±Ç°Ä¿Â¼ÓÀÔ¶ÊÇ×î¸ßÓÅÏÈËÑË÷µÄµØ·½£©

ÁíÒ»¸öÉèÖÃÎļþËÑË÷·¾¶µÄ·½·¨ÊÇʹÓÃmakeµÄ¡°vpath¡±¹Ø¼ü×Ö£¨×¢Ò⣬ËüÊÇȫСдµÄ£©£¬Õâ²»ÊDZäÁ¿£¬ÕâÊÇÒ»¸ömakeµÄ¹Ø¼ü×Ö£¬ÕâºÍÉÏÃæÌáµ½µÄÄǸöVPATH±äÁ¿ºÜÀàËÆ£¬µ«ÊÇËü¸üΪÁé»î¡£Ëü¿ÉÒÔÖ¸¶¨²»Í¬µÄÎļþÔÚ²»Í¬µÄËÑË÷Ŀ¼ÖС£ÕâÊÇÒ»¸öºÜÁé»îµÄ¹¦ÄÜ¡£ËüµÄʹÓ÷½·¨ÓÐÈýÖÖ£º

    1¡¢vpath <pattern>; <directories>;

    Ϊ·ûºÏģʽ<pattern>;µÄÎļþÖ¸¶¨ËÑË÷Ŀ¼<directories>;¡£

    2¡¢vpath <pattern>;

    Çå³ý·ûºÏģʽ<pattern>;µÄÎļþµÄËÑË÷Ŀ¼¡£

    3¡¢vpath

    Çå³ýËùÓÐÒѱ»ÉèÖúÃÁ˵ÄÎļþËÑË÷Ŀ¼¡£

vapthʹÓ÷½·¨ÖеÄ<pattern>;ÐèÒª°üº¬¡°%¡±×Ö·û¡£¡°%¡±µÄÒâ˼ÊÇÆ¥ÅäÁã»òÈô¸É×Ö·û£¬ÀýÈ磬¡°%.h¡±±íʾËùÓÐÒÔ¡°.h¡±½áβµÄÎļþ¡£<pattern>;Ö¸¶¨ÁËÒªËÑË÷µÄÎļþ¼¯£¬¶ø<directories>;ÔòÖ¸¶¨ÁË<pattern>;µÄÎļþ¼¯µÄËÑË÷µÄĿ¼¡£ÀýÈ磺

    vpath %.h ../headers

¸ÃÓï¾ä±íʾ£¬ÒªÇómakeÔÚ¡°../headers¡±Ä¿Â¼ÏÂËÑË÷ËùÓÐÒÔ¡°.h¡±½áβµÄÎļþ¡££¨Èç¹ûijÎļþÔÚµ±Ç°Ä¿Â¼Ã»ÓÐÕÒµ½µÄ»°£©

ÎÒÃÇ¿ÉÒÔÁ¬ÐøµØÊ¹ÓÃvpathÓï¾ä£¬ÒÔÖ¸¶¨²»Í¬ËÑË÷²ßÂÔ¡£Èç¹ûÁ¬ÐøµÄvpathÓï¾äÖгöÏÖÁËÏàͬµÄ<pattern>;£¬»òÊDZ»Öظ´Á˵Ä<pattern>;£¬ÄÇô£¬make»á°´ÕÕvpathÓï¾äµÄÏȺó˳ÐòÀ´Ö´ÐÐËÑË÷¡£È磺

    vpath %.c foo
    vpath %   blish
    vpath %.c bar

Æä±íʾ¡°.c¡±½áβµÄÎļþ£¬ÏÈÔÚ¡°foo¡±Ä¿Â¼£¬È»ºóÊÇ¡°blish¡±£¬×îºóÊÇ¡°bar¡±Ä¿Â¼¡£

    vpath %.c foo:bar
    vpath %   blish

¶øÉÏÃæµÄÓï¾äÔò±íʾ¡°.c¡±½áβµÄÎļþ£¬ÏÈÔÚ¡°foo¡±Ä¿Â¼£¬È»ºóÊÇ¡°bar¡±Ä¿Â¼£¬×îºó²ÅÊÇ¡°blish¡±Ä¿Â¼¡£


Î塢αĿ±ê

×îÔçÏȵÄÒ»¸öÀý×ÓÖУ¬ÎÒÃÇÌáµ½¹ýÒ»¸ö¡°clean¡±µÄÄ¿±ê£¬ÕâÊÇÒ»¸ö¡°Î±Ä¿±ê¡±£¬

    clean:
            rm *.o temp

ÕýÏñÎÒÃÇÇ°ÃæÀý×ÓÖеġ°clean¡±Ò»Ñù£¬¼´È»ÎÒÃÇÉú³ÉÁËÐí¶àÎļþ±àÒëÎļþ£¬ÎÒÃÇÒ²Ó¦¸ÃÌṩһ¸öÇå³ýËüÃǵġ°Ä¿±ê¡±ÒÔ±¸ÍêÕûµØÖرàÒë¶øÓᣠ£¨ÒÔ¡°make clean¡±À´Ê¹ÓøÃÄ¿±ê£©

ÒòΪ£¬ÎÒÃDz¢²»Éú³É¡°clean¡±Õâ¸öÎļþ¡£¡°Î±Ä¿±ê¡±²¢²»ÊÇÒ»¸öÎļþ£¬Ö»ÊÇÒ»¸ö±êÇ©£¬ÓÉÓÚ¡°Î±Ä¿±ê¡±²»ÊÇÎļþ£¬ËùÒÔmakeÎÞ·¨Éú³ÉËüµÄÒÀÀµ¹ØÏµºÍ¾ö¶¨ËüÊÇ·ñÒªÖ´ÐС£ÎÒÃÇÖ»ÓÐͨ¹ýÏÔʾµØÖ¸Ã÷Õâ¸ö¡°Ä¿±ê¡±²ÅÄÜÈÃÆäÉúЧ¡£µ±È»£¬¡°Î±Ä¿±ê¡±µÄÈ¡Ãû²»ÄܺÍÎļþÃûÖØÃû£¬²»È»Æä¾ÍʧȥÁË¡°Î±Ä¿±ê¡±µÄÒâÒåÁË¡£

µ±È»£¬ÎªÁ˱ÜÃâºÍÎļþÖØÃûµÄÕâÖÖÇé¿ö£¬ÎÒÃÇ¿ÉÒÔʹÓÃÒ»¸öÌØÊâµÄ±ê¼Ç¡°.PHONY¡±À´ÏÔʾµØÖ¸Ã÷Ò»¸öÄ¿±êÊÇ¡°Î±Ä¿±ê¡±£¬Ïòmake˵Ã÷£¬²»¹ÜÊÇ·ñÓÐÕâ¸öÎļþ£¬Õâ¸öÄ¿±ê¾ÍÊÇ¡°Î±Ä¿±ê¡±¡£

    .PHONY : clean

Ö»ÒªÓÐÕâ¸öÉùÃ÷£¬²»¹ÜÊÇ·ñÓС°clean¡±Îļþ£¬ÒªÔËÐС°clean¡±Õâ¸öÄ¿±ê£¬Ö»ÓС°make clean¡±ÕâÑù¡£ÓÚÊÇÕû¸ö¹ý³Ì¿ÉÒÔÕâÑùд£º

     .PHONY: clean
    clean:
            rm *.o temp

αĿ±êÒ»°ãûÓÐÒÀÀµµÄÎļþ¡£µ«ÊÇ£¬ÎÒÃÇÒ²¿ÉÒÔΪαĿ±êÖ¸¶¨ËùÒÀÀµµÄÎļþ¡£Î±Ä¿±êͬÑù¿ÉÒÔ×÷Ϊ¡°Ä¬ÈÏÄ¿±ê¡±£¬Ö»Òª½«Æä·ÅÔÚµÚÒ»¸ö¡£Ò»¸öʾÀý¾ÍÊÇ£¬Èç¹ûÄãµÄMakefileÐèÒªÒ»¿ÚÆøÉú³ÉÈô¸É¸ö¿ÉÖ´ÐÐÎļþ£¬µ«ÄãÖ»Ïë¼òµ¥µØÇÃÒ»¸ömakeÍêÊ£¬²¢ÇÒ£¬ËùÓеÄÄ¿±êÎļþ¶¼Ð´ÔÚÒ»¸öMakefileÖУ¬ÄÇôÄã¿ÉÒÔʹÓá°Î±Ä¿±ê¡±Õâ¸öÌØÐÔ£º

    all : prog1 prog2 prog3
    .PHONY : all

    prog1 : prog1.o utils.o
            cc -o prog1 prog1.o utils.o

    prog2 : prog2.o
            cc -o prog2 prog2.o

    prog3 : prog3.o sort.o utils.o
            cc -o prog3 prog3.o sort.o utils.o

ÎÒÃÇÖªµÀ£¬MakefileÖеĵÚÒ»¸öÄ¿±ê»á±»×÷ΪÆäĬÈÏÄ¿±ê¡£ÎÒÃÇÉùÃ÷ÁËÒ»¸ö¡°all¡±µÄαĿ±ê£¬ÆäÒÀÀµÓÚÆäËüÈý¸öÄ¿±ê¡£ÓÉÓÚαĿ±êµÄÌØÐÔÊÇ£¬×ÜÊDZ»Ö´Ðеģ¬ËùÒÔÆäÒÀÀµµÄÄÇÈý¸öÄ¿±ê¾Í×ÜÊDz»Èç¡°all¡±Õâ¸öÄ¿±êС£ËùÒÔ£¬ÆäËüÈý¸öÄ¿±êµÄ¹æÔò×ÜÊǻᱻ¾öÒé¡£Ò²¾Í´ïµ½ÁËÎÒÃÇÒ»¿ÚÆøÉú³É¶à¸öÄ¿±êµÄÄ¿µÄ¡£¡°.PHONY : all¡±ÉùÃ÷ÁË¡°all¡±Õâ¸öÄ¿±êΪ¡°Î±Ä¿±ê¡±¡£

Ëæ±ãÌáÒ»¾ä£¬´ÓÉÏÃæµÄÀý×ÓÎÒÃÇ¿ÉÒÔ¿´³ö£¬Ä¿±êÒ²¿ÉÒÔ³ÉΪÒÀÀµ¡£ËùÒÔ£¬Î±Ä¿±êͬÑùÒ²¿É³ÉΪÒÀÀµ¡£¿´ÏÂÃæµÄÀý×Ó£º

    .PHONY: cleanall cleanobj cleandiff

    cleanall : cleanobj cleandiff
            rm program

    cleanobj :
            rm *.o

    cleandiff :
            rm *.diff

¡°make clean¡±½«Çå³ýËùÓÐÒª±»Çå³ýµÄÎļþ¡£¡°cleanobj¡±ºÍ¡°cleandiff¡±ÕâÁ½¸öαĿ±êÓеãÏñ¡°×Ó³ÌÐò¡±µÄÒâ˼¡£ÎÒÃÇ¿ÉÒÔÊäÈë¡°make cleanall¡±ºÍ¡°make cleanobj¡±ºÍ¡°make cleandiff¡±ÃüÁîÀ´´ïµ½Çå³ý²»Í¬ÖÖÀàÎļþµÄÄ¿µÄ¡£

 

Áù¡¢¶àÄ¿±ê

MakefileµÄ¹æÔòÖеÄÄ¿±ê¿ÉÒÔ²»Ö¹Ò»¸ö£¬ÆäÖ§³Ö¶àÄ¿±ê£¬ÓпÉÄÜÎÒÃǵĶà¸öÄ¿±êͬʱÒÀÀµÓÚÒ»¸öÎļþ£¬²¢ÇÒÆäÉú³ÉµÄÃüÁî´óÌåÀàËÆ¡£ÓÚÊÇÎÒÃǾÍÄÜ°ÑÆäºÏ²¢ÆðÀ´¡£µ±È»£¬¶à¸öÄ¿±êµÄÉú³É¹æÔòµÄÖ´ÐÐÃüÁîÊÇͬһ¸ö£¬Õâ¿ÉÄÜ»á¿ÉÎÒÃÇ´øÀ´Âé·³£¬²»¹ýºÃÔÚÎÒÃǵĿÉÒÔʹÓÃÒ»¸ö×Ô¶¯»¯±äÁ¿¡°$@¡±£¨¹ØÓÚ×Ô¶¯»¯±äÁ¿£¬½«ÔÚºóÃæ½²Êö£©£¬Õâ¸ö±äÁ¿±íʾ×ÅĿǰ¹æÔòÖÐËùÓеÄÄ¿±êµÄ¼¯ºÏ£¬ÕâÑù˵¿ÉÄܺܳéÏ󣬻¹ÊÇ¿´Ò»¸öÀý×Ó°É¡£

    bigoutput littleoutput : text.g
            generate text.g -$(subst output,,$@) >; $@

    ÉÏÊö¹æÔòµÈ¼ÛÓÚ£º

    bigoutput : text.g
            generate text.g -big >; bigoutput
    littleoutput : text.g
            generate text.g -little >; littleoutput

    ÆäÖУ¬-$(subst output,,$@)Öеġ°$¡±±íʾִÐÐÒ»¸öMakefileµÄº¯Êý£¬º¯ÊýÃûΪsubst£¬ºóÃæµÄΪ²ÎÊý¡£¹ØÓÚº¯Êý£¬½«ÔÚºóÃæ½²Êö¡£ÕâÀïµÄÕâ¸öº¯ÊýÊǽØÈ¡×Ö·û´®µÄÒâ˼£¬¡°$@¡±±íʾĿ±êµÄ¼¯ºÏ£¬¾ÍÏñÒ»¸öÊý×飬¡°$@¡±ÒÀ´ÎÈ¡³öÄ¿±ê£¬²¢Ö´ÓÚÃüÁî¡£


Æß¡¢¾²Ì¬Ä£Ê½

¾²Ì¬Ä£Ê½¿ÉÒÔ¸ü¼ÓÈÝÒ׵ض¨Òå¶àÄ¿±êµÄ¹æÔò£¬¿ÉÒÔÈÃÎÒÃǵĹæÔò±äµÃ¸ü¼ÓµÄÓе¯ÐÔºÍÁé»î¡£ÎÒÃÇ»¹ÊÇÏÈÀ´¿´Ò»ÏÂÓï·¨£º

    <targets ...>;: <target-pattern>;: <prereq-patterns ...>;
            <commands>;
            ...


    targets¶¨ÒåÁËһϵÁеÄÄ¿±êÎļþ£¬¿ÉÒÔÓÐͨÅä·û¡£ÊÇÄ¿±êµÄÒ»¸ö¼¯ºÏ¡£

    target-parrternÊÇÖ¸Ã÷ÁËtargetsµÄģʽ£¬Ò²¾ÍÊǵÄÄ¿±ê¼¯Ä£Ê½¡£

    prereq-parrternsÊÇÄ¿±êµÄÒÀÀµÄ£Ê½£¬Ëü¶Ôtarget-parrternÐγɵÄģʽÔÙ½øÐÐÒ»´ÎÒÀÀµÄ¿±êµÄ¶¨Òå¡£

ÕâÑùÃèÊöÕâÈý¸ö¶«Î÷£¬¿ÉÄÜ»¹ÊÇûÓÐ˵Çå³þ£¬»¹ÊǾٸöÀý×ÓÀ´ËµÃ÷һϰɡ£Èç¹ûÎÒÃǵÄ<target-parrtern>;¶¨Òå³É¡°%.o¡±£¬Òâ˼ÊÇÎÒÃǵÄ<target>;¼¯ºÏÖж¼ÊÇÒÔ¡°.o¡±½áβµÄ£¬¶øÈç¹ûÎÒÃǵÄ<prereq-parrterns>;¶¨Òå³É¡°%.c¡±£¬Òâ˼ÊǶÔ<target-parrtern>;ËùÐγɵÄÄ¿±ê¼¯½øÐжþ´Î¶¨Ò壬Æä¼ÆËã·½·¨ÊÇ£¬È¡<target-parrtern>;ģʽÖеġ°%¡±£¨Ò²¾ÍÊÇÈ¥µôÁË[.o]Õâ¸ö½á⣩£¬²¢ÎªÆä¼ÓÉÏ[.c]Õâ¸ö½á⣬ÐγɵÄм¯ºÏ¡£

ËùÒÔ£¬ÎÒÃǵġ°Ä¿±êģʽ¡±»òÊÇ¡°ÒÀÀµÄ£Ê½¡±Öж¼Ó¦¸ÃÓС°%¡±Õâ¸ö×Ö·û£¬Èç¹ûÄãµÄÎļþÃûÖÐÓС°%¡±ÄÇôÄã¿ÉÒÔʹÓ÷´Ð±¸Ü¡°\¡±½øÐÐתÒ壬À´±êÃ÷ÕæÊµµÄ¡°%¡±×Ö·û¡£

¿´Ò»¸öÀý×Ó£º

    objects = foo.o bar.o

    all: $(objects)

    $(objects): %.o: %.c
            $(CC) -c $(CFLAGS) $< -o $@


ÉÏÃæµÄÀý×ÓÖУ¬Ö¸Ã÷ÁËÎÒÃǵÄÄ¿±ê´Ó$objectÖлñÈ¡£¬¡°%.o¡±±íÃ÷ÒªËùÓÐÒÔ¡°.o¡±½áβµÄÄ¿±ê£¬Ò²¾ÍÊÇ¡°foo.o bar.o¡±£¬Ò²¾ÍÊDZäÁ¿$object¼¯ºÏµÄģʽ£¬¶øÒÀÀµÄ£Ê½¡°%.c¡±Ôòȡģʽ¡°%.o¡±µÄ¡°%¡±£¬Ò²¾ÍÊÇ¡°foo bar¡±£¬²¢ÎªÆä¼ÓÏ¡°.c¡±µÄºó׺£¬ÓÚÊÇ£¬ÎÒÃǵÄÒÀÀµÄ¿±ê¾ÍÊÇ¡°foo.c bar.c¡±¡£¶øÃüÁîÖеġ°$<¡±ºÍ¡°$@¡±ÔòÊÇ×Ô¶¯»¯±äÁ¿£¬¡°$<¡±±íʾËùÓеÄÒÀÀµÄ¿±ê¼¯£¨Ò²¾ÍÊÇ¡°foo.c bar.c¡±£©£¬¡°$@¡±±íʾĿ±ê¼¯£¨Ò²¾ÍÊÇ¡°foo.o bar.o¡±£©¡£ÓÚÊÇ£¬ÉÏÃæµÄ¹æÔòÕ¹¿ªºóµÈ¼ÛÓÚÏÂÃæµÄ¹æÔò£º

    foo.o : foo.c
            $(CC) -c $(CFLAGS) foo.c -o foo.o
    bar.o : bar.c
            $(CC) -c $(CFLAGS) bar.c -o bar.o

ÊÔÏ룬Èç¹ûÎÒÃǵġ°%.o¡±Óм¸°Ù¸ö£¬ÄÇÖÖÎÒÃÇÖ»ÒªÓÃÕâÖֺܼòµ¥µÄ¡°¾²Ì¬Ä£Ê½¹æÔò¡±¾Í¿ÉÒÔдÍêÒ»¶Ñ¹æÔò£¬ÊµÔÚÊÇÌ«ÓÐЧÂÊÁË¡£¡°¾²Ì¬Ä£Ê½¹æÔò¡±µÄÓ÷¨ºÜÁé»î£¬Èç¹ûÓõúã¬ÄÇ»áÒ»¸öºÜÇ¿´óµÄ¹¦ÄÜ¡£ÔÙ¿´Ò»¸öÀý×Ó£º


    files = foo.elc bar.o lose.o

    $(filter %.o,$(files)): %.o: %.c
            $(CC) -c $(CFLAGS) $< -o $@
    $(filter %.elc,$(files)): %.elc: %.el
            emacs -f batch-byte-compile $<


$(filter %.o,$(files))±íʾµ÷ÓÃMakefileµÄfilterº¯Êý£¬¹ýÂË¡°$filter¡±¼¯£¬Ö»ÒªÆäÖÐģʽΪ¡°%.o¡±µÄÄÚÈÝ¡£ÆäµÄËüÄÚÈÝ£¬ÎҾͲ»Óöà˵Á˰ɡ£Õâ¸öÀý×ÖչʾÁËMakefileÖиü´óµÄµ¯ÐÔ¡£


°Ë¡¢×Ô¶¯Éú³ÉÒÀÀµÐÔ

ÔÚMakefileÖУ¬ÎÒÃǵÄÒÀÀµ¹ØÏµ¿ÉÄÜ»áÐèÒª°üº¬Ò»ÏµÁеÄÍ·Îļþ£¬±ÈÈ磬Èç¹ûÎÒÃǵÄmain.cÖÐÓÐÒ»¾ä¡°#include "defs.h"¡±£¬ÄÇôÎÒÃǵÄÒÀÀµ¹ØÏµÓ¦¸ÃÊÇ£º

    main.o : main.c defs.h

µ«ÊÇ£¬Èç¹ûÊÇÒ»¸ö±È½Ï´óÐ͵Ť³Ì£¬Äã±ØÐèÇå³þÄÄЩCÎļþ°üº¬ÁËÄÄЩͷÎļþ£¬²¢ÇÒ£¬ÄãÔÚ¼ÓÈë»òɾ³ýÍ·Îļþʱ£¬Ò²ÐèҪСÐĵØÐÞ¸ÄMakefile£¬ÕâÊÇÒ»¸öºÜûÓÐά»¤ÐԵŤ×÷¡£ÎªÁ˱ÜÃâÕâÖÖ·±ÖضøÓÖÈÝÒ׳ö´íµÄÊÂÇ飬ÎÒÃÇ¿ÉÒÔʹÓÃC/C++±àÒëµÄÒ»¸ö¹¦ÄÜ¡£´ó¶àÊýµÄC/C++±àÒëÆ÷¶¼Ö§³ÖÒ»¸ö¡°-M¡±µÄÑ¡Ï¼´×Ô¶¯ÕÒѰԴÎļþÖаüº¬µÄÍ·Îļþ£¬²¢Éú³ÉÒ»¸öÒÀÀµ¹ØÏµ¡£ÀýÈ磬Èç¹ûÎÒÃÇÖ´ÐÐÏÂÃæµÄÃüÁ

    cc -M main.c

ÆäÊä³öÊÇ£º

    main.o : main.c defs.h

ÓÚÊÇÓɱàÒëÆ÷×Ô¶¯Éú³ÉµÄÒÀÀµ¹ØÏµ£¬ÕâÑùÒ»À´£¬Äã¾Í²»±ØÔÙÊÖ¶¯ÊéдÈô¸ÉÎļþµÄÒÀÀµ¹ØÏµ£¬¶øÓɱàÒëÆ÷×Ô¶¯Éú³ÉÁË¡£ÐèÒªÌáÐÑÒ»¾äµÄÊÇ£¬Èç¹ûÄãʹÓÃGNUµÄC/C++±àÒëÆ÷£¬ÄãµÃÓá°-MM¡±²ÎÊý£¬²»È»£¬¡°-M¡±²ÎÊý»á°ÑһЩ±ê×¼¿âµÄÍ·ÎļþÒ²°üº¬½øÀ´¡£

    gcc -M main.cµÄÊä³öÊÇ£º

    main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \
         /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
         /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \
         /usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \
         /usr/include/bits/sched.h /usr/include/libio.h \
         /usr/include/_G_config.h /usr/include/wchar.h \
         /usr/include/bits/wchar.h /usr/include/gconv.h \
         /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \
         /usr/include/bits/stdio_lim.h


    gcc -MM main.cµÄÊä³öÔòÊÇ£º

    main.o: main.c defs.h

ÄÇô£¬±àÒëÆ÷µÄÕâ¸ö¹¦ÄÜÈçºÎÓëÎÒÃǵÄMakefileÁªÏµÔÚÒ»ÆðÄØ¡£ÒòΪÕâÑùÒ»À´£¬ÎÒÃǵÄMakefileÒ²Òª¸ù¾ÝÕâЩԴÎļþÖØÐÂÉú³É£¬ÈÃMakefile×ÔÒÑÒÀÀµÓÚÔ´Îļþ£¿Õâ¸ö¹¦Äܲ¢²»ÏÖʵ£¬²»¹ýÎÒÃÇ¿ÉÒÔÓÐÆäËüÊÖ¶ÎÀ´ÓػصØÊµÏÖÕâÒ»¹¦ÄÜ¡£GNU×éÖ¯½¨Òé°Ñ±àÒëÆ÷Ϊÿһ¸öÔ´ÎļþµÄ×Ô¶¯Éú³ÉµÄÒÀÀµ¹ØÏµ·Åµ½Ò»¸öÎļþÖУ¬ÎªÃ¿Ò»¸ö¡°name.c¡±µÄÎļþ¶¼Éú³ÉÒ»¸ö¡°name.d¡±µÄMakefileÎļþ£¬[.d]ÎļþÖоʹæ·Å¶ÔÓ¦[.c]ÎļþµÄÒÀÀµ¹ØÏµ¡£

ÓÚÊÇ£¬ÎÒÃÇ¿ÉÒÔд³ö[.c]ÎļþºÍ[.d]ÎļþµÄÒÀÀµ¹ØÏµ£¬²¢ÈÃmake×Ô¶¯¸üлò×Ô³É[.d]Îļþ£¬²¢°ÑÆä°üº¬ÔÚÎÒÃǵÄÖ÷MakefileÖУ¬ÕâÑù£¬ÎÒÃǾͿÉÒÔ×Ô¶¯»¯µØÉú³Éÿ¸öÎļþµÄÒÀÀµ¹ØÏµÁË¡£

ÕâÀÎÒÃǸø³öÁËÒ»¸öģʽ¹æÔòÀ´²úÉú[.d]Îļþ£º

    %.d: %.c
            @set -e; rm -f $@; \
             $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; \
             sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ >; $@; \
             rm -f $@.$$$$


Õâ¸ö¹æÔòµÄÒâ˼ÊÇ£¬ËùÓеÄ[.d]ÎļþÒÀÀµÓÚ[.c]Îļþ£¬¡°rm -f $@¡±µÄÒâ˼ÊÇɾ³ýËùÓеÄÄ¿±ê£¬Ò²¾ÍÊÇ[.d]Îļþ£¬µÚ¶þÐеÄÒâ˼ÊÇ£¬ÎªÃ¿¸öÒÀÀµÎļþ¡°$<¡±£¬Ò²¾ÍÊÇ[.c]ÎļþÉú³ÉÒÀÀµÎļþ£¬¡°$@¡±±íʾģʽ¡°%.d¡±Îļþ£¬Èç¹ûÓÐÒ»¸öCÎļþÊÇname.c£¬ÄÇô¡°%¡±¾ÍÊÇ¡°name¡±£¬¡°$$$$¡±ÒâΪһ¸öËæ»ú±àºÅ£¬µÚ¶þÐÐÉú³ÉµÄÎļþÓпÉÄÜÊÇ¡°name.d.12345¡±£¬µÚÈýÐÐʹÓÃsedÃüÁî×öÁËÒ»¸öÌæ»»£¬¹ØÓÚsedÃüÁîµÄÓ÷¨Çë²Î¿´Ïà¹ØµÄʹÓÃÎĵµ¡£µÚËÄÐоÍÊÇɾ³ýÁÙʱÎļþ¡£

×ܶøÑÔÖ®£¬Õâ¸öģʽҪ×öµÄʾÍÊÇÔÚ±àÒëÆ÷Éú³ÉµÄÒÀÀµ¹ØÏµÖмÓÈë[.d]ÎļþµÄÒÀÀµ£¬¼´°ÑÒÀÀµ¹ØÏµ£º

    main.o : main.c defs.h

ת³É£º

    main.o main.d : main.c defs.h

ÓÚÊÇ£¬ÎÒÃǵÄ[.d]ÎļþÒ²»á×Ô¶¯¸üÐÂÁË£¬²¢»á×Ô¶¯Éú³ÉÁË£¬µ±È»£¬Ä㻹¿ÉÒÔÔÚÕâ¸ö[.d]ÎļþÖмÓÈëµÄ²»Ö»ÊÇÒÀÀµ¹ØÏµ£¬°üÀ¨Éú³ÉµÄÃüÁîÒ²¿ÉÒ»²¢¼ÓÈ룬ÈÃÿ¸ö[.d]Îļþ¶¼°üº¬Ò»¸öÍêÀµµÄ¹æÔò¡£Ò»µ©ÎÒÃÇÍê³ÉÕâ¸ö¹¤×÷£¬½ÓÏÂÀ´£¬ÎÒÃǾÍÒª°ÑÕâЩ×Ô¶¯Éú³ÉµÄ¹æÔò·Å½øÎÒÃǵÄÖ÷MakefileÖС£ÎÒÃÇ¿ÉÒÔʹÓÃMakefileµÄ¡°include¡±ÃüÁÀ´ÒýÈë±ðµÄMakefileÎļþ£¨Ç°Ãæ½²¹ý£©£¬ÀýÈ磺

    sources = foo.c bar.c

    include $(sources:.c=.d)

ÉÏÊöÓï¾äÖеġ°$(sources:.c=.d)¡±Öеġ°.c=.d¡±µÄÒâ˼ÊÇ×öÒ»¸öÌæ»»£¬°Ñ±äÁ¿$(sources)ËùÓÐ[.c]µÄ×Ö´®¶¼Ìæ»»³É[.d]£¬¹ØÓÚÕâ¸ö¡°Ìæ»»¡±µÄÄÚÈÝ£¬ÔÚºóÃæÎÒ»áÓиüΪÏêϸµÄ½²Êö¡£µ±È»£¬ÄãµÃ×¢Òâ´ÎÐò£¬ÒòΪincludeÊǰ´´ÎÀ´ÔØÈëÎļþ£¬×îÏÈÔØÈëµÄ[.d]ÎļþÖеÄÄ¿±ê»á³ÉΪĬÈÏÄ¿±ê¡£

 

ÊéдÃüÁî
 

ÿÌõ¹æÔòÖеÄÃüÁîºÍ²Ù×÷ϵͳShellµÄÃüÁîÐÐÊÇÒ»Öµġ£make»áÒ»°´Ë³ÐòÒ»ÌõÒ»ÌõµÄÖ´ÐÐÃüÁÿÌõÃüÁîµÄ¿ªÍ·±ØÐëÒÔ[Tab]¼ü¿ªÍ·£¬³ý·Ç£¬ÃüÁîÊǽô¸úÔÚÒÀÀµ¹æÔòºóÃæµÄ·ÖºÅºóµÄ¡£ÔÚÃüÁîÐÐÖ®¼äÖеĿոñ»òÊÇ¿ÕÐлᱻºöÂÔ£¬µ«ÊÇÈç¹û¸Ã¿Õ¸ñ»ò¿ÕÐÐÊÇÒÔTab¼ü¿ªÍ·µÄ£¬ÄÇômake»áÈÏΪÆäÊÇÒ»¸ö¿ÕÃüÁî¡£

ÎÒÃÇÔÚunixÏ¿ÉÄÜ»áʹÓò»Í¬µÄShell£¬µ«ÊÇmakeµÄÃüÁîĬÈÏÊDZ»¡°/bin/sh¡±¡ª¡ªunixµÄ±ê×¼Shell½âÊÍÖ´Ðеġ£³ý·ÇÄãÌØ±ðÖ¸¶¨Ò»¸öÆäËüµÄShell¡£MakefileÖУ¬¡°#¡±ÊÇ×¢ÊÍ·û£¬ºÜÏñC/C++Öеġ°//¡±£¬ÆäºóµÄ±¾ÐÐ×Ö·û¶¼±»×¢ÊÍ¡£

Ò»¡¢ÏÔʾÃüÁî

ͨ³££¬make»á°ÑÆäÒªÖ´ÐеÄÃüÁîÐÐÔÚÃüÁîÖ´ÐÐǰÊä³öµ½ÆÁÄ»ÉÏ¡£µ±ÎÒÃÇÓá°@¡±×Ö·ûÔÚÃüÁîÐÐǰ£¬ÄÇô£¬Õâ¸öÃüÁ²»±»makeÏÔʾ³öÀ´£¬×î¾ß´ú±íÐÔµÄÀý×ÓÊÇ£¬ÎÒÃÇÓÃÕâ¸ö¹¦ÄÜÀ´ÏñÆÁÄ»ÏÔʾһЩÐÅÏ¢¡£È磺

    @echo ÕýÔÚ±àÒëXXXÄ£¿é......

µ±makeÖ´ÐÐʱ£¬»áÊä³ö¡°ÕýÔÚ±àÒëXXXÄ£¿é......¡±×Ö´®£¬µ«²»»áÊä³öÃüÁÈç¹ûûÓС°@¡±£¬ÄÇô£¬make½«Êä³ö£º

    echo ÕýÔÚ±àÒëXXXÄ£¿é......
    ÕýÔÚ±àÒëXXXÄ£¿é......

Èç¹ûmakeÖ´ÐÐʱ£¬´øÈëmake²ÎÊý¡°-n¡±»ò¡°--just-print¡±£¬ÄÇôÆäÖ»ÊÇÏÔʾÃüÁµ«²»»áÖ´ÐÐÃüÁÕâ¸ö¹¦ÄܺÜÓÐÀûÓÚÎÒÃǵ÷ÊÔÎÒÃǵÄMakefile£¬¿´¿´ÎÒÃÇÊéдµÄÃüÁîÊÇÖ´ÐÐÆðÀ´ÊÇʲôÑù×ӵĻòÊÇʲô˳ÐòµÄ¡£

¶ømake²ÎÊý¡°-s¡±»ò¡°--slient¡±ÔòÊÇÈ«Ãæ½ûÖ¹ÃüÁîµÄÏÔʾ¡£

 

¶þ¡¢ÃüÁîÖ´ÐÐ

µ±ÒÀÀµÄ¿±êÐÂÓÚÄ¿±êʱ£¬Ò²¾ÍÊǵ±¹æÔòµÄÄ¿±êÐèÒª±»¸üÐÂʱ£¬make»áÒ»ÌõÒ»ÌõµÄÖ´ÐÐÆäºóµÄÃüÁî¡£ÐèҪעÒâµÄÊÇ£¬Èç¹ûÄãÒªÈÃÉÏÒ»ÌõÃüÁîµÄ½á¹ûÓ¦ÓÃÔÚÏÂÒ»ÌõÃüÁîʱ£¬ÄãÓ¦¸ÃʹÓ÷ֺŷָôÕâÁ½ÌõÃüÁî¡£±ÈÈçÄãµÄµÚÒ»ÌõÃüÁîÊÇcdÃüÁÄãÏ£ÍûµÚ¶þÌõÃüÁîµÃÔÚcdÖ®ºóµÄ»ù´¡ÉÏÔËÐУ¬ÄÇôÄã¾Í²»ÄܰÑÕâÁ½ÌõÃüÁîдÔÚÁ½ÐÐÉÏ£¬¶øÓ¦¸Ã°ÑÕâÁ½ÌõÃüÁîдÔÚÒ»ÐÐÉÏ£¬Ó÷ֺŷָô¡£È磺

    ʾÀýÒ»£º
        exec:
                cd /home/hchen
                pwd

    ʾÀý¶þ£º
        exec:
                cd /home/hchen; pwd

µ±ÎÒÃÇÖ´ÐС°make exec¡±Ê±£¬µÚÒ»¸öÀý×ÓÖеÄcdûÓÐ×÷Óã¬pwd»á´òÓ¡³öµ±Ç°µÄMakefileĿ¼£¬¶øµÚ¶þ¸öÀý×ÓÖУ¬cd¾ÍÆð×÷ÓÃÁË£¬pwd»á´òÓ¡³ö¡°/home/hchen¡±¡£

makeÒ»°ãÊÇʹÓû·¾³±äÁ¿SHELLÖÐËù¶¨ÒåµÄϵͳShellÀ´Ö´ÐÐÃüÁĬÈÏÇé¿öÏÂʹÓÃunixµÄ±ê×¼Shell¡ª¡ª/bin/shÀ´Ö´ÐÐÃüÁî¡£µ«ÔÚMS-DOSÏÂÓеãÌØÊ⣬ÒòΪMS-DOSÏÂûÓÐSHELL»·¾³±äÁ¿£¬µ±È»ÄãÒ²¿ÉÒÔÖ¸¶¨¡£Èç¹ûÄãÖ¸¶¨ÁËunix·ç¸ñµÄĿ¼ÐÎʽ£¬Ê×ÏÈ£¬make»áÔÚSHELLËùÖ¸¶¨µÄ·¾¶ÖÐÕÒѰÃüÁî½âÊÍÆ÷£¬Èç¹ûÕÒ²»µ½£¬Æä»áÔÚµ±Ç°ÅÌ·ûÖеĵ±Ç°Ä¿Â¼ÖÐѰÕÒ£¬Èç¹ûÔÙÕÒ²»µ½£¬Æä»áÔÚPATH»·¾³±äÁ¿ÖÐËù¶¨ÒåµÄËùÓз¾¶ÖÐѰÕÒ¡£MS-DOSÖУ¬Èç¹ûÄ㶨ÒåµÄÃüÁî½âÊÍÆ÷ûÓÐÕÒµ½£¬Æä»á¸øÄãµÄÃüÁî½âÊÍÆ÷¼ÓÉÏÖîÈç¡°.exe¡±¡¢¡°.com¡±¡¢¡°.bat¡±¡¢¡°.sh¡±µÈºó׺¡£

 

Èý¡¢ÃüÁî³ö´í

ÿµ±ÃüÁîÔËÐÐÍêºó£¬make»á¼ì²âÿ¸öÃüÁîµÄ·µ»ØÂ룬Èç¹ûÃüÁî·µ»Ø³É¹¦£¬ÄÇômake»áÖ´ÐÐÏÂÒ»ÌõÃüÁµ±¹æÔòÖÐËùÓеÄÃüÁî³É¹¦·µ»Øºó£¬Õâ¸ö¹æÔò¾ÍËãÊdzɹ¦Íê³ÉÁË¡£Èç¹ûÒ»¸ö¹æÔòÖеÄij¸öÃüÁî³ö´íÁË£¨ÃüÁîÍ˳öÂë·ÇÁ㣩£¬ÄÇômake¾Í»áÖÕÖ¹Ö´Ðе±Ç°¹æÔò£¬Õ⽫ÓпÉÄÜÖÕÖ¹ËùÓйæÔòµÄÖ´ÐС£

ÓÐЩʱºò£¬ÃüÁîµÄ³ö´í²¢²»±íʾ¾ÍÊÇ´íÎóµÄ¡£ÀýÈçmkdirÃüÁÎÒÃÇÒ»¶¨ÐèÒª½¨Á¢Ò»¸öĿ¼£¬Èç¹ûĿ¼²»´æÔÚ£¬ÄÇômkdir¾Í³É¹¦Ö´ÐУ¬ÍòÊ´󼪣¬Èç¹ûĿ¼´æÔÚ£¬ÄÇô¾Í³ö´íÁË¡£ÎÒÃÇÖ®ËùÒÔʹÓÃmkdirµÄÒâ˼¾ÍÊÇÒ»¶¨ÒªÓÐÕâÑùµÄÒ»¸öĿ¼£¬ÓÚÊÇÎÒÃǾͲ»Ï£Íûmkdir³ö´í¶øÖÕÖ¹¹æÔòµÄÔËÐС£

ΪÁË×öµ½ÕâÒ»µã£¬ºöÂÔÃüÁîµÄ³ö´í£¬ÎÒÃÇ¿ÉÒÔÔÚMakefileµÄÃüÁîÐÐǰ¼ÓÒ»¸ö¼õºÅ¡°-¡±£¨ÔÚTab¼üÖ®ºó£©£¬±ê¼ÇΪ²»¹ÜÃüÁî³ö²»³ö´í¶¼ÈÏΪÊdzɹ¦µÄ¡£È磺

   clean:
            -rm -f *.o

»¹ÓÐÒ»¸öÈ«¾ÖµÄ°ì·¨ÊÇ£¬¸ømake¼ÓÉÏ¡°-i¡±»òÊÇ¡°--ignore-errors¡±²ÎÊý£¬ÄÇô£¬MakefileÖÐËùÓÐÃüÁî¶¼»áºöÂÔ´íÎó¡£¶øÈç¹ûÒ»¸ö¹æÔòÊÇÒÔ¡°.IGNORE¡±×÷ΪĿ±êµÄ£¬ÄÇôÕâ¸ö¹æÔòÖеÄËùÓÐÃüÁ»áºöÂÔ´íÎó¡£ÕâЩÊDz»Í¬¼¶±ðµÄ·ÀÖ¹ÃüÁî³ö´íµÄ·½·¨£¬Äã¿ÉÒÔ¸ù¾ÝÄãµÄ²»Í¬Ï²»¶ÉèÖá£

»¹ÓÐÒ»¸öÒªÌáһϵÄmakeµÄ²ÎÊýµÄÊÇ¡°-k¡±»òÊÇ¡°--keep-going¡±£¬Õâ¸ö²ÎÊýµÄÒâ˼ÊÇ£¬Èç¹ûij¹æÔòÖеÄÃüÁî³ö´íÁË£¬ÄÇô¾ÍÖÕÄ¿¸Ã¹æÔòµÄÖ´ÐУ¬µ«¼ÌÐøÖ´ÐÐÆäËü¹æÔò¡£

 

ËÄ¡¢Ç¶Ì×Ö´ÐÐmake

ÔÚһЩ´óµÄ¹¤³ÌÖУ¬ÎÒÃÇ»á°ÑÎÒÃDz»Í¬Ä£¿é»òÊDz»Í¬¹¦ÄܵÄÔ´Îļþ·ÅÔÚ²»Í¬µÄĿ¼ÖУ¬ÎÒÃÇ¿ÉÒÔÔÚÿ¸öĿ¼Öж¼Êéдһ¸ö¸ÃĿ¼µÄMakefile£¬ÕâÓÐÀûÓÚÈÃÎÒÃǵÄMakefile±äµÃ¸ü¼ÓµØ¼ò½à£¬¶ø²»ÖÁÓÚ°ÑËùÓеĶ«Î÷È«²¿Ð´ÔÚÒ»¸öMakefileÖУ¬ÕâÑù»áºÜÄÑά»¤ÎÒÃǵÄMakefile£¬Õâ¸ö¼¼Êõ¶ÔÓÚÎÒÃÇÄ£¿é±àÒëºÍ·Ö¶Î±àÒëÓÐ×ŷdz£´óµÄºÃ´¦¡£

ÀýÈ磬ÎÒÃÇÓÐÒ»¸ö×ÓĿ¼½Ðsubdir£¬Õâ¸öĿ¼ÏÂÓиöMakefileÎļþ£¬À´Ö¸Ã÷ÁËÕâ¸öĿ¼ÏÂÎļþµÄ±àÒë¹æÔò¡£ÄÇôÎÒÃÇ×ܿصÄMakefile¿ÉÒÔÕâÑùÊéд£º

    subsystem:
            cd subdir && $(MAKE)

ÆäµÈ¼ÛÓÚ£º

    subsystem:
            $(MAKE) -C subdir

¶¨Òå$(MAKE)ºê±äÁ¿µÄÒâ˼ÊÇ£¬Ò²ÐíÎÒÃǵÄmakeÐèҪһЩ²ÎÊý£¬ËùÒÔ¶¨Òå³ÉÒ»¸ö±äÁ¿±È½ÏÀûÓÚά»¤¡£ÕâÁ½¸öÀý×ÓµÄÒâ˼¶¼ÊÇÏȽøÈë¡°subdir¡±Ä¿Â¼£¬È»ºóÖ´ÐÐmakeÃüÁî¡£

ÎÒÃǰÑÕâ¸öMakefile½Ð×ö¡°×Ü¿ØMakefile¡±£¬×Ü¿ØMakefileµÄ±äÁ¿¿ÉÒÔ´«µÝµ½Ï¼¶µÄMakefileÖУ¨Èç¹ûÄãÏÔʾµÄÉùÃ÷£©£¬µ«ÊDz»»á¸²¸ÇϲãµÄMakefileÖÐËù¶¨ÒåµÄ±äÁ¿£¬³ý·ÇÖ¸¶¨ÁË¡°-e¡±²ÎÊý¡£

Èç¹ûÄãÒª´«µÝ±äÁ¿µ½Ï¼¶MakefileÖУ¬ÄÇôÄã¿ÉÒÔʹÓÃÕâÑùµÄÉùÃ÷£º

    export <variable ...>;

Èç¹ûÄã²»ÏëÈÃijЩ±äÁ¿´«µÝµ½Ï¼¶MakefileÖУ¬ÄÇôÄã¿ÉÒÔÕâÑùÉùÃ÷£º 

    unexport <variable ...>;

È磺
    
    ʾÀýÒ»£º

        export variable = value

        ÆäµÈ¼ÛÓÚ£º

        variable = value
        export variable

        ÆäµÈ¼ÛÓÚ£º

        export variable := value

        ÆäµÈ¼ÛÓÚ£º

        variable := value
        export variable

    ʾÀý¶þ£º

        export variable += value

        ÆäµÈ¼ÛÓÚ£º

        variable += value
        export variable

Èç¹ûÄãÒª´«µÝËùÓеıäÁ¿£¬ÄÇô£¬Ö»ÒªÒ»¸öexport¾ÍÐÐÁË¡£ºóÃæÊ²Ã´Ò²²»Óøú£¬±íʾ´«µÝËùÓеıäÁ¿¡£

ÐèҪעÒâµÄÊÇ£¬ÓÐÁ½¸ö±äÁ¿£¬Ò»¸öÊÇSHELL£¬Ò»¸öÊÇMAKEFLAGS£¬ÕâÁ½¸ö±äÁ¿²»¹ÜÄãÊÇ·ñexport£¬Æä×ÜÊÇÒª´«µÝµ½Ï²ãMakefileÖУ¬ÌرðÊÇMAKEFILES±äÁ¿£¬ÆäÖаüº¬ÁËmakeµÄ²ÎÊýÐÅÏ¢£¬Èç¹ûÎÒÃÇÖ´ÐС°×Ü¿ØMakefile¡±Ê±ÓÐmake²ÎÊý»òÊÇÔÚÉϲãMakefileÖж¨ÒåÁËÕâ¸ö±äÁ¿£¬ÄÇôMAKEFILES±äÁ¿½«»áÊÇÕâЩ²ÎÊý£¬²¢»á´«µÝµ½Ï²ãMakefileÖУ¬ÕâÊÇÒ»¸öϵͳ¼¶µÄ»·¾³±äÁ¿¡£

µ«ÊÇmakeÃüÁîÖеÄÓм¸¸ö²ÎÊý²¢²»ÍùÏ´«µÝ£¬ËüÃÇÊÇ¡°-C¡±,¡°-f¡±,¡°-h¡±¡°-o¡±ºÍ¡°-W¡±£¨ÓйØMakefile²ÎÊýµÄϸ½Ú½«ÔÚºóÃæËµÃ÷£©£¬Èç¹ûÄã²»ÏëÍùϲ㴫µÝ²ÎÊý£¬ÄÇô£¬Äã¿ÉÒÔÕâÑùÀ´£º

    subsystem:
            cd subdir && $(MAKE) MAKEFLAGS=

Èç¹ûÄ㶨ÒåÁË»·¾³±äÁ¿MAKEFLAGS£¬ÄÇôÄãµÃÈ·ÐÅÆäÖеÄÑ¡ÏîÊÇ´ó¼Ò¶¼»áÓõ½µÄ£¬Èç¹ûÆäÖÐÓС°-t¡±,¡°-n¡±,ºÍ¡°-q¡±²ÎÊý£¬ÄÇô½«»áÓÐÈÃÄãÒâÏë²»µ½µÄ½á¹û£¬»òÐí»áÈÃÄãÒì³£µØ¿Ö»Å¡£

»¹ÓÐÒ»¸öÔÚ¡°Ç¶Ì×Ö´ÐС±ÖбȽÏÓÐÓõIJÎÊý£¬¡°-w¡±»òÊÇ¡°--print-directory¡±»áÔÚmakeµÄ¹ý³ÌÖÐÊä³öһЩÐÅÏ¢£¬ÈÃÄã¿´µ½Ä¿Ç°µÄ¹¤×÷Ŀ¼¡£±ÈÈ磬Èç¹ûÎÒÃǵÄϼ¶makeĿ¼ÊÇ¡°/home/hchen/gnu/make¡±£¬Èç¹ûÎÒÃÇʹÓá°make -w¡±À´Ö´ÐУ¬ÄÇôµ±½øÈë¸ÃĿ¼ʱ£¬ÎÒÃǻῴµ½£º

    make: Entering directory `/home/hchen/gnu/make'.

¶øÔÚÍê³ÉϲãmakeºóÀ뿪Ŀ¼ʱ£¬ÎÒÃǻῴµ½£º

    make: Leaving directory `/home/hchen/gnu/make'

µ±ÄãʹÓá°-C¡±²ÎÊýÀ´Ö¸¶¨makeϲãMakefileʱ£¬¡°-w¡±»á±»×Ô¶¯´ò¿ªµÄ¡£Èç¹û²ÎÊýÖÐÓС°-s¡±£¨¡°--slient¡±£©»òÊÇ¡°--no-print-directory¡±£¬ÄÇô£¬¡°-w¡±×ÜÊÇʧЧµÄ¡£

 

Îå¡¢¶¨ÒåÃüÁî°ü

Èç¹ûMakefileÖгöÏÖһЩÏàͬÃüÁîÐòÁУ¬ÄÇôÎÒÃÇ¿ÉÒÔΪÕâЩÏàͬµÄÃüÁîÐòÁж¨ÒåÒ»¸ö±äÁ¿¡£¶¨ÒåÕâÖÖÃüÁîÐòÁеÄÓï·¨ÒÔ¡°define¡±¿ªÊ¼£¬ÒÔ¡°endef¡±½áÊø£¬È磺

    define run-yacc
    yacc $(firstword $^)
    mv y.tab.c $@
    endef

ÕâÀ¡°run-yacc¡±ÊÇÕâ¸öÃüÁî°üµÄÃû×Ö£¬Æä²»ÒªºÍMakefileÖеıäÁ¿ÖØÃû¡£ÔÚ¡°define¡±ºÍ¡°endef¡±ÖеÄÁ½ÐоÍÊÇÃüÁîÐòÁС£Õâ¸öÃüÁî°üÖеĵÚÒ»¸öÃüÁîÊÇÔËÐÐYacc³ÌÐò£¬ÒòΪYacc³ÌÐò×ÜÊÇÉú³É¡°y.tab.c¡±µÄÎļþ£¬ËùÒÔµÚ¶þÐеÄÃüÁî¾ÍÊǰÑÕâ¸öÎļþ¸Ä¸ÄÃû×Ö¡£»¹ÊǰÑÕâ¸öÃüÁî°ü·Åµ½Ò»¸öʾÀýÖÐÀ´¿´¿´°É¡£

    foo.c : foo.y
            $(run-yacc)

ÎÒÃÇ¿ÉÒÔ¿´¼û£¬ÒªÊ¹ÓÃÕâ¸öÃüÁî°ü£¬ÎÒÃǾͺÃÏñʹÓñäÁ¿Ò»Ñù¡£ÔÚÕâ¸öÃüÁî°üµÄʹÓÃÖУ¬ÃüÁî°ü¡°run-yacc¡±Öеġ°$^¡±¾ÍÊÇ¡°foo.y¡±£¬¡°$@¡±¾ÍÊÇ¡°foo.c¡±£¨ÓйØÕâÖÖÒÔ¡°$¡±¿ªÍ·µÄÌØÊâ±äÁ¿£¬ÎÒÃÇ»áÔÚºóÃæ½éÉÜ£©£¬makeÔÚÖ´ÐÐÃüÁî°üʱ£¬ÃüÁî°üÖеÄÿ¸öÃüÁî»á±»ÒÀ´Î¶ÀÁ¢Ö´ÐС£

 


ʹÓñäÁ¿


ÔÚMakefileÖе͍ÒåµÄ±äÁ¿£¬¾ÍÏñÊÇC/C++ÓïÑÔÖеĺêÒ»Ñù£¬Ëû´ú±íÁËÒ»¸öÎı¾×Ö´®£¬ÔÚMakefileÖÐÖ´ÐеÄʱºòÆä»á×Ô¶¯Ô­Ä£Ô­ÑùµØÕ¹¿ªÔÚËùʹÓõĵط½¡£ÆäÓëC/C++Ëù²»Í¬µÄÊÇ£¬Äã¿ÉÒÔÔÚMakefileÖиıäÆäÖµ¡£ÔÚMakefileÖУ¬±äÁ¿¿ÉÒÔʹÓÃÔÚ¡°Ä¿±ê¡±£¬¡°ÒÀÀµÄ¿±ê¡±£¬¡°ÃüÁ»òÊÇMakefileµÄÆäËü²¿·ÖÖС£

±äÁ¿µÄÃüÃû×Ö¿ÉÒÔ°üº¬×Ö·û¡¢Êý×Ö£¬Ï»®Ïߣ¨¿ÉÒÔÊÇÊý×Ö¿ªÍ·£©£¬µ«²»Ó¦¸Ãº¬ÓС°:¡±¡¢¡°#¡±¡¢¡°=¡±»òÊÇ¿Õ×Ö·û£¨¿Õ¸ñ¡¢»Ø³µµÈ£©¡£±äÁ¿ÊÇ´óСдÃô¸ÐµÄ£¬¡°foo¡±¡¢¡°Foo¡±ºÍ¡°FOO¡±ÊÇÈý¸ö²»Í¬µÄ±äÁ¿Ãû¡£´«Í³µÄMakefileµÄ±äÁ¿ÃûÊÇÈ«´óдµÄÃüÃû·½Ê½£¬µ«ÎÒÍÆ¼öʹÓôóСд´îÅäµÄ±äÁ¿Ãû£¬È磺MakeFlags¡£ÕâÑù¿ÉÒÔ±ÜÃâºÍϵͳµÄ±äÁ¿³åÍ»£¬¶ø·¢ÉúÒâÍâµÄÊÂÇé¡£

ÓÐһЩ±äÁ¿ÊÇºÜÆæ¹Ö×Ö´®£¬Èç¡°$<¡±¡¢¡°$@¡±µÈ£¬ÕâЩÊÇ×Ô¶¯»¯±äÁ¿£¬ÎÒ»áÔÚºóÃæ½éÉÜ¡£

Ò»¡¢±äÁ¿µÄ»ù´¡

±äÁ¿ÔÚÉùÃ÷ʱÐèÒª¸øÓè³õÖµ£¬¶øÔÚʹÓÃʱ£¬ÐèÒª¸øÔÚ±äÁ¿Ãûǰ¼ÓÉÏ¡°$¡±·ûºÅ£¬µ«×îºÃÓÃСÀ¨ºÅ¡°£¨£©¡±»òÊÇ´óÀ¨ºÅ¡°{}¡±°Ñ±äÁ¿¸ø°üÀ¨ÆðÀ´¡£Èç¹ûÄãҪʹÓÃÕæÊµµÄ¡°$¡±×Ö·û£¬ÄÇôÄãÐèÒªÓá°$$¡±À´±íʾ¡£

±äÁ¿¿ÉÒÔʹÓÃÔÚÐí¶àµØ·½£¬Èç¹æÔòÖеġ°Ä¿±ê¡±¡¢¡°ÒÀÀµ¡±¡¢¡°ÃüÁÒÔ¼°ÐµıäÁ¿ÖС£ÏÈ¿´Ò»¸öÀý×Ó£º

    objects = program.o foo.o utils.o
    program : $(objects)
            cc -o program $(objects)

    $(objects) : defs.h

±äÁ¿»áÔÚʹÓÃËüµÄµØ·½¾«È·µØÕ¹¿ª£¬¾ÍÏñC/C++ÖеĺêÒ»Ñù£¬ÀýÈ磺

    foo = c
    prog.o : prog.$(foo)
            $(foo)$(foo) -$(foo) prog.$(foo)

Õ¹¿ªºóµÃµ½£º

    prog.o : prog.c
            cc -c prog.c

µ±È»£¬Ç§Íò²»ÒªÔÚÄãµÄMakefileÖÐÕâÑù¸É£¬ÕâÀïÖ»ÊǾٸöÀý×ÓÀ´±íÃ÷MakefileÖеıäÁ¿ÔÚʹÓô¦Õ¹¿ªµÄÕæÊµÑù×Ó¡£¿É¼ûÆä¾ÍÊÇÒ»¸ö¡°Ìæ´ú¡±µÄÔ­Àí¡£

ÁíÍ⣬¸ø±äÁ¿¼ÓÉÏÀ¨ºÅÍêÈ«ÊÇΪÁ˸ü¼Ó°²È«µØÊ¹ÓÃÕâ¸ö±äÁ¿£¬ÔÚÉÏÃæµÄÀý×ÓÖУ¬Èç¹ûÄã²»Ïë¸ø±äÁ¿¼ÓÉÏÀ¨ºÅ£¬ÄÇÒ²¿ÉÒÔ£¬µ«ÎÒ»¹ÊÇÇ¿ÁÒ½¨ÒéÄã¸ø±äÁ¿¼ÓÉÏÀ¨ºÅ¡£


¶þ¡¢±äÁ¿ÖеıäÁ¿

ÔÚ¶¨Òå±äÁ¿µÄֵʱ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÆäËü±äÁ¿À´¹¹Ôì±äÁ¿µÄÖµ£¬ÔÚMakefileÖÐÓÐÁ½ÖÖ·½Ê½À´ÔÚÓñäÁ¿¶¨Òå±äÁ¿µÄÖµ¡£

ÏÈ¿´µÚÒ»ÖÖ·½Ê½£¬Ò²¾ÍÊǼòµ¥µÄʹÓá°=¡±ºÅ£¬ÔÚ¡°=¡±×ó²àÊDZäÁ¿£¬ÓÒ²àÊDZäÁ¿µÄÖµ£¬ÓÒ²à±äÁ¿µÄÖµ¿ÉÒÔ¶¨ÒåÔÚÎļþµÄÈκÎÒ»´¦£¬Ò²¾ÍÊÇ˵£¬ÓÒ²àÖеıäÁ¿²»Ò»¶¨·ÇÒªÊÇÒѶ¨ÒåºÃµÄÖµ£¬ÆäÒ²¿ÉÒÔʹÓúóÃæ¶¨ÒåµÄÖµ¡£È磺

    foo = $(bar)
    bar = $(ugh)
    ugh = Huh?

    all:
            echo $(foo)

ÎÒÃÇÖ´ÐС°make all¡±½«»á´ò³ö±äÁ¿$(foo)µÄÖµÊÇ¡°Huh?¡±£¨ $(foo)µÄÖµÊÇ$(bar)£¬$(bar)µÄÖµÊÇ$(ugh)£¬$(ugh)µÄÖµÊÇ¡°Huh?¡±£©¿É¼û£¬±äÁ¿ÊÇ¿ÉÒÔʹÓúóÃæµÄ±äÁ¿À´¶¨ÒåµÄ¡£

Õâ¸ö¹¦ÄÜÓкõĵط½£¬Ò²Óв»ºÃµÄµØ·½£¬ºÃµÄµØ·½ÊÇ£¬ÎÒÃÇ¿ÉÒ԰ѱäÁ¿µÄÕæÊµÖµÍÆµ½ºóÃæÀ´¶¨Ò壬È磺

    CFLAGS = $(include_dirs) -O
    include_dirs = -Ifoo -Ibar

µ±¡°CFLAGS¡±ÔÚÃüÁîÖб»Õ¹¿ªÊ±£¬»áÊÇ¡°-Ifoo -Ibar -O¡±¡£µ«ÕâÖÖÐÎʽҲÓв»ºÃµÄµØ·½£¬ÄǾÍÊǵݹ鶨Ò壬È磺

    CFLAGS = $(CFLAGS) -O

    »ò£º

    A = $(B)
    B = $(A)

Õâ»áÈÃmakeÏÝÈëÎÞÏ޵ıäÁ¿Õ¹¿ª¹ý³ÌÖÐÈ¥£¬µ±È»£¬ÎÒÃǵÄmakeÊÇÓÐÄÜÁ¦¼ì²âÕâÑùµÄ¶¨Ò壬²¢»á±¨´í¡£»¹ÓоÍÊÇÈç¹ûÔÚ±äÁ¿ÖÐʹÓú¯Êý£¬ÄÇô£¬ÕâÖÖ·½Ê½»áÈÃÎÒÃǵÄmakeÔËÐÐʱ·Ç³£Âý£¬¸üÔã¸âµÄÊÇ£¬Ëû»áʹÓõÃÁ½¸ömakeµÄº¯Êý¡°wildcard¡±ºÍ¡°shell¡±·¢Éú²»¿ÉÔ¤ÖªµÄ´íÎó¡£ÒòΪÄã²»»áÖªµÀÕâÁ½¸öº¯Êý»á±»µ÷ÓöàÉٴΡ£

ΪÁ˱ÜÃâÉÏÃæµÄÕâÖÖ·½·¨£¬ÎÒÃÇ¿ÉÒÔʹÓÃmakeÖеÄÁíÒ»ÖÖÓñäÁ¿À´¶¨Òå±äÁ¿µÄ·½·¨¡£ÕâÖÖ·½·¨Ê¹ÓõÄÊÇ¡°:=¡±²Ù×÷·û£¬È磺

    x := foo
    y := $(x) bar
    x := later

ÆäµÈ¼ÛÓÚ£º

    y := foo bar
    x := later

ÖµµÃÒ»ÌáµÄÊÇ£¬ÕâÖÖ·½·¨£¬Ç°ÃæµÄ±äÁ¿²»ÄÜʹÓúóÃæµÄ±äÁ¿£¬Ö»ÄÜʹÓÃÇ°ÃæÒѶ¨ÒåºÃÁ˵ıäÁ¿¡£Èç¹ûÊÇÕâÑù£º

    y := $(x) bar
    x := foo

ÄÇô£¬yµÄÖµÊÇ¡°bar¡±£¬¶ø²»ÊÇ¡°foo bar¡±¡£

ÉÏÃæ¶¼ÊÇһЩ±È½Ï¼òµ¥µÄ±äÁ¿Ê¹ÓÃÁË£¬ÈÃÎÒÃÇÀ´¿´Ò»¸ö¸´ÔÓµÄÀý×Ó£¬ÆäÖаüÀ¨ÁËmakeµÄº¯Êý¡¢Ìõ¼þ±í´ïʽºÍÒ»¸öϵͳ±äÁ¿¡°MAKELEVEL¡±µÄʹÓãº

    ifeq (0,${MAKELEVEL})
    cur-dir   := $(shell pwd)
    whoami    := $(shell whoami)
    host-type := $(shell arch)
    MAKE := ${MAKE} host-type=${host-type} whoami=${whoami}
    endif

¹ØÓÚÌõ¼þ±í´ïʽºÍº¯Êý£¬ÎÒÃÇÔÚºóÃæÔÙ˵£¬¶ÔÓÚϵͳ±äÁ¿¡°MAKELEVEL¡±£¬ÆäÒâ˼ÊÇ£¬Èç¹ûÎÒÃǵÄmakeÓÐÒ»¸öǶÌ×Ö´Ðе͝×÷£¨²Î¼ûÇ°ÃæµÄ¡°Ç¶Ì×ʹÓÃmake¡±£©£¬ÄÇô£¬Õâ¸ö±äÁ¿»á¼Ç¼ÁËÎÒÃǵĵ±Ç°MakefileµÄµ÷ÓòãÊý¡£

ÏÂÃæÔÙ½éÉÜÁ½¸ö¶¨Òå±äÁ¿Ê±ÎÒÃÇÐèÒªÖªµÀµÄ£¬ÇëÏÈ¿´Ò»¸öÀý×Ó£¬Èç¹ûÎÒÃÇÒª¶¨ÒåÒ»¸ö±äÁ¿£¬ÆäÖµÊÇÒ»¸ö¿Õ¸ñ£¬ÄÇôÎÒÃÇ¿ÉÒÔÕâÑùÀ´£º

    nullstring :=
    space := $(nullstring) # end of the line

nullstringÊÇÒ»¸öEmpty±äÁ¿£¬ÆäÖÐʲôҲûÓУ¬¶øÎÒÃǵÄspaceµÄÖµÊÇÒ»¸ö¿Õ¸ñ¡£ÒòΪÔÚ²Ù×÷·ûµÄÓÒ±ßÊǺÜÄÑÃèÊöÒ»¸ö¿Õ¸ñµÄ£¬ÕâÀï²ÉÓõļ¼ÊõºÜ¹ÜÓã¬ÏÈÓÃÒ»¸öEmpty±äÁ¿À´±êÃ÷±äÁ¿µÄÖµ¿ªÊ¼ÁË£¬¶øºóÃæ²ÉÓá°#¡±×¢ÊÍ·ûÀ´±íʾ±äÁ¿¶¨ÒåµÄÖÕÖ¹£¬ÕâÑù£¬ÎÒÃÇ¿ÉÒÔ¶¨Òå³öÆäÖµÊÇÒ»¸ö¿Õ¸ñµÄ±äÁ¿¡£Çë×¢ÒâÕâÀï¹ØÓÚ¡°#¡±µÄʹÓã¬×¢ÊÍ·û¡°#¡±µÄÕâÖÖÌØÐÔÖµµÃÎÒÃÇ×¢Ò⣬Èç¹ûÎÒÃÇÕâÑù¶¨ÒåÒ»¸ö±äÁ¿£º

    dir := /foo/bar    # directory to put the frobs in

dirÕâ¸ö±äÁ¿µÄÖµÊÇ¡°/foo/bar¡±£¬ºóÃæ»¹¸úÁË4¸ö¿Õ¸ñ£¬Èç¹ûÎÒÃÇÕâÑùʹÓÃÕâÑù±äÁ¿À´Ö¸¶¨±ðµÄĿ¼¡ª¡ª¡°$(dir)/file¡±ÄÇô¾ÍÍêµ°ÁË¡£

»¹ÓÐÒ»¸ö±È½ÏÓÐÓõIJÙ×÷·ûÊÇ¡°?=¡±£¬ÏÈ¿´Ê¾Àý£º

    FOO ?= bar

Æäº¬ÒåÊÇ£¬Èç¹ûFOOûÓб»¶¨Òå¹ý£¬ÄÇô±äÁ¿FOOµÄÖµ¾ÍÊÇ¡°bar¡±£¬Èç¹ûFOOÏÈǰ±»¶¨Òå¹ý£¬ÄÇôÕâÌõÓォʲôҲ²»×ö£¬ÆäµÈ¼ÛÓÚ£º

    ifeq ($(origin FOO), undefined)
      FOO = bar
    endif


Èý¡¢±äÁ¿¸ß¼¶Ó÷¨

ÕâÀï½éÉÜÁ½ÖÖ±äÁ¿µÄ¸ß¼¶Ê¹Ó÷½·¨£¬µÚÒ»ÖÖÊDZäÁ¿ÖµµÄÌæ»»¡£

ÎÒÃÇ¿ÉÒÔÌæ»»±äÁ¿ÖеĹ²ÓеIJ¿·Ö£¬Æä¸ñʽÊÇ¡°$(var:a=b)¡±»òÊÇ¡°${var:a=b}¡±£¬ÆäÒâ˼ÊÇ£¬°Ñ±äÁ¿¡°var¡±ÖÐËùÓÐÒÔ¡°a¡±×Ö´®¡°½áβ¡±µÄ¡°a¡±Ìæ»»³É¡°b¡±×Ö´®¡£ÕâÀïµÄ¡°½áβ¡±Òâ˼ÊÇ¡°¿Õ¸ñ¡±»òÊÇ¡°½áÊø·û¡±¡£

»¹ÊÇ¿´Ò»¸öʾÀý°É£º

    foo := a.o b.o c.o
    bar := $(foo:.o=.c)

Õâ¸öʾÀýÖУ¬ÎÒÃÇÏȶ¨ÒåÁËÒ»¸ö¡°$(foo)¡±±äÁ¿£¬¶øµÚ¶þÐеÄÒâ˼Êǰѡ°$(foo)¡±ÖÐËùÓÐÒÔ¡°.o¡±×Ö´®¡°½áβ¡±È«²¿Ìæ»»³É¡°.c¡±£¬ËùÒÔÎÒÃǵġ°$(bar)¡±µÄÖµ¾ÍÊÇ¡°a.c b.c c.c¡±¡£

ÁíÍâÒ»ÖÖ±äÁ¿Ìæ»»µÄ¼¼ÊõÊÇÒÔ¡°¾²Ì¬Ä£Ê½¡±£¨²Î¼ûÇ°ÃæÕ½ڣ©¶¨ÒåµÄ£¬È磺

    foo := a.o b.o c.o
    bar := $(foo:%.o=%.c)

ÕâÒÀÀµÓÚ±»Ìæ»»×Ö´®ÖеÄÓÐÏàͬµÄģʽ£¬Ä£Ê½ÖбØÐë°üº¬Ò»¸ö¡°%¡±×Ö·û£¬Õâ¸öÀý×ÓͬÑùÈÃ$(bar)±äÁ¿µÄֵΪ¡°a.c b.c c.c¡±¡£ 

µÚ¶þÖָ߼¶Ó÷¨ÊÇ¡ª¡ª¡°°Ñ±äÁ¿µÄÖµÔÙµ±³É±äÁ¿¡±¡£ÏÈ¿´Ò»¸öÀý×Ó£º

    x = y
    y = z
    a := $($(x))

ÔÚÕâ¸öÀý×ÓÖУ¬$(x)µÄÖµÊÇ¡°y¡±£¬ËùÒÔ$($(x))¾ÍÊÇ$(y)£¬ÓÚÊÇ$(a)µÄÖµ¾ÍÊÇ¡°z¡±¡££¨×¢Ò⣬ÊÇ¡°x=y¡±£¬¶ø²»ÊÇ¡°x=$(y)¡±£©

ÎÒÃÇ»¹¿ÉÒÔʹÓøü¶àµÄ²ã´Î£º

    x = y
    y = z
    z = u
    a := $($($(x)))

ÕâÀïµÄ$(a)µÄÖµÊÇ¡°u¡±£¬Ïà¹ØµÄÍÆµ¼Áô¸ø¶ÁÕß×Ô¼ºÈ¥×ö°É¡£

ÈÃÎÒÃÇÔÙ¸´ÔÓÒ»µã£¬Ê¹ÓÃÉÏ¡°ÔÚ±äÁ¿¶¨ÒåÖÐʹÓñäÁ¿¡±µÄµÚÒ»¸ö·½Ê½£¬À´¿´Ò»¸öÀý×Ó£º

    x = $(y)
    y = z
    z = Hello
    a := $($(x))

ÕâÀïµÄ$($(x))±»Ìæ»»³ÉÁË$($(y))£¬ÒòΪ$(y)ÖµÊÇ¡°z¡±£¬ËùÒÔ£¬×îÖÕ½á¹ûÊÇ£ºa:=$(z)£¬Ò²¾ÍÊÇ¡°Hello¡±¡£

ÔÙ¸´ÔÓÒ»µã£¬ÎÒÃÇÔÙ¼ÓÉϺ¯Êý£º

    x = variable1
    variable2 := Hello
    y = $(subst 1,2,$(x))
    z = y
    a := $($($(z)))

Õâ¸öÀý×ÓÖУ¬¡°$($($(z)))¡±À©Õ¹Îª¡°$($(y))¡±£¬¶øÆäÔٴα»À©Õ¹Îª¡°$($(subst 1,2,$(x)))¡±¡£$(x)µÄÖµÊÇ¡°variable1¡±£¬substº¯Êý°Ñ¡°variable1¡±ÖеÄËùÓС°1¡±×Ö´®Ìæ»»³É¡°2¡±×Ö´®£¬ÓÚÊÇ£¬¡°variable1¡±±ä³É¡°variable2¡±£¬ÔÙÈ¡ÆäÖµ£¬ËùÒÔ£¬×îÖÕ£¬$(a)µÄÖµ¾ÍÊÇ$(variable2)µÄÖµ¡ª¡ª¡°Hello¡±¡££¨à¸£¬ºÃ²»ÈÝÒ×£©

ÔÚÕâÖÖ·½Ê½ÖУ¬»òÒª¿ÉÒÔʹÓöà¸ö±äÁ¿À´×é³ÉÒ»¸ö±äÁ¿µÄÃû×Ö£¬È»ºóÔÙÈ¡ÆäÖµ£º

    first_second = Hello
    a = first
    b = second
    all = $($a_$b)

ÕâÀïµÄ¡°$a_$b¡±×é³ÉÁË¡°first_second¡±£¬ÓÚÊÇ£¬$(all)µÄÖµ¾ÍÊÇ¡°Hello¡±¡£

ÔÙÀ´¿´¿´½áºÏµÚÒ»ÖÖ¼¼ÊõµÄÀý×Ó£º

    a_objects := a.o b.o c.o
    1_objects := 1.o 2.o 3.o

    sources := $($(a1)_objects:.o=.c)

Õâ¸öÀý×ÓÖУ¬Èç¹û$(a1)µÄÖµÊÇ¡°a¡±µÄ»°£¬ÄÇô£¬$(sources)µÄÖµ¾ÍÊÇ¡°a.c b.c c.c¡±£»Èç¹û$(a1)µÄÖµÊÇ¡°1¡±£¬ÄÇô$(sources)µÄÖµÊÇ¡°1.c 2.c 3.c¡±¡£

ÔÙÀ´¿´Ò»¸öÕâÖÖ¼¼ÊõºÍ¡°º¯Êý¡±Óë¡°Ìõ¼þÓï¾ä¡±Ò»Í¬Ê¹ÓõÄÀý×Ó£º

    ifdef do_sort
    func := sort
    else
    func := strip
    endif

    bar := a d b g q c

    foo := $($(func) $(bar))

Õâ¸öʾÀýÖУ¬Èç¹û¶¨ÒåÁË¡°do_sort¡±£¬ÄÇô£ºfoo := $(sort a d b g q c)£¬ÓÚÊÇ$(foo)µÄÖµ¾ÍÊÇ¡°a b c d g q¡±£¬¶øÈç¹ûûÓж¨Òå¡°do_sort¡±£¬ÄÇô£ºfoo := $(sort a d b g q c)£¬µ÷ÓõľÍÊÇstripº¯Êý¡£

µ±È»£¬¡°°Ñ±äÁ¿µÄÖµÔÙµ±³É±äÁ¿¡±ÕâÖÖ¼¼Êõ£¬Í¬Ñù¿ÉÒÔÓÃÔÚ²Ù×÷·ûµÄ×ó±ß£º

    dir = foo
    $(dir)_sources := $(wildcard $(dir)/*.c)
    define $(dir)_print
    lpr $($(dir)_sources)
    endef

Õâ¸öÀý×ÓÖж¨ÒåÁËÈý¸ö±äÁ¿£º¡°dir¡±£¬¡°foo_sources¡±ºÍ¡°foo_print¡±¡£


ËÄ¡¢×·¼Ó±äÁ¿Öµ

ÎÒÃÇ¿ÉÒÔʹÓá°+=¡±²Ù×÷·û¸ø±äÁ¿×·¼ÓÖµ£¬È磺

    objects = main.o foo.o bar.o utils.o
    objects += another.o

ÓÚÊÇ£¬ÎÒÃǵÄ$(objects)Öµ±ä³É£º¡°main.o foo.o bar.o utils.o another.o¡±£¨another.o±»×·¼Ó½øÈ¥ÁË£©

ʹÓá°+=¡±²Ù×÷·û£¬¿ÉÒÔÄ£ÄâΪÏÂÃæµÄÕâÖÖÀý×Ó£º

    objects = main.o foo.o bar.o utils.o
    objects := $(objects) another.o

Ëù²»Í¬µÄÊÇ£¬Óá°+=¡±¸üΪ¼ò½à¡£

Èç¹û±äÁ¿Ö®Ç°Ã»Óж¨Òå¹ý£¬ÄÇô£¬¡°+=¡±»á×Ô¶¯±ä³É¡°=¡±£¬Èç¹ûÇ°ÃæÓбäÁ¿¶¨Ò壬ÄÇô¡°+=¡±»á¼Ì³ÐÓÚǰ´Î²Ù×÷µÄ¸³Öµ·û¡£Èç¹ûǰһ´ÎµÄÊÇ¡°:=¡±£¬ÄÇô¡°+=¡±»áÒÔ¡°:=¡±×÷ΪÆä¸³Öµ·û£¬È磺

    variable := value
    variable += more

µÈ¼ÛÓÚ£º

    variable := value
    variable := $(variable) more

µ«Èç¹ûÊÇÕâÖÖÇé¿ö£º 

    variable = value
    variable += more

ÓÉÓÚǰ´ÎµÄ¸³Öµ·ûÊÇ¡°=¡±£¬ËùÒÔ¡°+=¡±Ò²»áÒÔ¡°=¡±À´×öΪ¸³Öµ£¬ÄÇôÆñ²»»á·¢Éú±äÁ¿µÄµÝ²¹¹é¶¨Ò壬ÕâÊǺܲ»ºÃµÄ£¬ËùÒÔmake»á×Ô¶¯ÎªÎÒÃǽâ¾öÕâ¸öÎÊÌ⣬ÎÒÃDz»±Øµ£ÐÄÕâ¸öÎÊÌâ¡£


Îå¡¢override ָʾ·û

Èç¹ûÓбäÁ¿ÊÇͨ³£makeµÄÃüÁîÐвÎÊýÉèÖõģ¬ÄÇôMakefileÖжÔÕâ¸ö±äÁ¿µÄ¸³Öµ»á±»ºöÂÔ¡£Èç¹ûÄãÏëÔÚMakefileÖÐÉèÖÃÕâÀà²ÎÊýµÄÖµ£¬ÄÇô£¬Äã¿ÉÒÔʹÓá°override¡±Ö¸Ê¾·û¡£ÆäÓï·¨ÊÇ£º

    override <variable>; = <value>;

    override <variable>; := <value>;

µ±È»£¬Ä㻹¿ÉÒÔ×·¼Ó£º

    override <variable>; += <more text>;

¶ÔÓÚ¶àÐеıäÁ¿¶¨Ò壬ÎÒÃÇÓÃdefineָʾ·û£¬ÔÚdefineָʾ·ûǰ£¬Ò²Í¬Ñù¿ÉÒÔʹÓÃovverideָʾ·û£¬È磺

    override define foo
    bar
    endef

 


Áù¡¢¶àÐбäÁ¿
 
»¹ÓÐÒ»ÖÖÉèÖñäÁ¿ÖµµÄ·½·¨ÊÇʹÓÃdefine¹Ø¼ü×Ö¡£Ê¹ÓÃdefine¹Ø¼ü×ÖÉèÖñäÁ¿µÄÖµ¿ÉÒÔÓл»ÐУ¬ÕâÓÐÀûÓÚ¶¨ÒåһϵÁеÄÃüÁî£¨Ç°ÃæÎÒÃǽ²¹ý¡°ÃüÁî°ü¡±µÄ¼¼Êõ¾ÍÊÇÀûÓÃÕâ¸ö¹Ø¼ü×Ö£©¡£

defineָʾ·ûºóÃæ¸úµÄÊDZäÁ¿µÄÃû×Ö£¬¶øÖØÆðÒ»Ðж¨Òå±äÁ¿µÄÖµ£¬¶¨ÒåÊÇÒÔendef¹Ø¼ü×Ö½áÊø¡£Æä¹¤×÷·½Ê½ºÍ¡°=¡±²Ù×÷·ûÒ»Ñù¡£±äÁ¿µÄÖµ¿ÉÒÔ°üº¬º¯Êý¡¢ÃüÁî¡¢ÎÄ×Ö£¬»òÊÇÆäËü±äÁ¿¡£ÒòΪÃüÁîÐèÒªÒÔ[Tab]¼ü¿ªÍ·£¬ËùÒÔÈç¹ûÄãÓÃdefine¶¨ÒåµÄÃüÁî±äÁ¿ÖÐûÓÐÒÔ[Tab]¼ü¿ªÍ·£¬ÄÇômake¾Í²»»á°ÑÆäÈÏΪÊÇÃüÁî¡£

ÏÂÃæµÄÕâ¸öʾÀýչʾÁËdefineµÄÓ÷¨£º

    define two-lines
    echo foo
    echo $(bar)
    endef


Æß¡¢»·¾³±äÁ¿

makeÔËÐÐʱµÄϵͳ»·¾³±äÁ¿¿ÉÒÔÔÚmake¿ªÊ¼ÔËÐÐʱ±»ÔØÈëµ½MakefileÎļþÖУ¬µ«ÊÇÈç¹ûMakefileÖÐÒѶ¨ÒåÁËÕâ¸ö±äÁ¿£¬»òÊÇÕâ¸ö±äÁ¿ÓÉmakeÃüÁîÐдøÈ룬ÄÇôϵͳµÄ»·¾³±äÁ¿µÄÖµ½«±»¸²¸Ç¡££¨Èç¹ûmakeÖ¸¶¨ÁË¡°-e¡±²ÎÊý£¬ÄÇô£¬ÏµÍ³»·¾³±äÁ¿½«¸²¸ÇMakefileÖж¨ÒåµÄ±äÁ¿£©

Òò´Ë£¬Èç¹ûÎÒÃÇÔÚ»·¾³±äÁ¿ÖÐÉèÖÃÁË¡°CFLAGS¡±»·¾³±äÁ¿£¬ÄÇôÎÒÃǾͿÉÒÔÔÚËùÓеÄMakefileÖÐʹÓÃÕâ¸ö±äÁ¿ÁË¡£Õâ¶ÔÓÚÎÒÃÇʹÓÃͳһµÄ±àÒë²ÎÊýÓбȽϴóµÄºÃ´¦¡£Èç¹ûMakefileÖж¨ÒåÁËCFLAGS£¬ÄÇôÔò»áʹÓÃMakefileÖеÄÕâ¸ö±äÁ¿£¬Èç¹ûûÓж¨ÒåÔòʹÓÃϵͳ»·¾³±äÁ¿µÄÖµ£¬Ò»¸ö¹²ÐԺ͸öÐÔµÄͳһ£¬ºÜÏñ¡°È«¾Ö±äÁ¿¡±ºÍ¡°¾Ö²¿±äÁ¿¡±µÄÌØÐÔ¡£

µ±makeǶÌ×µ÷ÓÃʱ£¨²Î¼ûÇ°ÃæµÄ¡°Ç¶Ì×µ÷Óá±Õ½ڣ©£¬ÉϲãMakefileÖж¨ÒåµÄ±äÁ¿»áÒÔϵͳ»·¾³±äÁ¿µÄ·½Ê½´«µÝµ½Ï²ãµÄMakefileÖС£µ±È»£¬Ä¬ÈÏÇé¿öÏ£¬Ö»ÓÐͨ¹ýÃüÁîÐÐÉèÖõıäÁ¿»á±»´«µÝ¡£¶ø¶¨ÒåÔÚÎļþÖеıäÁ¿£¬Èç¹ûÒªÏòϲãMakefile´«µÝ£¬ÔòÐèҪʹÓÃexprot¹Ø¼ü×ÖÀ´ÉùÃ÷¡££¨²Î¼ûÇ°ÃæÕ½ڣ©

µ±È»£¬ÎÒ²¢²»ÍƼö°ÑÐí¶àµÄ±äÁ¿¶¼¶¨ÒåÔÚϵͳ»·¾³ÖУ¬ÕâÑù£¬ÔÚÎÒÃÇÖ´Ðв»ÓõÄMakefileʱ£¬ÓµÓеÄÊÇͬһÌ×ϵͳ±äÁ¿£¬Õâ¿ÉÄÜ»á´øÀ´¸ü¶àµÄÂé·³¡£


°Ë¡¢Ä¿±ê±äÁ¿

Ç°ÃæÎÒÃÇËù½²µÄÔÚMakefileÖж¨ÒåµÄ±äÁ¿¶¼ÊÇ¡°È«¾Ö±äÁ¿¡±£¬ÔÚÕû¸öÎļþ£¬ÎÒÃǶ¼¿ÉÒÔ·ÃÎÊÕâЩ±äÁ¿¡£µ±È»£¬¡°×Ô¶¯»¯±äÁ¿¡±³ýÍ⣬Èç¡°$<¡±µÈÕâÖÖÀàÁ¿µÄ×Ô¶¯»¯±äÁ¿¾ÍÊôÓÚ¡°¹æÔòÐͱäÁ¿¡±£¬ÕâÖÖ±äÁ¿µÄÖµÒÀÀµÓÚ¹æÔòµÄÄ¿±êºÍÒÀÀµÄ¿±êµÄ¶¨Òå¡£

µ±È»£¬ÎÒÑùͬÑù¿ÉÒÔΪij¸öÄ¿±êÉèÖþֲ¿±äÁ¿£¬ÕâÖÖ±äÁ¿±»³ÆÎª¡°Target-specific Variable¡±£¬Ëü¿ÉÒԺ͡°È«¾Ö±äÁ¿¡±Í¬Ãû£¬ÒòΪËüµÄ×÷Ó÷¶Î§Ö»ÔÚÕâÌõ¹æÔòÒÔ¼°Á¬´ø¹æÔòÖУ¬ËùÒÔÆäÖµÒ²Ö»ÔÚ×÷Ó÷¶Î§ÄÚÓÐЧ¡£¶ø²»»áÓ°Ïì¹æÔòÁ´ÒÔÍâµÄÈ«¾Ö±äÁ¿µÄÖµ¡£

ÆäÓï·¨ÊÇ£º

    <target ...>; : <variable-assignment>;

    <target ...>; : overide <variable-assignment>;

<variable-assignment>;¿ÉÒÔÊÇÇ°Ãæ½²¹ýµÄ¸÷ÖÖ¸³Öµ±í´ïʽ£¬Èç¡°=¡±¡¢¡°:=¡±¡¢¡°+=¡±»òÊÇ¡°£¿=¡±¡£µÚ¶þ¸öÓï·¨ÊÇÕë¶ÔÓÚmakeÃüÁîÐдøÈëµÄ±äÁ¿£¬»òÊÇϵͳ»·¾³±äÁ¿¡£

Õâ¸öÌØÐԷdz£µÄÓÐÓ㬵±ÎÒÃÇÉèÖÃÁËÕâÑùÒ»¸ö±äÁ¿£¬Õâ¸ö±äÁ¿»á×÷Óõ½ÓÉÕâ¸öÄ¿±êËùÒý·¢µÄËùÓеĹæÔòÖÐÈ¥¡£È磺

    prog : CFLAGS = -g
    prog : prog.o foo.o bar.o
            $(CC) $(CFLAGS) prog.o foo.o bar.o

    prog.o : prog.c
            $(CC) $(CFLAGS) prog.c

    foo.o : foo.c
            $(CC) $(CFLAGS) foo.c

    bar.o : bar.c
            $(CC) $(CFLAGS) bar.c
 
ÔÚÕâ¸öʾÀýÖУ¬²»¹ÜÈ«¾ÖµÄ$(CFLAGS)µÄÖµÊÇʲô£¬ÔÚprogÄ¿±ê£¬ÒÔ¼°ÆäËùÒý·¢µÄËùÓйæÔòÖУ¨prog.o foo.o bar.oµÄ¹æÔò£©£¬$(CFLAGS)µÄÖµ¶¼ÊÇ¡°-g¡±


¾Å¡¢Ä£Ê½±äÁ¿

ÔÚGNUµÄmakeÖУ¬»¹Ö§³Öģʽ±äÁ¿£¨Pattern-specific Variable£©£¬Í¨¹ýÉÏÃæµÄÄ¿±ê±äÁ¿ÖУ¬ÎÒÃÇÖªµÀ£¬±äÁ¿¿ÉÒÔ¶¨ÒåÔÚij¸öÄ¿±êÉÏ¡£Ä£Ê½±äÁ¿µÄºÃ´¦¾ÍÊÇ£¬ÎÒÃÇ¿ÉÒÔ¸ø¶¨Ò»ÖÖ¡°Ä£Ê½¡±£¬¿ÉÒ԰ѱäÁ¿¶¨ÒåÔÚ·ûºÏÕâÖÖģʽµÄËùÓÐÄ¿±êÉÏ¡£

ÎÒÃÇÖªµÀ£¬makeµÄ¡°Ä£Ê½¡±Ò»°ãÊÇÖÁÉÙº¬ÓÐÒ»¸ö¡°%¡±µÄ£¬ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔÒÔÈçÏ·½Ê½¸øËùÓÐÒÔ[.o]½áβµÄÄ¿±ê¶¨ÒåÄ¿±ê±äÁ¿£º

    %.o : CFLAGS = -O

ͬÑù£¬Ä£Ê½±äÁ¿µÄÓï·¨ºÍ¡°Ä¿±ê±äÁ¿¡±Ò»Ñù£º

    <pattern ...>; : <variable-assignment>;

    <pattern ...>; : override <variable-assignment>;

overrideͬÑùÊÇÕë¶ÔÓÚϵͳ»·¾³´«ÈëµÄ±äÁ¿£¬»òÊÇmakeÃüÁîÐÐÖ¸¶¨µÄ±äÁ¿¡£
 


ʹÓÃÌõ¼þÅжÏ


ʹÓÃÌõ¼þÅжϣ¬¿ÉÒÔÈÃmake¸ù¾ÝÔËÐÐʱµÄ²»Í¬Çé¿öÑ¡Ôñ²»Í¬µÄÖ´ÐзÖÖ§¡£Ìõ¼þ±í´ïʽ¿ÉÒÔÊDZȽϱäÁ¿µÄÖµ£¬»òÊDZȽϱäÁ¿ºÍ³£Á¿µÄÖµ¡£

Ò»¡¢Ê¾Àý

ÏÂÃæµÄÀý×Ó£¬ÅжÏ$(CC)±äÁ¿ÊÇ·ñ¡°gcc¡±£¬Èç¹ûÊǵϰ£¬ÔòʹÓÃGNUº¯Êý±àÒëÄ¿±ê¡£

    libs_for_gcc = -lgnu
    normal_libs =

    foo: $(objects)
    ifeq ($(CC),gcc)
            $(CC) -o foo $(objects) $(libs_for_gcc)
    else
            $(CC) -o foo $(objects) $(normal_libs)
    endif

¿É¼û£¬ÔÚÉÏÃæÊ¾ÀýµÄÕâ¸ö¹æÔòÖУ¬Ä¿±ê¡°foo¡±¿ÉÒÔ¸ù¾Ý±äÁ¿¡°$(CC)¡±ÖµÀ´Ñ¡È¡²»Í¬µÄº¯Êý¿âÀ´±àÒë³ÌÐò¡£

ÎÒÃÇ¿ÉÒÔ´ÓÉÏÃæµÄʾÀýÖп´µ½Èý¸ö¹Ø¼ü×Ö£ºifeq¡¢elseºÍendif¡£ifeqµÄÒâ˼±íʾÌõ¼þÓï¾äµÄ¿ªÊ¼£¬²¢Ö¸¶¨Ò»¸öÌõ¼þ±í´ïʽ£¬±í´ïʽ°üº¬Á½¸ö²ÎÊý£¬ÒÔ¶ººÅ·Ö¸ô£¬±í´ïʽÒÔÔ²À¨ºÅÀ¨Æð¡£else±íʾÌõ¼þ±í´ïʽΪ¼ÙµÄÇé¿ö¡£endif±íʾһ¸öÌõ¼þÓï¾äµÄ½áÊø£¬ÈκÎÒ»¸öÌõ¼þ±í´ïʽ¶¼Ó¦¸ÃÒÔendif½áÊø¡£

µ±ÎÒÃǵıäÁ¿$(CC)ÖµÊÇ¡°gcc¡±Ê±£¬Ä¿±êfooµÄ¹æÔòÊÇ£º

    foo: $(objects)
            $(CC) -o foo $(objects) $(libs_for_gcc)

¶øµ±ÎÒÃǵıäÁ¿$(CC)Öµ²»ÊÇ¡°gcc¡±Ê±£¨±ÈÈç¡°cc¡±£©£¬Ä¿±êfooµÄ¹æÔòÊÇ£º

    foo: $(objects)
            $(CC) -o foo $(objects) $(normal_libs)

µ±È»£¬ÎÒÃÇ»¹¿ÉÒÔ°ÑÉÏÃæµÄÄǸöÀý×ÓдµÃ¸ü¼ò½àһЩ£º

    libs_for_gcc = -lgnu
    normal_libs =

    ifeq ($(CC),gcc)
      libs=$(libs_for_gcc)
    else
      libs=$(normal_libs)
    endif

    foo: $(objects)
            $(CC) -o foo $(objects) $(libs)


¶þ¡¢Óï·¨

Ìõ¼þ±í´ïʽµÄÓ﷨Ϊ£º

    <conditional-directive>;
    <text-if-true>;
    endif

ÒÔ¼°£º

    <conditional-directive>;
    <text-if-true>;
    else
    <text-if-false>;
    endif

ÆäÖÐ<conditional-directive>;±íʾÌõ¼þ¹Ø¼ü×Ö£¬Èç¡°ifeq¡±¡£Õâ¸ö¹Ø¼ü×ÖÓÐËĸö¡£

µÚÒ»¸öÊÇÎÒÃÇÇ°ÃæËù¼û¹ýµÄ¡°ifeq¡±

    ifeq (<arg1>;, <arg2>;) 
    ifeq '<arg1>;' '<arg2>;' 
    ifeq "<arg1>;" "<arg2>;" 
    ifeq "<arg1>;" '<arg2>;' 
    ifeq '<arg1>;' "<arg2>;" 

±È½Ï²ÎÊý¡°arg1¡±ºÍ¡°arg2¡±µÄÖµÊÇ·ñÏàͬ¡£µ±È»£¬²ÎÊýÖÐÎÒÃÇ»¹¿ÉÒÔʹÓÃmakeµÄº¯Êý¡£È磺

    ifeq ($(strip $(foo)),)
    <text-if-empty>;
    endif

Õâ¸öʾÀýÖÐʹÓÃÁË¡°strip¡±º¯Êý£¬Èç¹ûÕâ¸öº¯ÊýµÄ·µ»ØÖµÊǿգ¨Empty£©£¬ÄÇô<text-if-empty>;¾ÍÉúЧ¡£

µÚ¶þ¸öÌõ¼þ¹Ø¼ü×ÖÊÇ¡°ifneq¡±¡£Óï·¨ÊÇ£º

    ifneq (<arg1>;, <arg2>;) 
    ifneq '<arg1>;' '<arg2>;' 
    ifneq "<arg1>;" "<arg2>;" 
    ifneq "<arg1>;" '<arg2>;' 
    ifneq '<arg1>;' "<arg2>;" 

Æä±È½Ï²ÎÊý¡°arg1¡±ºÍ¡°arg2¡±µÄÖµÊÇ·ñÏàͬ£¬Èç¹û²»Í¬£¬ÔòÎªÕæ¡£ºÍ¡°ifeq¡±ÀàËÆ¡£

µÚÈý¸öÌõ¼þ¹Ø¼ü×ÖÊÇ¡°ifdef¡±¡£Óï·¨ÊÇ£º

    ifdef <variable-name>; 

Èç¹û±äÁ¿<variable-name>;µÄÖµ·Ç¿Õ£¬Äǵ½±í´ïÊ½ÎªÕæ¡£·ñÔò£¬±í´ïʽΪ¼Ù¡£µ±È»£¬<variable-name>;ͬÑù¿ÉÒÔÊÇÒ»¸öº¯ÊýµÄ·µ»ØÖµ¡£×¢Ò⣬ifdefÖ»ÊDzâÊÔÒ»¸ö±äÁ¿ÊÇ·ñÓÐÖµ£¬Æä²¢²»»á°Ñ±äÁ¿À©Õ¹µ½µ±Ç°Î»Ö᣻¹ÊÇÀ´¿´Á½¸öÀý×Ó£º

    ʾÀýÒ»£º
    bar =
    foo = $(bar)
    ifdef foo
    frobozz = yes
    else
    frobozz = no
    endif

    ʾÀý¶þ£º
    foo =
    ifdef foo
    frobozz = yes
    else
    frobozz = no
    endif

µÚÒ»¸öÀý×ÓÖУ¬¡°$(frobozz)¡±ÖµÊÇ¡°yes¡±£¬µÚ¶þ¸öÔòÊÇ¡°no¡±¡£

µÚËĸöÌõ¼þ¹Ø¼ü×ÖÊÇ¡°ifndef¡±¡£ÆäÓï·¨ÊÇ£º

    ifndef <variable-name>;

Õâ¸öÎҾͲ»¶à˵ÁË£¬ºÍ¡°ifdef¡±ÊÇÏà·´µÄÒâ˼¡£

ÔÚ<conditional-directive>;ÕâÒ»ÐÐÉÏ£¬¶àÓàµÄ¿Õ¸ñÊDZ»ÔÊÐíµÄ£¬µ«ÊDz»ÄÜÒÔ[Tab]¼ü×öΪ¿ªÊ¼£¨²»È»¾Í±»ÈÏΪÊÇÃüÁ¡£¶ø×¢ÊÍ·û¡°#¡±Í¬ÑùÒ²Êǰ²È«µÄ¡£¡°else¡±ºÍ¡°endif¡±Ò²Ò»Ñù£¬Ö»Òª²»ÊÇÒÔ[Tab]¼ü¿ªÊ¼¾ÍÐÐÁË¡£

ÌØ±ð×¢ÒâµÄÊÇ£¬makeÊÇÔÚ¶ÁÈ¡Makefileʱ¾Í¼ÆËãÌõ¼þ±í´ïʽµÄÖµ£¬²¢¸ù¾ÝÌõ¼þ±í´ïʽµÄÖµÀ´Ñ¡ÔñÓï¾ä£¬ËùÒÔ£¬Äã×îºÃ²»Òª°Ñ×Ô¶¯»¯±äÁ¿£¨Èç¡°$@¡±µÈ£©·ÅÈëÌõ¼þ±í´ïʽÖУ¬ÒòΪ×Ô¶¯»¯±äÁ¿ÊÇÔÚÔËÐÐʱ²ÅÓеġ£

¶øÇÒ£¬ÎªÁ˱ÜÃâ»ìÂÒ£¬make²»ÔÊÐí°ÑÕû¸öÌõ¼þÓï¾ä·Ö³ÉÁ½²¿·Ö·ÅÔÚ²»Í¬µÄÎļþÖС£

ʹÓú¯Êý


ÔÚMakefileÖпÉÒÔʹÓú¯ÊýÀ´´¦Àí±äÁ¿£¬´Ó¶øÈÃÎÒÃǵÄÃüÁî»òÊǹæÔò¸üΪµÄÁé»îºÍ¾ßÓÐÖÇÄÜ¡£makeËùÖ§³ÖµÄº¯ÊýÒ²²»ËãºÜ¶à£¬²»¹ýÒѾ­×ã¹»ÎÒÃǵIJÙ×÷ÁË¡£º¯Êýµ÷Óú󣬺¯ÊýµÄ·µ»ØÖµ¿ÉÒÔµ±×ö±äÁ¿À´Ê¹Óá£


Ò»¡¢º¯ÊýµÄµ÷ÓÃÓï·¨

º¯Êýµ÷Ó㬺ÜÏñ±äÁ¿µÄʹÓã¬Ò²ÊÇÒÔ¡°$¡±À´±êʶµÄ£¬ÆäÓï·¨ÈçÏ£º

    $(<function>; <arguments>;)

»òÊÇ

    ${<function>; <arguments>;}

ÕâÀ<function>;¾ÍÊǺ¯ÊýÃû£¬makeÖ§³ÖµÄº¯Êý²»¶à¡£<arguments>;ÊǺ¯ÊýµÄ²ÎÊý£¬²ÎÊý¼äÒÔ¶ººÅ¡°,¡±·Ö¸ô£¬¶øº¯ÊýÃûºÍ²ÎÊýÖ®¼äÒÔ¡°¿Õ¸ñ¡±·Ö¸ô¡£º¯Êýµ÷ÓÃÒÔ¡°$¡±¿ªÍ·£¬ÒÔÔ²À¨ºÅ»ò»¨À¨ºÅ°Ñº¯ÊýÃûºÍ²ÎÊýÀ¨Æð¡£¸Ð¾õºÜÏñÒ»¸ö±äÁ¿£¬ÊDz»ÊÇ£¿º¯ÊýÖеIJÎÊý¿ÉÒÔʹÓñäÁ¿£¬ÎªÁË·ç¸ñµÄͳһ£¬º¯ÊýºÍ±äÁ¿µÄÀ¨ºÅ×îºÃÒ»Ñù£¬ÈçʹÓá°$(subst a,b,$(x))¡±ÕâÑùµÄÐÎʽ£¬¶ø²»ÊÇ¡°$(subst a,b,${x})¡±µÄÐÎʽ¡£ÒòΪͳһ»á¸üÇå³þ£¬Ò²»á¼õÉÙһЩ²»±ØÒªµÄÂé·³¡£

»¹ÊÇÀ´¿´Ò»¸öʾÀý£º

    comma:= ,
    empty:=
    space:= $(empty) $(empty)
    foo:= a b c
    bar:= $(subst $(space),$(comma),$(foo))

ÔÚÕâ¸öʾÀýÖУ¬$(comma)µÄÖµÊÇÒ»¸ö¶ººÅ¡£$(space)ʹÓÃÁË$(empty)¶¨ÒåÁËÒ»¸ö¿Õ¸ñ£¬$(foo)µÄÖµÊÇ¡°a b c¡±£¬$(bar)µÄ¶¨ÒåÓ㬵÷ÓÃÁ˺¯Êý¡°subst¡±£¬ÕâÊÇÒ»¸öÌæ»»º¯Êý£¬Õâ¸öº¯ÊýÓÐÈý¸ö²ÎÊý£¬µÚÒ»¸ö²ÎÊýÊDZ»Ìæ»»×Ö´®£¬µÚ¶þ¸ö²ÎÊýÊÇÌæ»»×Ö´®£¬µÚÈý¸ö²ÎÊýÊÇÌæ»»²Ù×÷×÷ÓõÄ×Ö´®¡£Õâ¸öº¯ÊýÒ²¾ÍÊǰÑ$(foo)ÖеĿոñÌæ»»³É¶ººÅ£¬ËùÒÔ$(bar)µÄÖµÊÇ¡°a,b,c¡±¡£


¶þ¡¢×Ö·û´®´¦Àíº¯Êý

$(subst <from>;,<to>;,<text>;) 

    Ãû³Æ£º×Ö·û´®Ìæ»»º¯Êý¡ª¡ªsubst¡£
    ¹¦ÄÜ£º°Ñ×Ö´®<text>;ÖеÄ<from>;×Ö·û´®Ìæ»»³É<to>;¡£
    ·µ»Ø£ºº¯Êý·µ»Ø±»Ìæ»»¹ýºóµÄ×Ö·û´®¡£

    ʾÀý£º
        
        $(subst ee,EE,feet on the street)£¬
        
        °Ñ¡°feet on the street¡±Öеġ°ee¡±Ìæ»»³É¡°EE¡±£¬·µ»Ø½á¹ûÊÇ¡°fEEt on the strEEt¡±¡£


$(patsubst <pattern>;,<replacement>;,<text>;) 

    Ãû³Æ£ºÄ£Ê½×Ö·û´®Ìæ»»º¯Êý¡ª¡ªpatsubst¡£
    ¹¦ÄÜ£º²éÕÒ<text>;Öеĵ¥´Ê£¨µ¥´ÊÒÔ¡°¿Õ¸ñ¡±¡¢¡°Tab¡±»ò¡°»Ø³µ¡±¡°»»ÐС±·Ö¸ô£©ÊÇ·ñ·ûºÏģʽ<pattern>;£¬Èç¹ûÆ¥ÅäµÄ»°£¬ÔòÒÔ<replacement>;Ìæ»»¡£ÕâÀ<pattern>;¿ÉÒÔ°üÀ¨Í¨Åä·û¡°%¡±£¬±íʾÈÎÒⳤ¶ÈµÄ×Ö´®¡£Èç¹û<replacement>;ÖÐÒ²°üº¬¡°%¡±£¬ÄÇô£¬<replacement>;ÖеÄÕâ¸ö¡°%¡±½«ÊÇ<pattern>;ÖеÄÄǸö¡°%¡±Ëù´ú±íµÄ×Ö´®¡££¨¿ÉÒÔÓá°\¡±À´×ªÒ壬ÒÔ¡°\%¡±À´±íÊ¾ÕæÊµº¬ÒåµÄ¡°%¡±×Ö·û£©
    ·µ»Ø£ºº¯Êý·µ»Ø±»Ìæ»»¹ýºóµÄ×Ö·û´®¡£

    ʾÀý£º

        $(patsubst %.c,%.o,x.c.c bar.c)

        °Ñ×Ö´®¡°x.c.c bar.c¡±·ûºÏģʽ[%.c]µÄµ¥´ÊÌæ»»³É[%.o]£¬·µ»Ø½á¹ûÊÇ¡°x.c.o bar.o¡±

    ±¸×¢£º

        ÕâºÍÎÒÃÇÇ°Ãæ¡°±äÁ¿Õ½ڡ±Ëµ¹ýµÄÏà¹ØÖªÊ¶ÓеãÏàËÆ¡£È磺

        ¡°$(var:<pattern>;=<replacement>;)¡±
         Ï൱ÓÚ
        ¡°$(patsubst <pattern>;,<replacement>;,$(var))¡±£¬

         ¶ø¡°$(var: <suffix>;=<replacement>;)¡±
         ÔòÏ൱ÓÚ
         ¡°$(patsubst %<suffix>;,%<replacement>;,$(var))¡±¡£

         ÀýÈçÓУºobjects = foo.o bar.o baz.o£¬
         ÄÇô£¬¡°$(objects:.o=.c)¡±ºÍ¡°$(patsubst %.o,%.c,$(objects))¡±ÊÇÒ»ÑùµÄ¡£

$(strip <string>;)

    Ãû³Æ£ºÈ¥¿Õ¸ñº¯Êý¡ª¡ªstrip¡£
    ¹¦ÄÜ£ºÈ¥µô<string>;×Ö´®ÖпªÍ·ºÍ½áβµÄ¿Õ×Ö·û¡£
    ·µ»Ø£º·µ»Ø±»È¥µô¿Õ¸ñµÄ×Ö·û´®Öµ¡£
    ʾÀý£º
        
        $(strip a b c )

        °Ñ×Ö´®¡°a b c ¡±È¥µ½¿ªÍ·ºÍ½áβµÄ¿Õ¸ñ£¬½á¹ûÊÇ¡°a b c¡±¡£

$(findstring <find>;,<in>;)

    Ãû³Æ£º²éÕÒ×Ö·û´®º¯Êý¡ª¡ªfindstring¡£
    ¹¦ÄÜ£ºÔÚ×Ö´®<in>;ÖвéÕÒ<find>;×Ö´®¡£
    ·µ»Ø£ºÈç¹ûÕÒµ½£¬ÄÇô·µ»Ø<find>;£¬·ñÔò·µ»Ø¿Õ×Ö·û´®¡£
    ʾÀý£º

        $(findstring a,a b c)
        $(findstring a,b c)

        µÚÒ»¸öº¯Êý·µ»Ø¡°a¡±×Ö·û´®£¬µÚ¶þ¸ö·µ»Ø¡°¡±×Ö·û´®£¨¿Õ×Ö·û´®£©

$(filter <pattern...>;,<text>;)

    Ãû³Æ£º¹ýÂ˺¯Êý¡ª¡ªfilter¡£
    ¹¦ÄÜ£ºÒÔ<pattern>;ģʽ¹ýÂË<text>;×Ö·û´®Öеĵ¥´Ê£¬±£Áô·ûºÏģʽ<pattern>;µÄµ¥´Ê¡£¿ÉÒÔÓжà¸öģʽ¡£
    ·µ»Ø£º·µ»Ø·ûºÏģʽ<pattern>;µÄ×Ö´®¡£
    ʾÀý£º

        sources := foo.c bar.c baz.s ugh.h
        foo: $(sources)
                cc $(filter %.c %.s,$(sources)) -o foo

        $(filter %.c %.s,$(sources))·µ»ØµÄÖµÊÇ¡°foo.c bar.c baz.s¡±¡£

$(filter-out <pattern...>;,<text>;)

    Ãû³Æ£º·´¹ýÂ˺¯Êý¡ª¡ªfilter-out¡£
    ¹¦ÄÜ£ºÒÔ<pattern>;ģʽ¹ýÂË<text>;×Ö·û´®Öеĵ¥´Ê£¬È¥³ý·ûºÏģʽ<pattern>;µÄµ¥´Ê¡£¿ÉÒÔÓжà¸öģʽ¡£
    ·µ»Ø£º·µ»Ø²»·ûºÏģʽ<pattern>;µÄ×Ö´®¡£
    ʾÀý£º

        objects=main1.o foo.o main2.o bar.o
        mains=main1.o main2.o
        
        $(filter-out $(mains),$(objects)) ·µ»ØÖµÊÇ¡°foo.o bar.o¡±¡£
        
$(sort <list>;)

    Ãû³Æ£ºÅÅÐòº¯Êý¡ª¡ªsort¡£
    ¹¦ÄÜ£º¸ø×Ö·û´®<list>;Öеĵ¥´ÊÅÅÐò£¨ÉýÐò£©¡£
    ·µ»Ø£º·µ»ØÅÅÐòºóµÄ×Ö·û´®¡£
    ʾÀý£º$(sort foo bar lose)·µ»Ø¡°bar foo lose¡± ¡£
    ±¸×¢£ºsortº¯Êý»áÈ¥µô<list>;ÖÐÏàͬµÄµ¥´Ê¡£

$(word <n>;,<text>;)

    Ãû³Æ£ºÈ¡µ¥´Êº¯Êý¡ª¡ªword¡£
    ¹¦ÄÜ£ºÈ¡×Ö·û´®<text>;ÖеÚ<n>;¸öµ¥´Ê¡££¨´ÓÒ»¿ªÊ¼£©
    ·µ»Ø£º·µ»Ø×Ö·û´®<text>;ÖеÚ<n>;¸öµ¥´Ê¡£Èç¹û<n>;±È<text>;Öеĵ¥´ÊÊýÒª´ó£¬ÄÇô·µ»Ø¿Õ×Ö·û´®¡£
    ʾÀý£º$(word 2, foo bar baz)·µ»ØÖµÊÇ¡°bar¡±¡£

$(wordlist <s>;,<e>;,<text>;)  

    Ãû³Æ£ºÈ¡µ¥´Ê´®º¯Êý¡ª¡ªwordlist¡£
    ¹¦ÄÜ£º´Ó×Ö·û´®<text>;ÖÐÈ¡´Ó<s>;¿ªÊ¼µ½<e>;µÄµ¥´Ê´®¡£<s>;ºÍ<e>;ÊÇÒ»¸öÊý×Ö¡£
    ·µ»Ø£º·µ»Ø×Ö·û´®<text>;ÖдÓ<s>;µ½<e>;µÄµ¥´Ê×Ö´®¡£Èç¹û<s>;±È<text>;Öеĵ¥´ÊÊýÒª´ó£¬ÄÇô·µ»Ø¿Õ×Ö·û´®¡£Èç¹û<e>;´óÓÚ<text>;µÄµ¥´ÊÊý£¬ÄÇô·µ»Ø´Ó<s>;¿ªÊ¼£¬µ½<text>;½áÊøµÄµ¥´Ê´®¡£
    ʾÀý£º $(wordlist 2, 3, foo bar baz)·µ»ØÖµÊÇ¡°bar baz¡±¡£

$(words <text>;)

    Ãû³Æ£ºµ¥´Ê¸öÊýͳ¼Æº¯Êý¡ª¡ªwords¡£
    ¹¦ÄÜ£ºÍ³¼Æ<text>;ÖÐ×Ö·û´®Öеĵ¥´Ê¸öÊý¡£
    ·µ»Ø£º·µ»Ø<text>;Öеĵ¥´ÊÊý¡£
    ʾÀý£º$(words, foo bar baz)·µ»ØÖµÊÇ¡°3¡±¡£
    ±¸×¢£ºÈç¹ûÎÒÃÇҪȡ<text>;ÖÐ×îºóµÄÒ»¸öµ¥´Ê£¬ÎÒÃÇ¿ÉÒÔÕâÑù£º$(word $(words <text>;),<text>;)¡£

$(firstword <text>;)

    Ãû³Æ£ºÊ×µ¥´Êº¯Êý¡ª¡ªfirstword¡£
    ¹¦ÄÜ£ºÈ¡×Ö·û´®<text>;ÖеĵÚÒ»¸öµ¥´Ê¡£
    ·µ»Ø£º·µ»Ø×Ö·û´®<text>;µÄµÚÒ»¸öµ¥´Ê¡£
    ʾÀý£º$(firstword foo bar)·µ»ØÖµÊÇ¡°foo¡±¡£
    ±¸×¢£ºÕâ¸öº¯Êý¿ÉÒÔÓÃwordº¯ÊýÀ´ÊµÏÖ£º$(word 1,<text>;)¡£

ÒÔÉÏ£¬ÊÇËùÓеÄ×Ö·û´®²Ù×÷º¯Êý£¬Èç¹û´îÅä»ìºÏʹÓ㬿ÉÒÔÍê³É±È½Ï¸´ÔӵŦÄÜ¡£ÕâÀ¾ÙÒ»¸öÏÖʵÖÐÓ¦ÓõÄÀý×Ó¡£ÎÒÃÇÖªµÀ£¬makeʹÓá°VPATH¡±±äÁ¿À´Ö¸¶¨¡°ÒÀÀµÎļþ¡±µÄËÑË÷·¾¶¡£ÓÚÊÇ£¬ÎÒÃÇ¿ÉÒÔÀûÓÃÕâ¸öËÑË÷·¾¶À´Ö¸¶¨±àÒëÆ÷¶ÔÍ·ÎļþµÄËÑË÷·¾¶²ÎÊýCFLAGS£¬È磺

    override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

    Èç¹ûÎÒÃǵġ°$(VPATH)¡±ÖµÊÇ¡°src:../headers¡±£¬ÄÇô¡°$(patsubst %,-I%,$(subst :, ,$(VPATH)))¡±½«·µ»Ø¡°-Isrc -I../headers¡±£¬ÕâÕýÊÇcc»ògccËÑË÷Í·Îļþ·¾¶µÄ²ÎÊý¡£


Èý¡¢ÎļþÃû²Ù×÷º¯Êý

ÏÂÃæÎÒÃÇÒª½éÉܵĺ¯ÊýÖ÷ÒªÊÇ´¦ÀíÎļþÃûµÄ¡£Ã¿¸öº¯ÊýµÄ²ÎÊý×Ö·û´®¶¼»á±»µ±×öÒ»¸ö»òÊÇһϵÁеÄÎļþÃûÀ´¶Ô´ý¡£

$(dir <names...>;) 

    Ãû³Æ£ºÈ¡Ä¿Â¼º¯Êý¡ª¡ªdir¡£
    ¹¦ÄÜ£º´ÓÎļþÃûÐòÁÐ<names>;ÖÐÈ¡³öĿ¼²¿·Ö¡£Ä¿Â¼²¿·ÖÊÇÖ¸×îºóÒ»¸ö·´Ð±¸Ü£¨¡°/¡±£©Ö®Ç°µÄ²¿·Ö¡£Èç¹ûûÓз´Ð±¸Ü£¬ÄÇô·µ»Ø¡°./¡±¡£
    ·µ»Ø£º·µ»ØÎļþÃûÐòÁÐ<names>;µÄĿ¼²¿·Ö¡£
    ʾÀý£º $(dir src/foo.c hacks)·µ»ØÖµÊÇ¡°src/ ./¡±¡£

$(notdir <names...>;) 

    Ãû³Æ£ºÈ¡Îļþº¯Êý¡ª¡ªnotdir¡£
    ¹¦ÄÜ£º´ÓÎļþÃûÐòÁÐ<names>;ÖÐÈ¡³ö·ÇĿ¼²¿·Ö¡£·ÇĿ¼²¿·ÖÊÇÖ¸×îºóÒ»¸ö·´Ð±¸Ü£¨¡°/¡±£©Ö®ºóµÄ²¿·Ö¡£
    ·µ»Ø£º·µ»ØÎļþÃûÐòÁÐ<names>;µÄ·ÇĿ¼²¿·Ö¡£
    ʾÀý£º $(notdir src/foo.c hacks)·µ»ØÖµÊÇ¡°foo.c hacks¡±¡£
 
$(suffix <names...>;) 
    
    Ãû³Æ£ºÈ¡ºó׺º¯Êý¡ª¡ªsuffix¡£
    ¹¦ÄÜ£º´ÓÎļþÃûÐòÁÐ<names>;ÖÐÈ¡³ö¸÷¸öÎļþÃûµÄºó׺¡£
    ·µ»Ø£º·µ»ØÎļþÃûÐòÁÐ<names>;µÄºó׺ÐòÁУ¬Èç¹ûÎļþûÓкó׺£¬Ôò·µ»Ø¿Õ×Ö´®¡£
    ʾÀý£º$(suffix src/foo.c src-1.0/bar.c hacks)·µ»ØÖµÊÇ¡°.c .c¡±¡£

$(basename <names...>;)

    Ãû³Æ£ºÈ¡Ç°×ºº¯Êý¡ª¡ªbasename¡£
    ¹¦ÄÜ£º´ÓÎļþÃûÐòÁÐ<names>;ÖÐÈ¡³ö¸÷¸öÎļþÃûµÄǰ׺²¿·Ö¡£
    ·µ»Ø£º·µ»ØÎļþÃûÐòÁÐ<names>;µÄǰ׺ÐòÁУ¬Èç¹ûÎļþûÓÐǰ׺£¬Ôò·µ»Ø¿Õ×Ö´®¡£
    ʾÀý£º$(basename src/foo.c src-1.0/bar.c hacks)·µ»ØÖµÊÇ¡°src/foo src-1.0/bar hacks¡±¡£

$(addsuffix <suffix>;,<names...>;) 

    Ãû³Æ£º¼Óºó׺º¯Êý¡ª¡ªaddsuffix¡£
    ¹¦ÄÜ£º°Ñºó׺<suffix>;¼Óµ½<names>;ÖеÄÿ¸öµ¥´ÊºóÃæ¡£
    ·µ»Ø£º·µ»Ø¼Ó¹ýºó׺µÄÎļþÃûÐòÁС£
    ʾÀý£º$(addsuffix .c,foo bar)·µ»ØÖµÊÇ¡°foo.c bar.c¡±¡£

$(addprefix <prefix>;,<names...>;) 

    Ãû³Æ£º¼Óǰ׺º¯Êý¡ª¡ªaddprefix¡£
    ¹¦ÄÜ£º°Ñǰ׺<prefix>;¼Óµ½<names>;ÖеÄÿ¸öµ¥´ÊºóÃæ¡£
    ·µ»Ø£º·µ»Ø¼Ó¹ýǰ׺µÄÎļþÃûÐòÁС£
    ʾÀý£º$(addprefix src/,foo bar)·µ»ØÖµÊÇ¡°src/foo src/bar¡±¡£

$(join <list1>;,<list2>;)

    Ãû³Æ£ºÁ¬½Óº¯Êý¡ª¡ªjoin¡£
    ¹¦ÄÜ£º°Ñ<list2>;Öеĵ¥´Ê¶ÔÓ¦µØ¼Óµ½<list1>;µÄµ¥´ÊºóÃæ¡£Èç¹û<list1>;µÄµ¥´Ê¸öÊýÒª±È<list2>;µÄ¶à£¬ÄÇô£¬<list1>;ÖеĶà³öÀ´µÄµ¥´Ê½«±£³ÖÔ­Ñù¡£Èç¹û<list2>;µÄµ¥´Ê¸öÊýÒª±È<list1>;¶à£¬ÄÇô£¬<list2>;¶à³öÀ´µÄµ¥´Ê½«±»¸´ÖƵ½<list2>;ÖС£
    ·µ»Ø£º·µ»ØÁ¬½Ó¹ýºóµÄ×Ö·û´®¡£
    ʾÀý£º$(join aaa bbb , 111 222 333)·µ»ØÖµÊÇ¡°aaa111 bbb222 333¡±¡£

 

ËÄ¡¢foreach º¯Êý
 

foreachº¯ÊýºÍ±ðµÄº¯Êý·Ç³£µÄ²»Ò»Ñù¡£ÒòΪÕâ¸öº¯ÊýÊÇÓÃÀ´×öÑ­»·Óõģ¬MakefileÖеÄforeachº¯Êý¼¸ºõÊÇ·ÂÕÕÓÚunix±ê×¼Shell£¨/bin/sh£©ÖеÄforÓï¾ä£¬»òÊÇC-Shell£¨/bin/csh£©ÖеÄforeachÓï¾ä¶ø¹¹½¨µÄ¡£ËüµÄÓï·¨ÊÇ£º

 

    $(foreach <var>;,<list>;,<text>;)

 

Õâ¸öº¯ÊýµÄÒâ˼ÊÇ£¬°Ñ²ÎÊý<list>;Öеĵ¥´ÊÖðһȡ³ö·Åµ½²ÎÊý<var>;ËùÖ¸¶¨µÄ±äÁ¿ÖУ¬È»ºóÔÙÖ´ÐÐ<text>;Ëù°üº¬µÄ±í´ïʽ¡£Ã¿Ò»´Î<text>;»á·µ»ØÒ»¸ö×Ö·û´®£¬Ñ­»·¹ý³ÌÖУ¬<text>;µÄËù·µ»ØµÄÿ¸ö×Ö·û´®»áÒÔ¿Õ¸ñ·Ö¸ô£¬×îºóµ±Õû¸öÑ­»·½áÊøÊ±£¬<text>;Ëù·µ»ØµÄÿ¸ö×Ö·û´®Ëù×é³ÉµÄÕû¸ö×Ö·û´®£¨ÒÔ¿Õ¸ñ·Ö¸ô£©½«»áÊÇforeachº¯ÊýµÄ·µ»ØÖµ¡£

 

ËùÒÔ£¬<var>;×îºÃÊÇÒ»¸ö±äÁ¿Ãû£¬<list>;¿ÉÒÔÊÇÒ»¸ö±í´ïʽ£¬¶ø<text>;ÖÐÒ»°ã»áʹÓÃ<var>;Õâ¸ö²ÎÊýÀ´ÒÀ´Îö¾Ù<list>;Öеĵ¥´Ê¡£¾Ù¸öÀý×Ó£º

 

    names := a b c d

    files := $(foreach n,$(names),$(n).o)

 

ÉÏÃæµÄÀý×ÓÖУ¬$(name)Öеĵ¥´Ê»á±»°¤¸öÈ¡³ö£¬²¢´æµ½±äÁ¿¡°n¡±ÖУ¬¡°$(n).o¡±Ã¿´Î¸ù¾Ý¡°$(n)¡±¼ÆËã³öÒ»¸öÖµ£¬ÕâЩֵÒÔ¿Õ¸ñ·Ö¸ô£¬×îºó×÷Ϊforeachº¯ÊýµÄ·µ»Ø£¬ËùÒÔ£¬$(files)µÄÖµÊÇ¡°a.o b.o c.o d.o¡±¡£

 

×¢Ò⣬foreachÖеÄ<var>;²ÎÊýÊÇÒ»¸öÁÙʱµÄ¾Ö²¿±äÁ¿£¬foreachº¯ÊýÖ´ÐÐÍêºó£¬²ÎÊý<var>;µÄ±äÁ¿½«²»ÔÚ×÷Óã¬Æä×÷ÓÃÓòÖ»ÔÚforeachº¯Êýµ±ÖС£

 

 

Îå¡¢if º¯Êý
 

ifº¯ÊýºÜÏñGNUµÄmakeËùÖ§³ÖµÄÌõ¼þÓï¾ä¡ª¡ªifeq£¨²Î¼ûÇ°ÃæËùÊöµÄÕ½ڣ©£¬ifº¯ÊýµÄÓï·¨ÊÇ£º

 

    $(if <condition>;,<then-part>;) 

 

»òÊÇ

 

    $(if <condition>;,<then-part>;,<else-part>;)

 

¿É¼û£¬ifº¯Êý¿ÉÒÔ°üº¬¡°else¡±²¿·Ö£¬»òÊDz»º¬¡£¼´ifº¯ÊýµÄ²ÎÊý¿ÉÒÔÊÇÁ½¸ö£¬Ò²¿ÉÒÔÊÇÈý¸ö¡£<condition>;²ÎÊýÊÇifµÄ±í´ïʽ£¬Èç¹ûÆä·µ»ØµÄΪ·Ç¿Õ×Ö·û´®£¬ÄÇôÕâ¸ö±í´ïʽ¾ÍÏ൱ÓÚ·µ»ØÕ棬ÓÚÊÇ£¬<then-part>;»á±»¼ÆË㣬·ñÔò<else-part>;»á±»¼ÆËã¡£

 

¶øifº¯ÊýµÄ·µ»ØÖµÊÇ£¬Èç¹û<condition>;ÎªÕæ£¨·Ç¿Õ×Ö·û´®£©£¬ÄǸö<then-part>;»áÊÇÕû¸öº¯ÊýµÄ·µ»ØÖµ£¬Èç¹û<condition>;Ϊ¼Ù£¨¿Õ×Ö·û´®£©£¬ÄÇô<else-part>;»áÊÇÕû¸öº¯ÊýµÄ·µ»ØÖµ£¬´ËʱÈç¹û<else-part>;ûÓб»¶¨Ò壬ÄÇô£¬Õû¸öº¯Êý·µ»Ø¿Õ×Ö´®¡£

 

ËùÒÔ£¬<then-part>;ºÍ<else-part>;Ö»»áÓÐÒ»¸ö±»¼ÆËã¡£

 

Áù¡¢callº¯Êý
 

callº¯ÊýÊÇΨһһ¸ö¿ÉÒÔÓÃÀ´´´½¨ÐµIJÎÊý»¯µÄº¯Êý¡£Äã¿ÉÒÔдһ¸ö·Ç³£¸´Ôӵıí´ïʽ£¬Õâ¸ö±í´ïʽÖУ¬Äã¿ÉÒÔ¶¨ÒåÐí¶à²ÎÊý£¬È»ºóÄã¿ÉÒÔÓÃcallº¯ÊýÀ´ÏòÕâ¸ö±í´ïʽ´«µÝ²ÎÊý¡£ÆäÓï·¨ÊÇ£º

 

    $(call <expression>;,<parm1>;,<parm2>;,<parm3>;...)

 

µ±makeÖ´ÐÐÕâ¸öº¯Êýʱ£¬<expression>;²ÎÊýÖеıäÁ¿£¬Èç$(1)£¬$(2)£¬$(3)µÈ£¬»á±»²ÎÊý<parm1>;£¬<parm2>;£¬<parm3>;ÒÀ´ÎÈ¡´ú¡£¶ø<expression>;µÄ·µ»ØÖµ¾ÍÊÇcallº¯ÊýµÄ·µ»ØÖµ¡£ÀýÈ磺

    reverse =  $(1) $(2)

    foo = $(call reverse,a,b)

 

ÄÇô£¬fooµÄÖµ¾ÍÊÇ¡°a b¡±¡£µ±È»£¬²ÎÊýµÄ´ÎÐòÊÇ¿ÉÒÔ×Ô¶¨ÒåµÄ£¬²»Ò»¶¨ÊÇ˳ÐòµÄ£¬È磺

 

    reverse =  $(2) $(1)

    foo = $(call reverse,a,b)

 

´ËʱµÄfooµÄÖµ¾ÍÊÇ¡°b a¡±¡£

 

Æß¡¢originº¯Êý

originº¯Êý²»ÏñÆäËüµÄº¯Êý£¬Ëû²¢²»²Ù×÷±äÁ¿µÄÖµ£¬ËûÖ»ÊǸæËßÄãÄãµÄÕâ¸ö±äÁ¿ÊÇÄÄÀïÀ´µÄ£¿ÆäÓï·¨ÊÇ£º

 

    $(origin <variable>;)

 

×¢Ò⣬<variable>;ÊDZäÁ¿µÄÃû×Ö£¬²»Ó¦¸ÃÊÇÒýÓá£ËùÒÔÄã×îºÃ²»ÒªÔÚ<variable>;ÖÐʹÓá°$¡±×Ö·û¡£Originº¯Êý»áÒÔÆä·µ»ØÖµÀ´¸æËßÄãÕâ¸ö±äÁ¿µÄ¡°³öÉúÇé¿ö¡±£¬ÏÂÃæ£¬ÊÇoriginº¯ÊýµÄ·µ»ØÖµ:

 

¡°undefined¡±

      Èç¹û<variable>;´ÓÀ´Ã»Óж¨Òå¹ý£¬originº¯Êý·µ»ØÕâ¸öÖµ¡°undefined¡±¡£

 

¡°default¡±

      Èç¹û<variable>;ÊÇÒ»¸öĬÈϵ͍Ò壬±ÈÈç¡°CC¡±Õâ¸ö±äÁ¿£¬ÕâÖÖ±äÁ¿ÎÒÃǽ«ÔÚºóÃæ½²Êö¡£

 

¡°environment¡±

      Èç¹û<variable>;ÊÇÒ»¸ö»·¾³±äÁ¿£¬²¢ÇÒµ±Makefile±»Ö´ÐÐʱ£¬¡°-e¡±²ÎÊýûÓб»´ò¿ª¡£

 

¡°file¡±

      Èç¹û<variable>;Õâ¸ö±äÁ¿±»¶¨ÒåÔÚMakefileÖС£

 

¡°command line¡±

      Èç¹û<variable>;Õâ¸ö±äÁ¿ÊDZ»ÃüÁîÐж¨ÒåµÄ¡£

 

¡°override¡±

      Èç¹û<variable>;ÊDZ»overrideָʾ·ûÖØÐ¶¨ÒåµÄ¡£

 

¡°automatic¡±

      Èç¹û<variable>;ÊÇÒ»¸öÃüÁîÔËÐÐÖеÄ×Ô¶¯»¯±äÁ¿¡£¹ØÓÚ×Ô¶¯»¯±äÁ¿½«ÔÚºóÃæ½²Êö¡£

 

ÕâЩÐÅÏ¢¶ÔÓÚÎÒÃDZàдMakefileÊǷdz£ÓÐÓõģ¬ÀýÈ磬¼ÙÉèÎÒÃÇÓÐÒ»¸öMakefileÆä°üÁËÒ»¸ö¶¨ÒåÎļþMake.def£¬ÔÚMake.defÖж¨ÒåÁËÒ»¸ö±äÁ¿¡°bletch¡±£¬¶øÎÒÃǵĻ·¾³ÖÐÒ²ÓÐÒ»¸ö»·¾³±äÁ¿¡°bletch¡±£¬´Ëʱ£¬ÎÒÃÇÏëÅжÏһϣ¬Èç¹û±äÁ¿À´Ô´ÓÚ»·¾³£¬ÄÇôÎÒÃǾͰÑÖ®ÖØ¶¨ÒåÁË£¬Èç¹ûÀ´Ô´ÓÚMake.def»òÊÇÃüÁîÐеȷǻ·¾³µÄ£¬ÄÇôÎÒÃǾͲ»ÖØÐ¶¨ÒåËü¡£ÓÚÊÇ£¬ÔÚÎÒÃǵÄMakefileÖУ¬ÎÒÃÇ¿ÉÒÔÕâÑùд£º

 

    ifdef bletch

    ifeq "$(origin bletch)" "environment"

    bletch = barf, gag, etc.

    endif

    endif

 

µ±È»£¬ÄãÒ²Ðí»á˵£¬Ê¹ÓÃoverride¹Ø¼ü×Ö²»¾Í¿ÉÒÔÖØÐ¶¨Òå»·¾³ÖеıäÁ¿ÁËÂð£¿ÎªÊ²Ã´ÐèҪʹÓÃÕâÑùµÄ²½Ö裿Êǵģ¬ÎÒÃÇÓÃoverrideÊÇ¿ÉÒÔ´ïµ½ÕâÑùµÄЧ¹û£¬¿ÉÊÇoverride¹ýÓÚ´Ö±©£¬Ëüͬʱ»á°Ñ´ÓÃüÁîÐж¨ÒåµÄ±äÁ¿Ò²¸²¸ÇÁË£¬¶øÎÒÃÇÖ»ÏëÖØÐ¶¨Òå»·¾³´«À´µÄ£¬¶ø²»ÏëÖØÐ¶¨ÒåÃüÁîÐд«À´µÄ¡£

 

 

°Ë¡¢shellº¯Êý
 

shellº¯ÊýÒ²²»ÏñÆäËüµÄº¯Êý¡£¹ËÃû˼Ò壬ËüµÄ²ÎÊýÓ¦¸Ã¾ÍÊDzÙ×÷ϵͳShellµÄÃüÁî¡£ËüºÍ·´ÒýºÅ¡°`¡±ÊÇÏàͬµÄ¹¦ÄÜ¡£Õâ¾ÍÊÇ˵£¬shellº¯Êý°ÑÖ´ÐвÙ×÷ϵͳÃüÁîºóµÄÊä³ö×÷Ϊº¯Êý·µ»Ø¡£ÓÚÊÇ£¬ÎÒÃÇ¿ÉÒÔÓòÙ×÷ϵͳÃüÁîÒÔ¼°×Ö·û´®´¦ÀíÃüÁîawk£¬sedµÈµÈÃüÁîÀ´Éú³ÉÒ»¸ö±äÁ¿£¬È磺

 

    contents := $(shell cat foo)

 

    files := $(shell echo *.c)

 

×¢Ò⣬Õâ¸öº¯Êý»áÐÂÉú³ÉÒ»¸öShell³ÌÐòÀ´Ö´ÐÐÃüÁËùÒÔÄãҪעÒâÆäÔËÐÐÐÔÄÜ£¬Èç¹ûÄãµÄMakefileÖÐÓÐһЩ±È½Ï¸´ÔӵĹæÔò£¬²¢´óÁ¿Ê¹ÓÃÁËÕâ¸öº¯Êý£¬ÄÇô¶ÔÓÚÄãµÄϵͳÐÔÄÜÊÇÓк¦µÄ¡£ÌرðÊÇMakefileµÄÒþ»ÞµÄ¹æÔò¿ÉÄÜ»áÈÃÄãµÄshellº¯ÊýÖ´ÐеĴÎÊý±ÈÄãÏëÏñµÄ¶àµÃ¶à¡£

 


¾Å¡¢¿ØÖÆmakeµÄº¯Êý
 

makeÌṩÁËһЩº¯ÊýÀ´¿ØÖÆmakeµÄÔËÐС£Í¨³££¬ÄãÐèÒª¼ì²âһЩÔËÐÐMakefileʱµÄÔËÐÐʱÐÅÏ¢£¬²¢ÇÒ¸ù¾ÝÕâЩÐÅÏ¢À´¾ö¶¨£¬ÄãÊÇÈÃmake¼ÌÐøÖ´ÐУ¬»¹ÊÇÍ£Ö¹¡£

 

$(error <text ...>;)

 

    ²úÉúÒ»¸öÖÂÃüµÄ´íÎó£¬<text ...>;ÊÇ´íÎóÐÅÏ¢¡£×¢Ò⣬errorº¯Êý²»»áÔÚÒ»±»Ê¹Óþͻá²úÉú´íÎóÐÅÏ¢£¬ËùÒÔÈç¹ûÄã°ÑÆä¶¨ÒåÔÚij¸ö±äÁ¿ÖУ¬²¢ÔÚºóÐøµÄ½Å±¾ÖÐʹÓÃÕâ¸ö±äÁ¿£¬ÄÇôҲÊÇ¿ÉÒԵġ£ÀýÈ磺

 

    ʾÀýÒ»£º

    ifdef ERROR_001

    $(error error is $(ERROR_001))

    endif

 

    ʾÀý¶þ£º

    ERR = $(error found an error!)

    .PHONY: err

    err: ; $(ERR)

 

    ʾÀýÒ»»áÔÚ±äÁ¿ERROR_001¶¨ÒåÁ˺óÖ´ÐÐʱ²úÉúerrorµ÷Ó㬶øÊ¾Àý¶þÔòÔÚĿ¼err±»Ö´ÐÐʱ²Å·¢Éúerrorµ÷Óá£

 

$(warning <text ...>;)

 

     Õâ¸öº¯ÊýºÜÏñerrorº¯Êý£¬Ö»ÊÇËü²¢²»»áÈÃmakeÍ˳ö£¬Ö»ÊÇÊä³öÒ»¶Î¾¯¸æÐÅÏ¢£¬¶ømake¼ÌÐøÖ´ÐС£


make µÄÔËÐÐ


Ò»°ãÀ´Ëµ£¬×î¼òµ¥µÄ¾ÍÊÇÖ±½ÓÔÚÃüÁîÐÐÏÂÊäÈëmakeÃüÁmakeÃüÁî»áÕÒµ±Ç°Ä¿Â¼µÄmakefileÀ´Ö´ÐУ¬Ò»Çж¼ÊÇ×Ô¶¯µÄ¡£µ«Ò²ÓÐʱÄãÒ²ÐíÖ»ÏëÈÃmakeÖØ±àÒëijЩÎļþ£¬¶ø²»ÊÇÕû¸ö¹¤³Ì£¬¶øÓÖÓеÄʱºòÄãÓм¸Ì×±àÒë¹æÔò£¬ÄãÏëÔÚ²»Í¬µÄʱºòʹÓò»Í¬µÄ±àÒë¹æÔò£¬µÈµÈ¡£±¾Õ½ھÍÊǽ²ÊöÈçºÎʹÓÃmakeÃüÁîµÄ¡£

Ò»¡¢makeµÄÍ˳öÂë

makeÃüÁîÖ´ÐкóÓÐÈý¸öÍ˳öÂ룺

    0 ¡ª¡ª ±íʾ³É¹¦Ö´ÐС£
    1 ¡ª¡ª Èç¹ûmakeÔËÐÐʱ³öÏÖÈκδíÎ󣬯䷵»Ø1¡£
    2 ¡ª¡ª Èç¹ûÄãʹÓÃÁËmakeµÄ¡°-q¡±Ñ¡Ï²¢ÇÒmakeʹµÃһЩĿ±ê²»ÐèÒª¸üУ¬ÄÇô·µ»Ø2¡£

MakeµÄÏà¹Ø²ÎÊýÎÒÃÇ»áÔÚºóÐøÕ½ÚÖн²Êö¡£


¶þ¡¢Ö¸¶¨Makefile

Ç°ÃæÎÒÃÇ˵¹ý£¬GNU makeÕÒѰĬÈϵÄMakefileµÄ¹æÔòÊÇÔÚµ±Ç°Ä¿Â¼ÏÂÒÀ´ÎÕÒÈý¸öÎļþ¡ª¡ª¡°GNUmakefile¡±¡¢¡°makefile¡±ºÍ¡°Makefile¡±¡£Æä°´Ë³ÐòÕÒÕâÈý¸öÎļþ£¬Ò»µ©ÕÒµ½£¬¾Í¿ªÊ¼¶ÁÈ¡Õâ¸öÎļþ²¢Ö´ÐС£

µ±Ç°£¬ÎÒÃÇÒ²¿ÉÒÔ¸ømakeÃüÁîÖ¸¶¨Ò»¸öÌØÊâÃû×ÖµÄMakefile¡£Òª´ïµ½Õâ¸ö¹¦ÄÜ£¬ÎÒÃÇҪʹÓÃmakeµÄ¡°-f¡±»òÊÇ¡°--file¡±²ÎÊý£¨¡°--makefile¡±²ÎÊýÒ²ÐУ©¡£ÀýÈ磬ÎÒÃÇÓиömakefileµÄÃû×ÖÊÇ¡°hchen.mk¡±£¬ÄÇô£¬ÎÒÃÇ¿ÉÒÔÕâÑùÀ´ÈÃmakeÀ´Ö´ÐÐÕâ¸öÎļþ£º

    make ¨Cf hchen.mk

Èç¹ûÔÚmakeµÄÃüÁîÐÐÊÇ£¬Äã²»Ö»Ò»´ÎµØÊ¹ÓÃÁË¡°-f¡±²ÎÊý£¬ÄÇô£¬ËùÓÐÖ¸¶¨µÄmakefile½«»á±»Á¬ÔÚÒ»Æð´«µÝ¸ømakeÖ´ÐС£


Èý¡¢Ö¸¶¨Ä¿±ê

Ò»°ãÀ´Ëµ£¬makeµÄ×îÖÕÄ¿±êÊÇmakefileÖеĵÚÒ»¸öÄ¿±ê£¬¶øÆäËüÄ¿±êÒ»°ãÊÇÓÉÕâ¸öÄ¿±êÁ¬´ø³öÀ´µÄ¡£ÕâÊÇmakeµÄĬÈÏÐÐΪ¡£µ±È»£¬Ò»°ãÀ´Ëµ£¬ÄãµÄmakefileÖеĵÚÒ»¸öÄ¿±êÊÇÓÉÐí¶à¸öÄ¿±ê×é³É£¬Äã¿ÉÒÔָʾmake£¬ÈÃÆäÍê³ÉÄãËùÖ¸¶¨µÄÄ¿±ê¡£Òª´ïµ½ÕâһĿµÄºÜ¼òµ¥£¬ÐèÔÚmakeÃüÁîºóÖ±½Ó¸úÄ¿±êµÄÃû×־ͿÉÒÔÍê³É£¨ÈçÇ°ÃæÌáµ½µÄ¡°make clean¡±ÐÎʽ£©

ÈκÎÔÚmakefileÖеÄÄ¿±ê¶¼¿ÉÒÔ±»Ö¸¶¨³ÉÖÕ¼«Ä¿±ê£¬µ«ÊdzýÁËÒÔ¡°-¡±´òÍ·£¬»òÊǰüº¬ÁË¡°=¡±µÄÄ¿±ê£¬ÒòΪÓÐÕâЩ×Ö·ûµÄÄ¿±ê£¬»á±»½âÎö³ÉÃüÁîÐвÎÊý»òÊDZäÁ¿¡£ÉõÖÁûÓб»ÎÒÃÇÃ÷ȷд³öÀ´µÄÄ¿±êÒ²¿ÉÒÔ³ÉΪmakeµÄÖÕ¼«Ä¿±ê£¬Ò²¾ÍÊÇ˵£¬Ö»Òªmake¿ÉÒÔÕÒµ½ÆäÒþº¬¹æÔòÍÆµ¼¹æÔò£¬ÄÇôÕâ¸öÒþº¬Ä¿±êͬÑù¿ÉÒÔ±»Ö¸¶¨³ÉÖÕ¼«Ä¿±ê¡£

ÓÐÒ»¸ömakeµÄ»·¾³±äÁ¿½Ð¡°MAKECMDGOALS¡±£¬Õâ¸ö±äÁ¿ÖÐ»á´æ·ÅÄãËùÖ¸¶¨µÄÖÕ¼«Ä¿±êµÄÁÐ±í£¬Èç¹ûÔÚÃüÁîÐÐÉÏ£¬ÄãûÓÐÖ¸¶¨Ä¿±ê£¬ÄÇô£¬Õâ¸ö±äÁ¿ÊÇ¿ÕÖµ¡£Õâ¸ö±äÁ¿¿ÉÒÔÈÃÄãʹÓÃÔÚһЩ±È½ÏÌØÊâµÄÇéÐÎÏ¡£±ÈÈçÏÂÃæµÄÀý×Ó£º

    sources = foo.c bar.c
    ifneq ( $(MAKECMDGOALS),clean)
    include $(sources:.c=.d)
    endif

»ùÓÚÉÏÃæµÄÕâ¸öÀý×Ó£¬Ö»ÒªÎÒÃÇÊäÈëµÄÃüÁî²»ÊÇ¡°make clean¡±£¬ÄÇômakefile»á×Ô¶¯°üº¬¡°foo.d¡±ºÍ¡°bar.d¡±ÕâÁ½¸ömakefile¡£

ʹÓÃÖ¸¶¨ÖÕ¼«Ä¿±êµÄ·½·¨¿ÉÒԺܷ½±ãµØÈÃÎÒÃDZàÒëÎÒÃǵijÌÐò£¬ÀýÈçÏÂÃæÕâ¸öÀý×Ó£º

    .PHONY: all
    all: prog1 prog2 prog3 prog4

´ÓÕâ¸öÀý×ÓÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Õâ¸ömakefileÖÐÓÐËĸöÐèÒª±àÒëµÄ³ÌÐò¡ª¡ª¡°prog1¡±£¬ ¡°prog2¡±£¬ ¡°prog3¡±ºÍ ¡°prog4¡±£¬ÎÒÃÇ¿ÉÒÔʹÓá°make all¡±ÃüÁîÀ´±àÒëËùÓеÄÄ¿±ê£¨Èç¹û°ÑallÖóɵÚÒ»¸öÄ¿±ê£¬ÄÇôֻÐèÖ´ÐС°make¡±£©£¬ÎÒÃÇÒ²¿ÉÒÔʹÓá°make prog2¡±À´µ¥¶À±àÒëÄ¿±ê¡°prog2¡±¡£

¼´È»make¿ÉÒÔÖ¸¶¨ËùÓÐmakefileÖеÄÄ¿±ê£¬ÄÇôҲ°üÀ¨¡°Î±Ä¿±ê¡±£¬ÓÚÊÇÎÒÃÇ¿ÉÒÔ¸ù¾ÝÕâÖÖÐÔÖÊÀ´ÈÃÎÒÃǵÄmakefile¸ù¾ÝÖ¸¶¨µÄ²»Í¬µÄÄ¿±êÀ´Íê³É²»Í¬µÄÊ¡£ÔÚunixÊÀ½çÖУ¬Èí¼þ·¢²¼Ê±£¬ÌرðÊÇGNUÕâÖÖ¿ªÔ´Èí¼þµÄ·¢²¼Ê±£¬Æämakefile¶¼°üº¬Á˱àÒë¡¢°²×°¡¢´ò°üµÈ¹¦ÄÜ¡£ÎÒÃÇ¿ÉÒÔ²ÎÕÕÕâÖÖ¹æÔòÀ´ÊéдÎÒÃǵÄmakefileÖеÄÄ¿±ê¡£

     ¡°all¡±
        Õâ¸öαĿ±êÊÇËùÓÐÄ¿±êµÄÄ¿±ê£¬Æä¹¦ÄÜÒ»°ãÊDZàÒëËùÓеÄÄ¿±ê¡£
     ¡°clean¡±
        Õâ¸öαĿ±ê¹¦ÄÜÊÇɾ³ýËùÓб»make´´½¨µÄÎļþ¡£
     ¡°install¡±
        Õâ¸öαĿ±ê¹¦ÄÜÊǰ²×°ÒѱàÒëºÃµÄ³ÌÐò£¬Æäʵ¾ÍÊǰÑÄ¿±êÖ´ÐÐÎļþ¿½±´µ½Ö¸¶¨µÄÄ¿±êÖÐÈ¥¡£
     ¡°print¡±
        Õâ¸öαĿ±êµÄ¹¦ÄÜÊÇÀý³ö¸Ä±ä¹ýµÄÔ´Îļþ¡£
     ¡°tar¡±
        Õâ¸öαĿ±ê¹¦ÄÜÊǰÑÔ´³ÌÐò´ò°ü±¸·Ý¡£Ò²¾ÍÊÇÒ»¸ötarÎļþ¡£
     ¡°dist¡±
        Õâ¸öαĿ±ê¹¦ÄÜÊÇ´´½¨Ò»¸öѹËõÎļþ£¬Ò»°ãÊǰÑtarÎļþѹ³ÉZÎļþ¡£»òÊÇgzÎļþ¡£
     ¡°TAGS¡±
        Õâ¸öαĿ±ê¹¦ÄÜÊǸüÐÂËùÓеÄÄ¿±ê£¬ÒÔ±¸ÍêÕûµØÖرàÒëʹÓá£
     ¡°check¡±ºÍ¡°test¡±
        ÕâÁ½¸öαĿ±êÒ»°ãÓÃÀ´²âÊÔmakefileµÄÁ÷³Ì¡£

µ±È»Ò»¸öÏîÄ¿µÄmakefileÖÐÒ²²»Ò»¶¨ÒªÊéдÕâÑùµÄÄ¿±ê£¬ÕâЩ¶«Î÷¶¼ÊÇGNUµÄ¶«Î÷£¬µ«ÊÇÎÒÏ룬GNU¸ã³öÕâЩ¶«Î÷Ò»¶¨ÓÐÆä¿Éȡ֮´¦£¨µÈÄãµÄunixϵijÌÐòÎļþÒ»¶àʱÄã¾Í»á·¢ÏÖÕâЩ¹¦ÄܺÜÓÐÓÃÁË£©£¬ÕâÀïÖ»²»¹ýÊÇ˵Ã÷ÁË£¬Èç¹ûÄãÒªÊéдÕâÖÖ¹¦ÄÜ£¬×îºÃʹÓÃÕâÖÖÃû×ÖÃüÃûÄãµÄÄ¿±ê£¬ÕâÑù¹æ·¶Ò»Ð©£¬¹æ·¶µÄºÃ´¦¾ÍÊÇ¡ª¡ª²»ÓýâÊÍ£¬´ó¼Ò¶¼Ã÷°×¡£¶øÇÒÈç¹ûÄãµÄmakefileÖÐÓÐÕâЩ¹¦ÄÜ£¬Ò»ÊǺÜʵÓ㬶þÊÇ¿ÉÒÔÏÔµÃÄãµÄmakefileºÜרҵ£¨²»ÊÇÄÇÖÖ³õѧÕßµÄ×÷Æ·£©¡£


ËÄ¡¢¼ì²é¹æÔò

ÓÐʱºò£¬ÎÒÃDz»ÏëÈÃÎÒÃǵÄmakefileÖеĹæÔòÖ´ÐÐÆðÀ´£¬ÎÒÃÇÖ»Ïë¼ì²éÒ»ÏÂÎÒÃǵÄÃüÁ»òÊÇÖ´ÐеÄÐòÁС£ÓÚÊÇÎÒÃÇ¿ÉÒÔʹÓÃmakeÃüÁîµÄÏÂÊö²ÎÊý£º

    ¡°-n¡±
    ¡°--just-print¡±
    ¡°--dry-run¡±
    ¡°--recon¡±
    ²»Ö´ÐвÎÊý£¬ÕâЩ²ÎÊýÖ»ÊÇ´òÓ¡ÃüÁ²»¹ÜÄ¿±êÊÇ·ñ¸üУ¬°Ñ¹æÔòºÍÁ¬´ø¹æÔòϵÄÃüÁî´òÓ¡³öÀ´£¬µ«²»Ö´ÐУ¬ÕâЩ²ÎÊý¶ÔÓÚÎÒÃǵ÷ÊÔmakefileºÜÓÐÓô¦¡£

    ¡°-t¡±
    ¡°--touch¡±
    Õâ¸ö²ÎÊýµÄÒâ˼¾ÍÊǰÑÄ¿±êÎļþµÄʱ¼ä¸üУ¬µ«²»¸ü¸ÄÄ¿±êÎļþ¡£Ò²¾ÍÊÇ˵£¬make¼Ù×°±àÒëÄ¿±ê£¬µ«²»ÊÇÕæÕýµÄ±àÒëÄ¿±ê£¬Ö»ÊǰÑÄ¿±ê±ä³ÉÒѱàÒë¹ýµÄ״̬¡£

    ¡°-q¡±
    ¡°--question¡±
    Õâ¸ö²ÎÊýµÄÐÐΪÊÇÕÒÄ¿±êµÄÒâ˼£¬Ò²¾ÍÊÇ˵£¬Èç¹ûÄ¿±ê´æÔÚ£¬ÄÇôÆäʲôҲ²»»áÊä³ö£¬µ±È»Ò²²»»áÖ´ÐбàÒ룬Èç¹ûÄ¿±ê²»´æÔÚ£¬Æä»á´òÓ¡³öÒ»Ìõ³ö´íÐÅÏ¢¡£

    ¡°-W <file>;¡±
    ¡°--what-if=<file>;¡±
    ¡°--assume-new=<file>;¡±
    ¡°--new-file=<file>;¡±
    Õâ¸ö²ÎÊýÐèÒªÖ¸¶¨Ò»¸öÎļþ¡£Ò»°ãÊÇÊÇÔ´Îļþ£¨»òÒÀÀµÎļþ£©£¬Make»á¸ù¾Ý¹æÔòÍÆµ¼À´ÔËÐÐÒÀÀµÓÚÕâ¸öÎļþµÄÃüÁһ°ãÀ´Ëµ£¬¿ÉÒԺ͡°-n¡±²ÎÊýһͬʹÓã¬À´²é¿´Õâ¸öÒÀÀµÎļþËù·¢ÉúµÄ¹æÔòÃüÁî¡£

ÁíÍâÒ»¸öºÜÓÐÒâ˼µÄÓ÷¨ÊǽáºÏ¡°-p¡±ºÍ¡°-v¡±À´Êä³ömakefile±»Ö´ÐÐʱµÄÐÅÏ¢£¨Õâ¸ö½«ÔÚºóÃæ½²Êö£©¡£


Îå¡¢makeµÄ²ÎÊý

ÏÂÃæÁоÙÁËËùÓÐGNU make 3.80°æµÄ²ÎÊý¶¨Òå¡£ÆäËü°æ±¾ºÍ²úÉ̵Ämake´óͬСÒ죬²»¹ýÆäËü²úÉ̵ÄmakeµÄ¾ßÌå²ÎÊý»¹ÊÇÇë²Î¿¼¸÷×ԵIJúÆ·Îĵµ¡£

¡°-b¡±
¡°-m¡±
ÕâÁ½¸ö²ÎÊýµÄ×÷ÓÃÊǺöÂÔºÍÆäËü°æ±¾makeµÄ¼æÈÝÐÔ¡£

¡°-B¡±
¡°--always-make¡±
ÈÏΪËùÓеÄÄ¿±ê¶¼ÐèÒª¸üУ¨ÖرàÒ룩¡£

¡°-C <dir>;¡±
¡°--directory=<dir>;¡±
Ö¸¶¨¶ÁÈ¡makefileµÄĿ¼¡£Èç¹ûÓжà¸ö¡°-C¡±²ÎÊý£¬makeµÄ½âÊÍÊǺóÃæµÄ·¾¶ÒÔÇ°ÃæµÄ×÷ΪÏà¶Ô·¾¶£¬²¢ÒÔ×îºóµÄĿ¼×÷Ϊ±»Ö¸¶¨Ä¿Â¼¡£È磺¡°make ¨CC ~hchen/test ¨CC prog¡±µÈ¼ÛÓÚ¡°make ¨CC ~hchen/test/prog¡±¡£

¡°¡ªdebug[=<options>;]¡±
Êä³ömakeµÄµ÷ÊÔÐÅÏ¢¡£ËüÓм¸ÖÖ²»Í¬µÄ¼¶±ð¿É¹©Ñ¡Ôñ£¬Èç¹ûûÓвÎÊý£¬ÄǾÍÊÇÊä³ö×î¼òµ¥µÄµ÷ÊÔÐÅÏ¢¡£ÏÂÃæÊÇ<options>;µÄȡֵ£º
    a ¡ª¡ª Ò²¾ÍÊÇall£¬Êä³öËùÓеĵ÷ÊÔÐÅÏ¢¡££¨»á·Ç³£µÄ¶à£©
    b ¡ª¡ª Ò²¾ÍÊÇbasic£¬Ö»Êä³ö¼òµ¥µÄµ÷ÊÔÐÅÏ¢¡£¼´Êä³ö²»ÐèÒªÖØ±àÒëµÄÄ¿±ê¡£
    v ¡ª¡ª Ò²¾ÍÊÇverbose£¬ÔÚbÑ¡ÏîµÄ¼¶±ðÖ®ÉÏ¡£Êä³öµÄÐÅÏ¢°üÀ¨Äĸömakefile±»½âÎö£¬²»ÐèÒª±»ÖرàÒëµÄÒÀÀµÎļþ£¨»òÊÇÒÀÀµÄ¿±ê£©µÈ¡£
    i ¡ª¡ª Ò²¾ÍÊÇimplicit£¬Êä³öËùÒÔµÄÒþº¬¹æÔò¡£
    j ¡ª¡ª Ò²¾ÍÊÇjobs£¬Êä³öÖ´ÐйæÔòÖÐÃüÁîµÄÏêϸÐÅÏ¢£¬ÈçÃüÁîµÄPID¡¢·µ»ØÂëµÈ¡£
    m ¡ª¡ª Ò²¾ÍÊÇmakefile£¬Êä³ömake¶ÁÈ¡makefile£¬¸üÐÂmakefile£¬Ö´ÐÐmakefileµÄÐÅÏ¢¡£

¡°-d¡±
Ï൱ÓÚ¡°--debug=a¡±¡£

¡°-e¡±
¡°--environment-overrides¡±
Ö¸Ã÷»·¾³±äÁ¿µÄÖµ¸²¸ÇmakefileÖж¨ÒåµÄ±äÁ¿µÄÖµ¡£

¡°-f=<file>;¡±
¡°--file=<file>;¡±
¡°--makefile=<file>;¡±
Ö¸¶¨ÐèÒªÖ´ÐеÄmakefile¡£

¡°-h¡±
¡°--help¡±
ÏÔʾ°ïÖúÐÅÏ¢¡£

¡°-i¡±
¡°--ignore-errors¡±
ÔÚÖ´ÐÐʱºöÂÔËùÓеĴíÎó¡£

¡°-I <dir>;¡±
¡°--include-dir=<dir>;¡±
Ö¸¶¨Ò»¸ö±»°üº¬makefileµÄËÑË÷Ä¿±ê¡£¿ÉÒÔʹÓöà¸ö¡°-I¡±²ÎÊýÀ´Ö¸¶¨¶à¸öĿ¼¡£

¡°-j [<jobsnum>;]¡±
¡°--jobs[=<jobsnum>;]¡±
ָͬʱÔËÐÐÃüÁîµÄ¸öÊý¡£Èç¹ûûÓÐÕâ¸ö²ÎÊý£¬makeÔËÐÐÃüÁîʱÄÜÔËÐжàÉÙ¾ÍÔËÐжàÉÙ¡£Èç¹ûÓÐÒ»¸öÒÔÉϵġ°-j¡±²ÎÊý£¬ÄÇô½ö×îºóÒ»¸ö¡°-j¡±²ÅÊÇÓÐЧµÄ¡££¨×¢ÒâÕâ¸ö²ÎÊýÔÚMS-DOSÖÐÊÇÎÞÓõģ©

¡°-k¡±
¡°--keep-going¡±
³ö´íÒ²²»Í£Ö¹ÔËÐС£Èç¹ûÉú³ÉÒ»¸öÄ¿±êʧ°ÜÁË£¬ÄÇôÒÀÀµÓÚÆäÉϵÄÄ¿±ê¾Í²»»á±»Ö´ÐÐÁË¡£

¡°-l <load>;¡±
¡°--load-average[=<load]¡±
¡°¡ªmax-load[=<load>;]¡±
Ö¸¶¨makeÔËÐÐÃüÁîµÄ¸ºÔØ¡£

¡°-n¡±
¡°--just-print¡±
¡°--dry-run¡±
¡°--recon¡±
½öÊä³öÖ´Ðйý³ÌÖеÄÃüÁîÐòÁУ¬µ«²¢²»Ö´ÐС£

¡°-o <file>;¡±
¡°--old-file=<file>;¡±
¡°--assume-old=<file>;¡±
²»ÖØÐÂÉú³ÉµÄÖ¸¶¨µÄ<file>;£¬¼´Ê¹Õâ¸öÄ¿±êµÄÒÀÀµÎļþÐÂÓÚËü¡£

¡°-p¡±
¡°--print-data-base¡±
Êä³ömakefileÖеÄËùÓÐÊý¾Ý£¬°üÀ¨ËùÓеĹæÔòºÍ±äÁ¿¡£Õâ¸ö²ÎÊý»áÈÃÒ»¸ö¼òµ¥µÄmakefile¶¼»áÊä³öÒ»¶ÑÐÅÏ¢¡£Èç¹ûÄãÖ»ÊÇÏëÊä³öÐÅÏ¢¶ø²»ÏëÖ´ÐÐmakefile£¬Äã¿ÉÒÔʹÓá°make -qp¡±ÃüÁî¡£Èç¹ûÄãÏë²é¿´Ö´ÐÐmakefileǰµÄÔ¤Éè±äÁ¿ºÍ¹æÔò£¬Äã¿ÉÒÔʹÓá°make ¨Cp ¨Cf /dev/null¡±¡£Õâ¸ö²ÎÊýÊä³öµÄÐÅÏ¢»á°üº¬×ÅÄãµÄmakefileÎļþµÄÎļþÃûºÍÐкţ¬ËùÒÔ£¬ÓÃÕâ¸ö²ÎÊýÀ´µ÷ÊÔÄãµÄmakefile»áÊǺÜÓÐÓõģ¬ÌرðÊǵ±ÄãµÄ»·¾³±äÁ¿ºÜ¸´ÔÓµÄʱºò¡£

¡°-q¡±
¡°--question¡±
²»ÔËÐÐÃüÁҲ²»Êä³ö¡£½ö½öÊǼì²éËùÖ¸¶¨µÄÄ¿±êÊÇ·ñÐèÒª¸üС£Èç¹ûÊÇ0Ôò˵Ã÷Òª¸üУ¬Èç¹ûÊÇ2Ôò˵Ã÷ÓдíÎó·¢Éú¡£

¡°-r¡±
¡°--no-builtin-rules¡±
½ûÖ¹makeʹÓÃÈκÎÒþº¬¹æÔò¡£

¡°-R¡±
¡°--no-builtin-variabes¡±
½ûÖ¹makeʹÓÃÈκÎ×÷ÓÃÓÚ±äÁ¿ÉϵÄÒþº¬¹æÔò¡£

¡°-s¡±
¡°--silent¡±
¡°--quiet¡±
ÔÚÃüÁîÔËÐÐʱ²»Êä³öÃüÁîµÄÊä³ö¡£

¡°-S¡±
¡°--no-keep-going¡±
¡°--stop¡±
È¡Ïû¡°-k¡±Ñ¡ÏîµÄ×÷Óá£ÒòΪÓÐЩʱºò£¬makeµÄÑ¡ÏîÊÇ´Ó»·¾³±äÁ¿¡°MAKEFLAGS¡±Öм̳ÐÏÂÀ´µÄ¡£ËùÒÔÄã¿ÉÒÔÔÚÃüÁîÐÐÖÐʹÓÃÕâ¸ö²ÎÊýÀ´Èû·¾³±äÁ¿Öеġ°-k¡±Ñ¡ÏîʧЧ¡£

¡°-t¡±
¡°--touch¡±
Ï൱ÓÚunixµÄtouchÃüÁֻÊǰÑÄ¿±êµÄÐÞ¸ÄÈÕÆÚ±ä³É×îеģ¬Ò²¾ÍÊÇ×èÖ¹Éú³ÉÄ¿±êµÄÃüÁîÔËÐС£

¡°-v¡±
¡°--version¡±
Êä³ömake³ÌÐòµÄ°æ±¾¡¢°æÈ¨µÈ¹ØÓÚmakeµÄÐÅÏ¢¡£

¡°-w¡±
¡°--print-directory¡±
Êä³öÔËÐÐmakefile֮ǰºÍÖ®ºóµÄÐÅÏ¢¡£Õâ¸ö²ÎÊý¶ÔÓÚ¸ú×ÙǶÌ×ʽµ÷ÓÃmakeʱºÜÓÐÓá£

¡°--no-print-directory¡±
½ûÖ¹¡°-w¡±Ñ¡Ïî¡£

¡°-W <file>;¡±
¡°--what-if=<file>;¡±
¡°--new-file=<file>;¡±
¡°--assume-file=<file>;¡±
¼Ù¶¨Ä¿±ê<file>;ÐèÒª¸üУ¬Èç¹ûºÍ¡°-n¡±Ñ¡ÏîʹÓã¬ÄÇôÕâ¸ö²ÎÊý»áÊä³ö¸ÃÄ¿±ê¸üÐÂʱµÄÔËÐж¯×÷¡£Èç¹ûûÓС°-n¡±ÄÇô¾ÍÏñÔËÐÐunixµÄ¡°touch¡±ÃüÁîÒ»Ñù£¬Ê¹µÃ<file>;µÄÐÞ¸Äʱ¼äΪµ±Ç°Ê±¼ä¡£

¡°--warn-undefined-variables¡±
Ö»Òªmake·¢ÏÖÓÐ䶨ÒåµÄ±äÁ¿£¬ÄÇô¾ÍÊä³ö¾¯¸æÐÅÏ¢¡£

 

Òþº¬¹æÔò


ÔÚÎÒÃÇʹÓÃMakefileʱ£¬ÓÐһЩÎÒÃǻᾭ³£Ê¹Ó㬶øÇÒʹÓÃÆµÂʷdz£¸ßµÄ¶«Î÷£¬±ÈÈ磬ÎÒÃDZàÒëC/C++µÄÔ´³ÌÐòΪÖмäÄ¿±êÎļþ£¨unixÏÂÊÇ[.o]Îļþ£¬WindowsÏÂÊÇ[.obj]Îļþ£©¡£±¾Õ½²ÊöµÄ¾ÍÊÇһЩÔÚMakefileÖеġ°Òþº¬µÄ¡±£¬ÔçÏÈÔ¼¶¨Á˵쬲»ÐèÒªÎÒÃÇÔÙд³öÀ´µÄ¹æÔò¡£

¡°Òþº¬¹æÔò¡±Ò²¾ÍÊÇÒ»ÖÖ¹ßÀý£¬make»á°´ÕÕÕâÖÖ¡°¹ßÀý¡±ÐÄÕÕ²»ÐúµØÀ´ÔËÐУ¬ÄÇÅÂÎÒÃǵÄMakefileÖÐûÓÐÊéдÕâÑùµÄ¹æÔò¡£ÀýÈ磬°Ñ[.c]Îļþ±àÒë³É[.o]ÎļþÕâÒ»¹æÔò£¬Äã¸ù±¾¾Í²»ÓÃд³öÀ´£¬make»á×Ô¶¯ÍƵ¼³öÕâÖÖ¹æÔò£¬²¢Éú³ÉÎÒÃÇÐèÒªµÄ[.o]Îļþ¡£

¡°Òþº¬¹æÔò¡±»áʹÓÃһЩÎÒÃÇϵͳ±äÁ¿£¬ÎÒÃÇ¿ÉÒԸıäÕâЩϵͳ±äÁ¿µÄÖµÀ´¶¨ÖÆÒþº¬¹æÔòµÄÔËÐÐʱµÄ²ÎÊý¡£Èçϵͳ±äÁ¿¡°CFLAGS¡±¿ÉÒÔ¿ØÖƱàÒëʱµÄ±àÒëÆ÷²ÎÊý¡£

ÎÒÃÇ»¹¿ÉÒÔͨ¹ý¡°Ä£Ê½¹æÔò¡±µÄ·½Ê½Ð´ÏÂ×Ô¼ºµÄÒþº¬¹æÔò¡£Óá°ºó׺¹æÔò¡±À´¶¨ÒåÒþº¬¹æÔò»áÓÐÐí¶àµÄÏÞÖÆ¡£Ê¹Óá°Ä£Ê½¹æÔò¡±»á¸ü»ØµÃÖÇÄܺÍÇå³þ£¬µ«¡°ºó׺¹æÔò¡±¿ÉÒÔÓÃÀ´±£Ö¤ÎÒÃÇMakefileµÄ¼æÈÝÐÔ¡£
ÎÒÃÇÁ˽âÁË¡°Òþº¬¹æÔò¡±£¬¿ÉÒÔÈÃÆäΪÎÒÃǸüºÃµÄ·þÎñ£¬Ò²»áÈÃÎÒÃÇÖªµÀһЩ¡°Ô¼¶¨Ë׳ɡ±Á˵Ķ«Î÷£¬¶ø²»ÖÁÓÚʹµÃÎÒÃÇÔÚÔËÐÐMakefileʱ³öÏÖһЩÎÒÃǾõµÃĪÃûÆäÃîµÄ¶«Î÷¡£µ±È»£¬ÈκÎÊÂÎï¶¼ÊÇì¶ÜµÄ£¬Ë®ÄÜÔØÖÛ£¬Òà¿É¸²ÖÛ£¬ËùÒÔ£¬ÓÐʱºò¡°Òþº¬¹æÔò¡±Ò²»á¸øÎÒÃÇÔì³É²»Ð¡µÄÂé·³¡£Ö»ÓÐÁ˽âÁËËü£¬ÎÒÃDzÅÄܸüºÃµØÊ¹ÓÃËü¡£


Ò»¡¢Ê¹ÓÃÒþº¬¹æÔò

Èç¹ûҪʹÓÃÒþº¬¹æÔòÉú³ÉÄãÐèÒªµÄÄ¿±ê£¬ÄãËùÐèÒª×öµÄ¾ÍÊDz»ÒªÐ´³öÕâ¸öÄ¿±êµÄ¹æÔò¡£ÄÇô£¬make»áÊÔͼȥ×Ô¶¯ÍƵ¼²úÉúÕâ¸öÄ¿±êµÄ¹æÔòºÍÃüÁÈç¹ûmake¿ÉÒÔ×Ô¶¯ÍƵ¼Éú³ÉÕâ¸öÄ¿±êµÄ¹æÔòºÍÃüÁÄÇôÕâ¸öÐÐΪ¾ÍÊÇÒþº¬¹æÔòµÄ×Ô¶¯ÍƵ¼¡£µ±È»£¬Òþº¬¹æÔòÊÇmakeÊÂÏÈÔ¼¶¨ºÃµÄһЩ¶«Î÷¡£ÀýÈ磬ÎÒÃÇÓÐÏÂÃæµÄÒ»¸öMakefile£º

    foo : foo.o bar.o
            cc ¨Co foo foo.o bar.o $(CFLAGS) $(LDFLAGS)

ÎÒÃÇ¿ÉÒÔ×¢Òâµ½£¬Õâ¸öMakefileÖв¢Ã»ÓÐдÏÂÈçºÎÉú³Éfoo.oºÍbar.oÕâÁ½Ä¿±êµÄ¹æÔòºÍÃüÁî¡£ÒòΪmakeµÄ¡°Òþº¬¹æÔò¡±¹¦ÄÜ»á×Ô¶¯ÎªÎÒÃÇ×Ô¶¯È¥ÍƵ¼ÕâÁ½¸öÄ¿±êµÄÒÀÀµÄ¿±êºÍÉú³ÉÃüÁî¡£

make»áÔÚ×Ô¼ºµÄ¡°Òþº¬¹æÔò¡±¿âÖÐѰÕÒ¿ÉÒÔÓõĹæÔò£¬Èç¹ûÕÒµ½£¬ÄÇô¾Í»áʹÓá£Èç¹ûÕÒ²»µ½£¬ÄÇô¾Í»á±¨´í¡£ÔÚÉÏÃæµÄÄǸöÀý×ÓÖУ¬makeµ÷ÓõÄÒþº¬¹æÔòÊÇ£¬°Ñ[.o]µÄÄ¿±êµÄÒÀÀµÎļþÖóÉ[.c]£¬²¢Ê¹ÓÃCµÄ±àÒëÃüÁî¡°cc ¨Cc $(CFLAGS) [.c]¡±À´Éú³É[.o]µÄÄ¿±ê¡£Ò²¾ÍÊÇ˵£¬ÎÒÃÇÍêȫûÓбØÒªÐ´ÏÂÏÂÃæµÄÁ½Ìõ¹æÔò£º

    foo.o : foo.c
            cc ¨Cc foo.c $(CFLAGS)
    bar.o : bar.c
        cc ¨Cc bar.c $(CFLAGS)

ÒòΪ£¬ÕâÒѾ­ÊÇ¡°Ô¼¶¨¡±ºÃÁ˵ÄÊÂÁË£¬makeºÍÎÒÃÇÔ¼¶¨ºÃÁËÓÃC±àÒëÆ÷¡°cc¡±Éú³É[.o]ÎļþµÄ¹æÔò£¬Õâ¾ÍÊÇÒþº¬¹æÔò¡£

µ±È»£¬Èç¹ûÎÒÃÇΪ[.o]ÎļþÊéдÁË×Ô¼ºµÄ¹æÔò£¬ÄÇômake¾Í²»»á×Ô¶¯ÍƵ¼²¢µ÷ÓÃÒþº¬¹æÔò£¬Ëü»á°´ÕÕÎÒÃÇдºÃµÄ¹æÔòÖÒʵµØÖ´ÐС£

»¹ÓУ¬ÔÚmakeµÄ¡°Òþº¬¹æÔò¿â¡±ÖУ¬Ã¿Ò»ÌõÒþº¬¹æÔò¶¼ÔÚ¿âÖÐÓÐÆä˳Ðò£¬Ô½¿¿Ç°µÄÔòÊÇÔ½±»¾­³£Ê¹Óõģ¬ËùÒÔ£¬Õâ»áµ¼ÖÂÎÒÃÇÓÐЩʱºò¼´Ê¹ÎÒÃÇÏÔʾµØÖ¸¶¨ÁËÄ¿±êÒÀÀµ£¬makeÒ²²»»á¹Ü¡£ÈçÏÂÃæÕâÌõ¹æÔò£¨Ã»ÓÐÃüÁ£º

    foo.o : foo.p

ÒÀÀµÎļþ¡°foo.p¡±£¨Pascal³ÌÐòµÄÔ´Îļþ£©ÓпÉÄܱäµÃûÓÐÒâÒå¡£Èç¹ûĿ¼Ï´æÔÚÁË¡°foo.c¡±Îļþ£¬ÄÇôÎÒÃǵÄÒþº¬¹æÔòÒ»Ñù»áÉúЧ£¬²¢»áͨ¹ý¡°foo.c¡±µ÷ÓÃCµÄ±àÒëÆ÷Éú³Éfoo.oÎļþ¡£ÒòΪ£¬ÔÚÒþº¬¹æÔòÖУ¬PascalµÄ¹æÔò³öÏÖÔÚCµÄ¹æÔòÖ®ºó£¬ËùÒÔ£¬makeÕÒµ½¿ÉÒÔÉú³Éfoo.oµÄCµÄ¹æÔò¾Í²»ÔÙѰÕÒÏÂÒ»Ìõ¹æÔòÁË¡£Èç¹ûÄãȷʵ²»Ï£ÍûÈκÎÒþº¬¹æÔòÍÆµ¼£¬ÄÇô£¬Äã¾Í²»ÒªÖ»Ð´³ö¡°ÒÀÀµ¹æÔò¡±£¬¶ø²»Ð´ÃüÁî¡£


¶þ¡¢Òþº¬¹æÔòÒ»ÀÀ

ÕâÀïÎÒÃǽ«½²ÊöËùÓÐÔ¤ÏÈÉèÖã¨Ò²¾ÍÊÇmakeÄÚ½¨£©µÄÒþº¬¹æÔò£¬Èç¹ûÎÒÃDz»Ã÷È·µØÐ´Ï¹æÔò£¬ÄÇô£¬make¾Í»áÔÚÕâЩ¹æÔòÖÐѰÕÒËùÐèÒª¹æÔòºÍÃüÁî¡£µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔʹÓÃmakeµÄ²ÎÊý¡°-r¡±»ò¡°--no-builtin-rules¡±Ñ¡ÏîÀ´È¡ÏûËùÓеÄÔ¤ÉèÖõÄÒþº¬¹æÔò¡£

µ±È»£¬¼´Ê¹ÊÇÎÒÃÇÖ¸¶¨ÁË¡°-r¡±²ÎÊý£¬Ä³Ð©Òþº¬¹æÔò»¹ÊÇ»áÉúЧ£¬ÒòΪÓÐÐí¶àµÄÒþº¬¹æÔò¶¼ÊÇʹÓÃÁË¡°ºó׺¹æÔò¡±À´¶¨ÒåµÄ£¬ËùÒÔ£¬Ö»ÒªÒþº¬¹æÔòÖÐÓС°ºó׺ÁÐ±í¡±£¨Ò²¾Íһϵͳ¶¨ÒåÔÚÄ¿±ê.SUFFIXESµÄÒÀÀµÄ¿±ê£©£¬ÄÇôÒþº¬¹æÔò¾Í»áÉúЧ¡£Ä¬Èϵĺó׺ÁбíÊÇ£º.out, .a, .ln, .o, .c, .cc, .C, .p, .f, .F, .r, .y, .l, .s, .S, .mod, .sym, .def, .h, .info, .dvi, .tex, .texinfo, .texi, .txinfo, .w, .ch .web, .sh, .elc, .el¡£¾ßÌåµÄϸ½Ú£¬ÎÒÃÇ»áÔÚºóÃæ½²Êö¡£

»¹ÊÇÏÈÀ´¿´Ò»¿´³£ÓõÄÒþº¬¹æÔò°É¡£

1¡¢±àÒëC³ÌÐòµÄÒþº¬¹æÔò¡£
¡°<n>;.o¡±µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.c¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ¡°$(CC) ¨Cc $(CPPFLAGS) $(CFLAGS)¡±

2¡¢±àÒëC++³ÌÐòµÄÒþº¬¹æÔò¡£
¡°<n>;.o¡±µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.cc¡±»òÊÇ¡°<n>;.C¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ¡°$(CXX) ¨Cc $(CPPFLAGS) $(CFLAGS)¡±¡££¨½¨ÒéʹÓá°.cc¡±×÷ΪC++Ô´ÎļþµÄºó׺£¬¶ø²»ÊÇ¡°.C¡±£©

3¡¢±àÒëPascal³ÌÐòµÄÒþº¬¹æÔò¡£
¡°<n>;.o¡±µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.p¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ¡°$(PC) ¨Cc  $(PFLAGS)¡±¡£

4¡¢±àÒëFortran/Ratfor³ÌÐòµÄÒþº¬¹æÔò¡£
¡°<n>;.o¡±µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.r¡±»ò¡°<n>;.F¡±»ò¡°<n>;.f¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ:
    ¡°.f¡±  ¡°$(FC) ¨Cc  $(FFLAGS)¡±
    ¡°.F¡±  ¡°$(FC) ¨Cc  $(FFLAGS) $(CPPFLAGS)¡±
    ¡°.f¡±  ¡°$(FC) ¨Cc  $(FFLAGS) $(RFLAGS)¡±

5¡¢Ô¤´¦ÀíFortran/Ratfor³ÌÐòµÄÒþº¬¹æÔò¡£
¡°<n>;.f¡±µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.r¡±»ò¡°<n>;.F¡±¡£Õâ¸ö¹æÔòÖ»ÊÇת»»Ratfor»òÓÐÔ¤´¦ÀíµÄFortran³ÌÐòµ½Ò»¸ö±ê×¼µÄFortran³ÌÐò¡£ÆäʹÓõÄÃüÁîÊÇ£º
    ¡°.F¡±  ¡°$(FC) ¨CF $(CPPFLAGS) $(FFLAGS)¡±
    ¡°.r¡±  ¡°$(FC) ¨CF $(FFLAGS) $(RFLAGS)¡±

6¡¢±àÒëModula-2³ÌÐòµÄÒþº¬¹æÔò¡£
¡°<n>;.sym¡±µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.def¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ£º¡°$(M2C) $(M2FLAGS) $(DEFFLAGS)¡±¡£¡°<n.o>;¡± µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.mod¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ£º¡°$(M2C) $(M2FLAGS) $(MODFLAGS)¡±¡£

7¡¢»ã±àºÍ»ã±àÔ¤´¦ÀíµÄÒþº¬¹æÔò¡£
¡°<n>;.o¡± µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.s¡±£¬Ä¬ÈÏʹÓñàÒëÆ·¡°as¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ£º¡°$(AS) $(ASFLAGS)¡±¡£¡°<n>;.s¡± µÄÄ¿±êµÄÒÀÀµÄ¿±ê»á×Ô¶¯ÍƵ¼Îª¡°<n>;.S¡±£¬Ä¬ÈÏʹÓÃCÔ¤±àÒëÆ÷¡°cpp¡±£¬²¢ÇÒÆäÉú³ÉÃüÁîÊÇ£º¡°$(AS) $(ASFLAGS)¡±¡£

8¡¢Á´½ÓObjectÎļþµÄÒþº¬¹æÔò¡£
¡°<n>;¡±Ä¿±êÒÀÀµÓÚ¡°<n>;.o¡±£¬Í¨¹ýÔËÐÐCµÄ±àÒëÆ÷À´ÔËÐÐÁ´½Ó³ÌÐòÉú³É£¨Ò»°ãÊÇ¡°ld¡±£©£¬ÆäÉú³ÉÃüÁîÊÇ£º¡°$(CC) $(LDFLAGS) <n>;.o $(LOADLIBES) $(LDLIBS)¡±¡£Õâ¸ö¹æÔò¶ÔÓÚÖ»ÓÐÒ»¸öÔ´ÎļþµÄ¹¤³ÌÓÐЧ£¬Í¬Ê±Ò²¶Ô¶à¸öObjectÎļþ£¨Óɲ»Í¬µÄÔ´ÎļþÉú³É£©µÄÒ²ÓÐЧ¡£ÀýÈçÈçϹæÔò£º

    x : y.o z.o

²¢ÇÒ¡°x.c¡±¡¢¡°y.c¡±ºÍ¡°z.c¡±¶¼´æÔÚʱ£¬Òþº¬¹æÔò½«Ö´ÐÐÈçÏÂÃüÁ

    cc -c x.c -o x.o
    cc -c y.c -o y.o
    cc -c z.c -o z.o
    cc x.o y.o z.o -o x
    rm -f x.o
    rm -f y.o
    rm -f z.o

Èç¹ûûÓÐÒ»¸öÔ´Îļþ£¨ÈçÉÏÀýÖеÄx.c£©ºÍÄãµÄÄ¿±êÃû×Ö£¨ÈçÉÏÀýÖеÄx£©Ïà¹ØÁª£¬ÄÇô£¬Äã×îºÃд³ö×Ô¼ºµÄÉú³É¹æÔò£¬²»È»£¬Òþº¬¹æÔò»á±¨´íµÄ¡£

9¡¢Yacc C³ÌÐòʱµÄÒþº¬¹æÔò¡£
¡°<n>;.c¡±µÄÒÀÀµÎļþ±»×Ô¶¯ÍƵ¼Îª¡°n.y¡±£¨YaccÉú³ÉµÄÎļþ£©£¬ÆäÉú³ÉÃüÁîÊÇ£º¡°$(YACC) $(YFALGS)¡±¡££¨¡°Yacc¡±ÊÇÒ»¸öÓï·¨·ÖÎöÆ÷£¬¹ØÓÚÆäϸ½ÚÇë²é¿´Ïà¹Ø×ÊÁÏ£©

10¡¢Lex C³ÌÐòʱµÄÒþº¬¹æÔò¡£
¡°<n>;.c¡±µÄÒÀÀµÎļþ±»×Ô¶¯ÍƵ¼Îª¡°n.l¡±£¨LexÉú³ÉµÄÎļþ£©£¬ÆäÉú³ÉÃüÁîÊÇ£º¡°$(LEX) $(LFALGS)¡±¡££¨¹ØÓÚ¡°Lex¡±µÄϸ½ÚÇë²é¿´Ïà¹Ø×ÊÁÏ£©

11¡¢Lex Ratfor³ÌÐòʱµÄÒþº¬¹æÔò¡£
¡°<n>;.r¡±µÄÒÀÀµÎļþ±»×Ô¶¯ÍƵ¼Îª¡°n.l¡±£¨LexÉú³ÉµÄÎļþ£©£¬ÆäÉú³ÉÃüÁîÊÇ£º¡°$(LEX) $(LFALGS)¡±¡£

12¡¢´ÓC³ÌÐò¡¢YaccÎļþ»òLexÎļþ´´½¨Lint¿âµÄÒþº¬¹æÔò¡£
¡°<n>;.ln¡± £¨lintÉú³ÉµÄÎļþ£©µÄÒÀÀµÎļþ±»×Ô¶¯ÍƵ¼Îª¡°n.c¡±£¬ÆäÉú³ÉÃüÁîÊÇ£º¡°$(LINT) $(LINTFALGS) $(CPPFLAGS) -i¡±¡£¶ÔÓÚ¡°<n>;.y¡±ºÍ¡°<n>;.l¡±Ò²ÊÇͬÑùµÄ¹æÔò¡£


Èý¡¢Òþº¬¹æÔòʹÓõıäÁ¿

ÔÚÒþº¬¹æÔòÖеÄÃüÁîÖУ¬»ù±¾É϶¼ÊÇʹÓÃÁËһЩԤÏÈÉèÖõıäÁ¿¡£Äã¿ÉÒÔÔÚÄãµÄmakefileÖиıäÕâЩ±äÁ¿µÄÖµ£¬»òÊÇÔÚmakeµÄÃüÁîÐÐÖд«ÈëÕâЩֵ£¬»òÊÇÔÚÄãµÄ»·¾³±äÁ¿ÖÐÉèÖÃÕâЩֵ£¬ÎÞÂÛÔõôÑù£¬Ö»ÒªÉèÖÃÁËÕâÐ©ÌØ¶¨µÄ±äÁ¿£¬ÄÇôÆä¾Í»á¶ÔÒþº¬¹æÔòÆð×÷Óᣵ±È»£¬ÄãÒ²¿ÉÒÔÀûÓÃmakeµÄ¡°-R¡±»ò¡°--no¨Cbuiltin-variables¡±²ÎÊýÀ´È¡ÏûÄãËù¶¨ÒåµÄ±äÁ¿¶ÔÒþº¬¹æÔòµÄ×÷Óá£

ÀýÈ磬µÚÒ»ÌõÒþº¬¹æÔò¡ª¡ª±àÒëC³ÌÐòµÄÒþº¬¹æÔòµÄÃüÁîÊÇ¡°$(CC) ¨Cc $(CFLAGS) $(CPPFLAGS)¡±¡£MakeĬÈϵıàÒëÃüÁîÊÇ¡°cc¡±£¬Èç¹ûÄã°Ñ±äÁ¿¡°$(CC)¡±Öض¨Òå³É¡°gcc¡±£¬°Ñ±äÁ¿¡°$(CFLAGS)¡±Öض¨Òå³É¡°-g¡±£¬ÄÇô£¬Òþº¬¹æÔòÖеÄÃüÁîÈ«²¿»áÒÔ¡°gcc ¨Cc -g $(CPPFLAGS)¡±µÄÑù×ÓÀ´Ö´ÐÐÁË¡£

ÎÒÃÇ¿ÉÒÔ°ÑÒþº¬¹æÔòÖÐʹÓõıäÁ¿·Ö³ÉÁ½ÖÖ£ºÒ»ÖÖÊÇÃüÁîÏà¹ØµÄ£¬Èç¡°CC¡±£»Ò»ÖÖÊDzÎÊýÏàµÄ¹Ø£¬Èç¡°CFLAGS¡±¡£ÏÂÃæÊÇËùÓÐÒþº¬¹æÔòÖлáÓõ½µÄ±äÁ¿£º

1¡¢¹ØÓÚÃüÁîµÄ±äÁ¿¡£

AR 
    º¯Êý¿â´ò°ü³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°ar¡±¡£ 
AS 
    »ã±àÓïÑÔ±àÒë³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°as¡±¡£
CC 
    CÓïÑÔ±àÒë³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°cc¡±¡£
CXX 
    C++ÓïÑÔ±àÒë³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°g++¡±¡£
CO 
    ´Ó RCSÎļþÖÐÀ©Õ¹Îļþ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°co¡±¡£
CPP 
    C³ÌÐòµÄÔ¤´¦ÀíÆ÷£¨Êä³öÊDZê×¼Êä³öÉ豸£©¡£Ä¬ÈÏÃüÁîÊÇ¡°$(CC) ¨CE¡±¡£
FC 
    Fortran ºÍ Ratfor µÄ±àÒëÆ÷ºÍÔ¤´¦Àí³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°f77¡±¡£
GET 
    ´ÓSCCSÎļþÖÐÀ©Õ¹ÎļþµÄ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°get¡±¡£ 
LEX 
    Lex·½·¨·ÖÎöÆ÷³ÌÐò£¨Õë¶ÔÓÚC»òRatfor£©¡£Ä¬ÈÏÃüÁîÊÇ¡°lex¡±¡£
PC 
    PascalÓïÑÔ±àÒë³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°pc¡±¡£
YACC 
    YaccÎÄ·¨·ÖÎöÆ÷£¨Õë¶ÔÓÚC³ÌÐò£©¡£Ä¬ÈÏÃüÁîÊÇ¡°yacc¡±¡£
YACCR 
    YaccÎÄ·¨·ÖÎöÆ÷£¨Õë¶ÔÓÚRatfor³ÌÐò£©¡£Ä¬ÈÏÃüÁîÊÇ¡°yacc ¨Cr¡±¡£
MAKEINFO 
    ת»»TexinfoÔ´Îļþ£¨.texi£©µ½InfoÎļþ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°makeinfo¡±¡£
TEX 
    ´ÓTeXÔ´Îļþ´´½¨TeX DVIÎļþµÄ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°tex¡±¡£
TEXI2DVI 
    ´ÓTexinfoÔ´Îļþ´´½¨¾üTeX DVI ÎļþµÄ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°texi2dvi¡±¡£
WEAVE 
    ת»»Webµ½TeXµÄ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°weave¡±¡£
CWEAVE 
    ת»»C Web µ½ TeXµÄ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°cweave¡±¡£
TANGLE 
    ת»»Webµ½PascalÓïÑԵijÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°tangle¡±¡£
CTANGLE 
    ת»»C Web µ½ C¡£Ä¬ÈÏÃüÁîÊÇ¡°ctangle¡±¡£
RM 
    ɾ³ýÎļþÃüÁĬÈÏÃüÁîÊÇ¡°rm ¨Cf¡±¡£

2¡¢¹ØÓÚÃüÁî²ÎÊýµÄ±äÁ¿

ÏÂÃæµÄÕâЩ±äÁ¿¶¼ÊÇÏà¹ØÉÏÃæµÄÃüÁîµÄ²ÎÊý¡£Èç¹ûûÓÐÖ¸Ã÷ÆäĬÈÏÖµ£¬ÄÇôÆäĬÈÏÖµ¶¼Êǿա£

ARFLAGS 
    º¯Êý¿â´ò°ü³ÌÐòARÃüÁîµÄ²ÎÊý¡£Ä¬ÈÏÖµÊÇ¡°rv¡±¡£
ASFLAGS 
    »ã±àÓïÑÔ±àÒëÆ÷²ÎÊý¡££¨µ±Ã÷ÏԵص÷Óá°.s¡±»ò¡°.S¡±Îļþʱ£©¡£ 
CFLAGS 
    CÓïÑÔ±àÒëÆ÷²ÎÊý¡£
CXXFLAGS 
    C++ÓïÑÔ±àÒëÆ÷²ÎÊý¡£
COFLAGS 
    RCSÃüÁî²ÎÊý¡£ 
CPPFLAGS 
    CÔ¤´¦ÀíÆ÷²ÎÊý¡££¨ C ºÍ Fortran ±àÒëÆ÷Ò²»áÓõ½£©¡£
FFLAGS 
    FortranÓïÑÔ±àÒëÆ÷²ÎÊý¡£
GFLAGS 
    SCCS ¡°get¡±³ÌÐò²ÎÊý¡£
LDFLAGS 
    Á´½ÓÆ÷²ÎÊý¡££¨È磺¡°ld¡±£©
LFLAGS 
    LexÎÄ·¨·ÖÎöÆ÷²ÎÊý¡£
PFLAGS 
    PascalÓïÑÔ±àÒëÆ÷²ÎÊý¡£
RFLAGS 
    Ratfor ³ÌÐòµÄFortran ±àÒëÆ÷²ÎÊý¡£
YFLAGS 
    YaccÎÄ·¨·ÖÎöÆ÷²ÎÊý¡£ 


ËÄ¡¢Òþº¬¹æÔòÁ´

ÓÐЩʱºò£¬Ò»¸öÄ¿±ê¿ÉÄܱ»Ò»ÏµÁеÄÒþº¬¹æÔòËù×÷Óá£ÀýÈ磬һ¸ö[.o]µÄÎļþÉú³É£¬¿ÉÄÜ»áÊÇÏȱ»YaccµÄ[.y]ÎļþÏȳÉ[.c]£¬È»ºóÔÙ±»CµÄ±àÒëÆ÷Éú³É¡£ÎÒÃǰÑÕâһϵÁеÄÒþº¬¹æÔò½Ð×ö¡°Òþº¬¹æÔòÁ´¡±¡£

ÔÚÉÏÃæµÄÀý×ÓÖУ¬Èç¹ûÎļþ[.c]´æÔÚ£¬ÄÇô¾ÍÖ±½Óµ÷ÓÃCµÄ±àÒëÆ÷µÄÒþº¬¹æÔò£¬Èç¹ûûÓÐ[.c]Îļþ£¬µ«ÓÐÒ»¸ö[.y]Îļþ£¬ÄÇôYaccµÄÒþº¬¹æÔò»á±»µ÷Óã¬Éú³É[.c]Îļþ£¬È»ºó£¬ÔÙµ÷ÓÃC±àÒëµÄÒþº¬¹æÔò×îÖÕÓÉ[.c]Éú³É[.o]Îļþ£¬´ïµ½Ä¿±ê¡£

ÎÒÃǰÑÕâÖÖ[.c]µÄÎļþ£¨»òÊÇÄ¿±ê£©£¬½Ð×öÖмäÄ¿±ê¡£²»¹ÜÔõôÑù£¬make»áŬÁ¦×Ô¶¯ÍƵ¼Éú³ÉÄ¿±êµÄÒ»Çз½·¨£¬²»¹ÜÖмäÄ¿±êÓжàÉÙ£¬Æä¶¼»áÖ´×ŵذÑËùÓеÄÒþº¬¹æÔòºÍÄãÊéдµÄ¹æÔòÈ«²¿ºÏÆðÀ´·ÖÎö£¬Å¬Á¦´ïµ½Ä¿±ê£¬ËùÒÔ£¬ÓÐЩʱºò£¬¿ÉÄÜ»áÈÃÄã¾õµÃÆæ¹Ö£¬ÔõôÎÒµÄÄ¿±ê»áÕâÑùÉú³É£¿ÔõôÎÒµÄmakefile·¢·èÁË£¿

ÔÚĬÈÏÇé¿öÏ£¬¶ÔÓÚÖмäÄ¿±ê£¬ËüºÍÒ»°ãµÄÄ