¸ÅÊö
¡ª¡ª
ʲôÊÇ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·¢·èÁË£¿
ÔÚĬÈÏÇé¿öÏ£¬¶ÔÓÚÖмäÄ¿±ê£¬ËüºÍÒ»°ãµÄÄ