±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜÁËMakefile,ÒÔ¼°ËüµÄʹÓùæÔò¡¢ÈçºÎ¹¤×÷¡¢×Ô¶¯ÍƵ¼ÒÔ¼°±äÁ¿Ê¹ÓõÈÏà¹ØÖªÊ¶¡£ |
|
Makefile
ÖµµÃÒ»ÌáµÄÊÇ£¬ÔÚMakefileÖеÄÃüÁ±ØÐëÒªÒÔ[Tab]¼ü¿ªÊ¼¡£
ʲôÊÇ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¶¼³ÉΪÁËÒ»ÖÖÔÚ¹¤³Ì·½ÃæµÄ±àÒë·½·¨¡£
ÔÚÕâÆªÎĵµÖУ¬½«ÒÔC/C++µÄÔ´Âë×÷ΪÎÒÃÇ»ù´¡£¬ËùÒÔ±ØÈ»É漰һЩ¹ØÓÚC/C++µÄ±àÒëµÄ֪ʶ£¬Ïà¹ØÓÚÕâ·½ÃæµÄÄÚÈÝ£¬»¹Çë¸÷λ²é¿´Ïà¹ØµÄ±àÒëÆ÷µÄÎĵµ¡£ÕâÀïËùĬÈϵıàÒëÆ÷ÊÇUNIXϵÄGCCºÍCC¡£
1 ¹ØÓÚ³ÌÐòµÄ±àÒëºÍÁ´½Ó
ÔÚ´Ë£¬ÎÒÏë¶à˵¹ØÓÚ³ÌÐò±àÒëµÄһЩ¹æ·¶ºÍ·½·¨£¬Ò»°ãÀ´Ëµ£¬ÎÞÂÛÊÇC¡¢C++¡¢»¹ÊÇpas£¬Ê×ÏÈÒª°ÑÔ´Îļþ±àÒë³ÉÖмä´úÂëÎļþ£¬ÔÚWindowsÏÂÒ²¾ÍÊÇ.objÎļþ£¬UNIXÏÂÊÇ.oÎļþ£¬¼´Object
File£¬Õâ¸ö¶¯×÷½Ð×ö±àÒ루compile£©¡£È»ºóÔÙ°Ñ´óÁ¿µÄObject FileºÏ³ÉÖ´ÐÐÎļþ£¬Õâ¸ö¶¯×÷½Ð×÷Á´½Ó£¨link£©¡£
±àÒëʱ£¬±àÒëÆ÷ÐèÒªµÄÊÇÓï·¨µÄÕýÈ·£¬º¯ÊýÓë±äÁ¿µÄÉùÃ÷µÄÕýÈ·¡£¶ÔÓÚºóÕߣ¬Í¨³£ÊÇÄãÐèÒª¸æËß±àÒëÆ÷Í·ÎļþµÄËùÔÚλÖã¨Í·ÎļþÖÐÓ¦¸ÃÖ»ÊÇÉùÃ÷£¬¶ø¶¨ÒåÓ¦¸Ã·ÅÔÚC/C++ÎļþÖУ©£¬Ö»ÒªËùÓеÄÓï·¨ÕýÈ·£¬±àÒëÆ÷¾Í¿ÉÒÔ±àÒë³öÖмäÄ¿±êÎļþ¡£Ò»°ãÀ´Ëµ£¬Ã¿¸öÔ´Îļþ¶¼Ó¦¸Ã¶ÔÓ¦ÓÚÒ»¸öÖмäÄ¿±êÎļþ£¨OÎļþ»òÊÇOBJÎļþ£©¡£
Á´½Óʱ£¬Ö÷ÒªÊÇÁ´½Óº¯ÊýºÍÈ«¾Ö±äÁ¿£¬ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÕâЩÖмäÄ¿±êÎļþ£¨OÎļþ»òÊÇOBJÎļþ£©À´Á´½ÓÎÒÃǵÄÓ¦ÓóÌÐò¡£Á´½ÓÆ÷²¢²»¹Üº¯ÊýËùÔÚµÄÔ´Îļþ£¬Ö»¹Üº¯ÊýµÄÖмäÄ¿±êÎļþ£¨Object
File£©£¬ÔÚ´ó¶àÊýʱºò£¬ÓÉÓÚÔ´ÎļþÌ«¶à£¬±àÒëÉú³ÉµÄÖмäÄ¿±êÎļþÌ«¶à£¬¶øÔÚÁ´½ÓʱÐèÒªÃ÷ÏÔµØÖ¸³öÖмäÄ¿±êÎļþÃû£¬Õâ¶ÔÓÚ±àÒëºÜ²»·½±ã£¬ËùÒÔ£¬ÎÒÃÇÒª¸øÖмäÄ¿±êÎļþ´ò¸ö°ü£¬ÔÚWindowsÏÂÕâÖÖ°ü½Ð¡°¿âÎļþ¡±£¨LibraryFile)£¬Ò²¾ÍÊÇ
.libÎļþ£¬ÔÚUNIXÏ£¬ÊÇArchive File£¬Ò²¾ÍÊÇ .aÎļþ¡£
×ܽáһϣ¬Ô´ÎļþÊ×ÏÈ»áÉú³ÉÖмäÄ¿±êÎļþ£¬ÔÙÓÉÖмäÄ¿±êÎļþÉú³ÉÖ´ÐÐÎļþ¡£ÔÚ±àÒëʱ£¬±àÒëÆ÷Ö»¼ì²â³ÌÐòÓï·¨£¬ºÍº¯Êý¡¢±äÁ¿ÊÇ·ñ±»ÉùÃ÷¡£Èç¹ûº¯Êýδ±»ÉùÃ÷£¬±àÒëÆ÷»á¸ø³öÒ»¸ö¾¯¸æ£¬µ«¿ÉÒÔÉú³ÉObject
File¡£¶øÔÚÁ´½Ó³ÌÐòʱ£¬Á´½ÓÆ÷»áÔÚËùÓеÄObject FileÖÐÕÒѰº¯ÊýµÄʵÏÖ£¬Èç¹ûÕÒ²»µ½£¬Äǵ½¾Í»á±¨Á´½Ó´íÎóÂ루Linker
Error£©£¬ÔÚVCÏ£¬ÕâÖÖ´íÎóÒ»°ãÊÇ£ºLink 2001´íÎó£¬Òâ˼˵ÊÇ˵£¬Á´½ÓÆ÷δÄÜÕÒµ½º¯ÊýµÄʵÏÖ¡£ÄãÐèÒªÖ¸¶¨º¯ÊýµÄObjectFile.
ºÃ£¬ÑÔ¹éÕý´«£¬GNUµÄmakeÓÐÐí¶àµÄÄÚÈÝ£¬ÏÐÑÔÉÙÐ𣬻¹ÊÇÈÃÎÒÃÇ¿ªÊ¼°É¡£
1 Makefile ½éÉÜ
makeÃüÁîÖ´ÐÐʱ£¬ÐèÒªÒ»¸ö MakefileÎļþ£¬ÒÔ¸æËßmakeÃüÁîÐèÒªÔõôÑùµÄÈ¥±àÒëºÍÁ´½Ó³ÌÐò¡£
Ê×ÏÈ£¬ÎÒÃÇÓÃÒ»¸öʾÀýÀ´ËµÃ÷MakefileµÄÊéд¹æÔò¡£ÒÔ±ã¸ø´ó¼ÒÒ»¸ö¸ÐÐËÈÏʶ¡£Õâ¸öʾÀýÀ´Ô´ÓÚGNUµÄmakeʹÓÃÊֲᣬÔÚÕâ¸öʾÀýÖУ¬ÎÒÃǵŤ³ÌÓÐ8¸öCÎļþ£¬ºÍ3¸öÍ·Îļþ£¬ÎÒÃÇҪдһ¸öMakefileÀ´¸æËßmakeÃüÁîÈçºÎ±àÒëºÍÁ´½ÓÕ⼸¸öÎļþ¡£ÎÒÃǵĹæÔòÊÇ£º
1.Èç¹ûÕâ¸ö¹¤³ÌûÓбàÒë¹ý£¬ÄÇôÎÒÃǵÄËùÓÐCÎļþ¶¼Òª±àÒë²¢±»Á´½Ó¡£
2.Èç¹ûÕâ¸ö¹¤³ÌµÄij¼¸¸öCÎļþ±»Ð޸ģ¬ÄÇôÎÒÃÇÖ»±àÒë±»Ð޸ĵÄCÎļþ£¬²¢Á´½ÓÄ¿±ê³ÌÐò¡£
3.Èç¹ûÕâ¸ö¹¤³ÌµÄÍ·Îļþ±»¸Ä±äÁË£¬ÄÇôÎÒÃÇÐèÒª±àÒëÒýÓÃÁËÕ⼸¸öÍ·ÎļþµÄCÎļþ£¬²¢Á´½ÓÄ¿±ê³ÌÐò¡£
Ö»ÒªÎÒÃǵÄMakefileдµÃ¹»ºÃ£¬ËùÓеÄÕâÒ»ÇУ¬ÎÒÃÇÖ»ÓÃÒ»¸ömakeÃüÁî¾Í¿ÉÒÔÍê³É£¬makeÃüÁî»á×Ô¶¯ÖÇÄܵظù¾Ýµ±Ç°µÄÎļþÐ޸ĵÄÇé¿öÀ´È·¶¨ÄÄЩÎļþÐèÒªÖØ±àÒ룬´Ó¶ø×Ô¼º±àÒëËùÐèÒªµÄÎļþºÍÁ´½ÓÄ¿±ê³ÌÐò¡£
1.1 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»¹²»¹»£¬ÎÒ»áÒÔºóÃæÒ»µãÒ»µãµØ½áºÏÎҵŤ×÷¾Ñ鏸ÄãÂýÂýµ½À´¡£ÄÚÈÝ»¹¶à×ÅÄØ¡££©
1.2 Ò»¸öʾÀý
ÕýÈçÇ°ÃæËù˵µÄ£¬Èç¹ûÒ»¸ö¹¤³ÌÓÐ3¸öÍ·Îļþ£¬ºÍ8¸öCÎļþ£¬ÎÒÃÇΪÁËÍê³ÉÇ°ÃæËùÊöµÄÄÇÈý¸ö¹æÔò£¬ÎÒÃǵÄMakefileÓ¦¸ÃÊÇÏÂÃæµÄÕâ¸öÑù×ӵġ£
edit : main.o
kbd.o command.o display.o insert.osearch.o files.o
utils.o
cc-o edit main.o kbd.o command.o display.o
insert.o search.o files.outils.o
main.o : main.c defs.h
cc-c main.c
kbd.o : kbd.c defs.hcommand.h
cc-c kbd.c
command.o : command.cdefs.h command.h
cc-c command.c
display.o : display.cdefs.h buffer.h
cc-c display.c
insert.o : insert.cdefs.h buffer.h
cc-c insert.c
search.o : search.cdefs.h buffer.h
cc-c search.c
files.o : files.c defs.hbuffer.h command.h
cc-c files.c
utils.o : utils.c defs.h
cc-c utils.c
clean :
rmedit 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Öж¨Òå²»ÓõıàÒë»òÊǺͱàÒëÎ޹صÄÃüÁ±ÈÈç³ÌÐòµÄ´ò°ü£¬³ÌÐòµÄ±¸·Ý£¬µÈµÈ¡£
1.3 makeÊÇÈçºÎ¹¤×÷µÄ
ÔÚĬÈϵķ½Ê½Ï£¬Ò²¾ÍÊÇÎÒÃÇÖ»ÊäÈëmakeÃüÁî¡£ÄÇô£¬
make»áÔÚµ±Ç°Ä¿Â¼ÏÂÕÒÃû×ֽС°Makefile¡±»ò¡°makefile¡±µÄÎļþ¡£
Èç¹ûÕÒµ½£¬Ëü»áÕÒÎļþÖеĵÚÒ»¸öÄ¿±êÎļþ£¨target£©£¬ÔÚÉÏÃæµÄÀý×ÓÖУ¬Ëû»áÕÒµ½¡°edit¡±Õâ¸öÎļþ£¬²¢°ÑÕâ¸öÎļþ×÷Ϊ×îÖÕµÄÄ¿±êÎļþ¡£
Èç¹ûeditÎļþ²»´æÔÚ£¬»òÊÇeditËùÒÀÀµµÄºóÃæµÄ .o ÎļþµÄÎļþÐÞ¸Äʱ¼äÒª±ÈeditÕâ¸öÎļþУ¬ÄÇô£¬Ëû¾Í»áÖ´ÐкóÃæËù¶¨ÒåµÄÃüÁîÀ´Éú³ÉeditÕâ¸öÎļþ¡£
Èç¹ûeditËùÒÀÀµµÄ.oÎļþÒ²´æÔÚ£¬ÄÇômake»áÔÚµ±Ç°ÎļþÖÐÕÒÄ¿±êΪ.oÎļþµÄÒÀÀµÐÔ£¬Èç¹ûÕÒµ½ÔòÔÙ¸ù¾ÝÄÇÒ»¸ö¹æÔòÉú³É.oÎļþ¡££¨ÕâÓеãÏñÒ»¸ö¶ÑÕ»µÄ¹ý³Ì£©
µ±È»£¬ÄãµÄ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»á±»ÖØÁ´½Ó¡£
1.4 makefileÖÐʹÓñäÁ¿
ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÏÈÈÃÎÒÃÇ¿´¿´editµÄ¹æÔò£º
edit : main.okbd.o command.o display.o insert.o
search.o files.o utils.o
cc -o edit main.okbd.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.okbd.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.osearch.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:
rmedit $(objects) |
ÓÚÊÇÈç¹ûÓÐÐ嵀 .o Îļþ¼ÓÈ룬ÎÒÃÇÖ»Ðè¼òµ¥µØÐÞ¸ÄÒ»ÏÂobjects ±äÁ¿¾Í¿ÉÒÔÁË¡£
¹ØÓÚ±äÁ¿¸ü¶àµÄ»°Ì⣬ÎÒ»áÔÚºóÐø¸øÄãÒ»Ò»µÀÀ´¡£
1.5 ÈÃ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:
rmedit $(objects) |
ÕâÖÖ·½·¨£¬Ò²¾ÍÊÇmakeµÄ¡°Òþ»Þ¹æÔò¡±¡£ÉÏÃæÎļþÄÚÈÝÖУ¬¡°.PHONY¡±±íʾ£¬cleanÊǸöαĿ±êÎļþ¡£
¹ØÓÚ¸üΪÏêϸµÄ¡°Òþ»Þ¹æÔò¡±ºÍ¡°Î±Ä¿±êÎļþ¡±£¬ÎÒ»áÔÚºóÐø¸øÄãÒ»Ò»µÀÀ´¡£
1.6 ÁíÀà·ç¸ñµÄ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.ocommand.o files.o : command.h
display.oinsert.o search.o files.o : buffer.h
.PHONY : clean //¡°.PHONY¡±±íʾ£¬cleanÊǸöαĿ±êÎļþ
clean:
rmedit $(objects) |
ÕâÖÖ·ç¸ñ£¬ÈÃÎÒÃǵÄmakefile±äµÃºÜ¼òµ¥£¬µ«ÎÒÃǵÄÎļþÒÀÀµ¹ØÏµ¾ÍÏÔµÃÓеãÁèÂÒÁË¡£ÓãºÍÐÜÕÆ²»¿É¼æµÃ¡£»¹¿´ÄãµÄϲºÃÁË¡£ÎÒÊDz»Ï²»¶ÕâÖÖ·ç¸ñµÄ£¬Ò»ÊÇÎļþµÄÒÀÀµ¹ØÏµ¿´²»Çå³þ£¬¶þÊÇÈç¹ûÎļþÒ»¶à£¬Òª¼ÓÈ뼸¸öеÄ.oÎļþ£¬ÄǾÍÀí²»Çå³þÁË¡£
1.7 Çå¿ÕÄ¿±êÎļþµÄ¹æÔò
ÿ¸öMakefileÖж¼Ó¦¸Ãдһ¸öÇå¿ÕÄ¿±êÎļþ£¨.oºÍÖ´ÐÐÎļþ£©µÄ¹æÔò£¬Õâ²»½ö±ãÓÚÖØ±àÒ룬ҲºÜÀûÓÚ±£³ÖÎļþµÄÇå½à¡£ÕâÊÇÒ»¸ö¡°ÐÞÑø¡±£¨ºÇºÇ£¬»¹¼ÇµÃÎҵġ¶±à³ÌÐÞÑø¡·Â𣩡£Ò»°ãµÄ·ç¸ñ¶¼ÊÇ£º
clean:
rmedit $(objects)
¸üΪÎȽ¡µÄ×ö·¨ÊÇ£º
.PHONY : clean
clean:
-rmedit $(objects)
Ç°ÃæËµ¹ý£¬.PHONYÒâ˼±íʾcleanÊÇÒ»¸ö¡°Î±Ä¿±ê¡±¡£¶øÔÚrmÃüÁîÇ°Ãæ¼ÓÁËÒ»¸öС¼õºÅµÄÒâ˼¾ÍÊÇ£¬Ò²ÐíijЩÎļþ³öÏÖÎÊÌ⣬µ«²»Òª¹Ü£¬¼ÌÐø×öºóÃæµÄÊ¡£µ±È»£¬cleanµÄ¹æÔò²»Òª·ÅÔÚÎļþµÄ¿ªÍ·£¬²»È»£¬Õâ¾Í»á±ä³ÉmakeµÄĬÈÏÄ¿±ê£¬ÏàÐÅËÒ²²»Ô¸ÒâÕâÑù¡£²»³ÉÎÄµÄ¹æ¾ØÊÇ¡ª¡ª¡°clean´ÓÀ´¶¼ÊÇ·ÅÔÚÎļþµÄ×îºó¡±¡£
ÉÏÃæ¾ÍÊÇÒ»¸ömakefileµÄ¸Åò£¬Ò²ÊÇmakefileµÄ»ù´¡£¬ÏÂÃæ»¹ÓкܶàmakefileµÄÏà¹ØÏ¸½Ú£¬×¼±¸ºÃÁËÂð£¿×¼±¸ºÃÁ˾ÍÀ´¡£
2 Makefile ×ÜÊö
2.1 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]¼ü¿ªÊ¼¡£
2.2MakefileµÄÎļþÃû
ĬÈϵÄÇé¿öÏ£¬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¡£
2.3 ÒýÓÃÆäËüµÄMakefile
ÔÚMakefileʹÓÃinclude¹Ø¼ü×Ö¿ÉÒ԰ѱðµÄMakefile°üº¬½øÀ´£¬ÕâºÜÏñCÓïÑÔµÄ#include£¬±»°üº¬µÄÎļþ»áÔÄ£ÔÑùµÄ·ÅÔÚµ±Ç°ÎļþµÄ°üº¬Î»Öá£includeµÄÓï·¨ÊÇ£º
include<filename>filename¿ÉÒÔÊǵ±Ç°²Ù×÷ϵͳShellµÄÎļþģʽ£¨¿ÉÒÔ±£º¬Â·¾¶ºÍͨÅä·û£©
ÔÚincludeÇ°Ãæ¿ÉÒÔÓÐһЩ¿Õ×Ö·û£¬µ«ÊǾø²»ÄÜÊÇ[Tab]¼ü¿ªÊ¼¡£includeºÍ¿ÉÒÔÓÃÒ»¸ö»ò¶à¸ö¿Õ¸ñ¸ô¿ª¡£¾Ù¸öÀý×Ó£¬ÄãÓÐÕâÑù¼¸¸öMakefile£ºa.mk¡¢b.mk¡¢c.mk£¬»¹ÓÐÒ»¸öÎļþ½Ðfoo.make£¬ÒÔ¼°Ò»¸ö±äÁ¿$(bar)£¬Æä°üº¬ÁËe.mkºÍf.mk£¬ÄÇô£¬ÏÂÃæµÄÓï¾ä£º
include foo.make *.mk$(bar)
µÈ¼ÛÓÚ£º
include foo.make a.mkb.mk c.mk e.mk f.mk
makeÃüÁʼʱ£¬»á°ÑÕÒѰincludeËùÖ¸³öµÄÆäËüMakefile£¬²¢°ÑÆäÄÚÈݰ²ÖÃÔÚµ±Ç°µÄλÖ᣾ͺÃÏñC/C++µÄ#includeÖ¸ÁîÒ»Ñù¡£Èç¹ûÎļþ¶¼Ã»ÓÐÖ¸¶¨¾ø¶Ô·¾¶»òÊÇÏà¶Ô·¾¶µÄ»°£¬make»áÔÚµ±Ç°Ä¿Â¼ÏÂÊ×ÏÈѰÕÒ£¬Èç¹ûµ±Ç°Ä¿Â¼ÏÂûÓÐÕÒµ½£¬ÄÇô£¬make»¹»áÔÚÏÂÃæµÄ¼¸¸öĿ¼ÏÂÕÒ£º
1.Èç¹ûmakeÖ´ÐÐʱ£¬ÓС°-I¡±»ò¡°--include-dir¡±²ÎÊý£¬ÄÇômake¾Í»áÔÚÕâ¸ö²ÎÊýËùÖ¸¶¨µÄĿ¼ÏÂȥѰÕÒ¡£
2.Èç¹ûĿ¼/include£¨Ò»°ãÊÇ£º/usr/local/bin»ò/usr/include£©´æÔڵϰ£¬makeÒ²»áÈ¥ÕÒ¡£
Èç¹ûÓÐÎļþûÓÐÕÒµ½µÄ»°£¬make»áÉú³ÉÒ»Ìõ¾¯¸æÐÅÏ¢£¬µ«²»»áÂíÉϳöÏÖÖÂÃü´íÎó¡£Ëü»á¼ÌÐøÔØÈëÆäËüµÄÎļþ£¬Ò»µ©Íê³ÉmakefileµÄ¶ÁÈ¡£¬make»áÔÙÖØÊÔÕâЩûÓÐÕÒµ½£¬»òÊDz»ÄܶÁÈ¡µÄÎļþ£¬Èç¹û»¹ÊDz»ÐУ¬make²Å»á³öÏÖÒ»ÌõÖÂÃüÐÅÏ¢¡£Èç¹ûÄãÏëÈÃmake²»ÀíÄÇЩÎÞ·¨¶ÁÈ¡µÄÎļþ£¬¶ø¼ÌÐøÖ´ÐУ¬Äã¿ÉÒÔÔÚincludeǰ¼ÓÒ»¸ö¼õºÅ¡°-¡±¡£È磺
-include<filename>
Æä±íʾ£¬ÎÞÂÛinclude¹ý³ÌÖгöÏÖʲô´íÎ󣬶¼²»Òª±¨´í¼ÌÐøÖ´ÐС£ºÍÆäËü°æ±¾make¼æÈݵÄÏà¹ØÃüÁîÊÇsinclude£¬Æä×÷ÓúÍÕâÒ»¸öÊÇÒ»ÑùµÄ¡£
2.4 »·¾³±äÁ¿ MAKEFILES
Èç¹ûÄãµÄµ±Ç°»·¾³Öж¨ÒåÁË»·¾³±äÁ¿MAKEFILES£¬ÄÇô£¬make»á°ÑÕâ¸ö±äÁ¿ÖеÄÖµ×öÒ»¸öÀàËÆÓÚincludeµÄ¶¯×÷¡£Õâ¸ö±äÁ¿ÖеÄÖµÊÇÆäËüµÄMakefile£¬Óÿոñ·Ö¸ô¡£Ö»ÊÇ£¬ËüºÍinclude²»Í¬µÄÊÇ£¬´ÓÕâ¸ö»·¾³±äÖÐÒýÈëµÄMakefileµÄ¡°Ä¿±ê¡±²»»áÆð×÷Óã¬Èç¹û»·¾³±äÁ¿Öж¨ÒåµÄÎļþ·¢ÏÖ´íÎó£¬makeÒ²»á²»Àí¡£
µ«ÊÇÔÚÕâÀïÎÒ»¹Êǽ¨Ò鲻ҪʹÓÃÕâ¸ö»·¾³±äÁ¿£¬ÒòΪֻҪÕâ¸ö±äÁ¿Ò»±»¶¨Ò壬ÄÇôµ±ÄãʹÓÃmakeʱ£¬ËùÓеÄMakefile¶¼»áÊܵ½ËüµÄÓ°Ï죬Õâ¾ø²»ÊÇÄãÏë¿´µ½µÄ¡£ÔÚÕâÀïÌáÕâ¸öÊ£¬Ö»ÊÇΪÁ˸æËß´ó¼Ò£¬Ò²ÐíÓÐʱºòÄãµÄMakefile³öÏÖÁ˹ÖÊ£¬ÄÇôÄã¿ÉÒÔ¿´¿´µ±Ç°»·¾³ÖÐÓÐûÓж¨ÒåÕâ¸ö±äÁ¿¡£
2.5 makeµÄ¹¤×÷·½Ê½
GNUµÄmake¹¤×÷ʱµÄÖ´Ðв½ÖèÈëÏ£º£¨ÏëÀ´ÆäËüµÄmakeÒ²ÊÇÀàËÆ£©
1. ¶ÁÈëËùÓеÄMakefile¡£
2. ¶ÁÈë±»includeµÄÆäËüMakefile¡£
3. ³õʼ»¯ÎļþÖеıäÁ¿¡£
4. ÍÆµ¼Òþ»Þ¹æÔò£¬²¢·ÖÎöËùÓйæÔò¡£
5. ΪËùÓеÄÄ¿±êÎļþ´´½¨ÒÀÀµ¹ØÏµÁ´¡£
6. ¸ù¾ÝÒÀÀµ¹ØÏµ£¬¾ö¶¨ÄÄЩĿ±êÒªÖØÐÂÉú³É¡£
7. Ö´ÐÐÉú³ÉÃüÁî¡£
1-5²½ÎªµÚÒ»¸ö½×¶Î£¬6-7ΪµÚ¶þ¸ö½×¶Î¡£µÚÒ»¸ö½×¶ÎÖУ¬Èç¹û¶¨ÒåµÄ±äÁ¿±»Ê¹ÓÃÁË£¬ÄÇô£¬make»á°ÑÆäÕ¹¿ªÔÚʹÓõÄλÖᣵ«make²¢²»»áÍêÈ«ÂíÉÏÕ¹¿ª£¬makeʹÓõÄÊÇÍÏÑÓÕ½Êõ£¬Èç¹û±äÁ¿³öÏÖÔÚÒÀÀµ¹ØÏµµÄ¹æÔòÖУ¬ÄÇô½öµ±ÕâÌõÒÀÀµ±»¾ö¶¨ÒªÊ¹ÓÃÁË£¬±äÁ¿²Å»áÔÚÆäÄÚ²¿Õ¹¿ª¡£
µ±È»£¬Õâ¸ö¹¤×÷·½Ê½Äã²»Ò»¶¨ÒªÇå³þ£¬µ«ÊÇÖªµÀÕâ¸ö·½Ê½ÄãÒ²»á¶Ômake¸üΪÊìϤ¡£ÓÐÁËÕâ¸ö»ù´¡£¬ºóÐø²¿·ÖÒ²¾ÍÈÝÒ׿´¶®ÁË¡£
3 MakefileÊéд¹æÔò
¹æÔò°üº¬Á½¸ö²¿·Ö£¬Ò»¸öÊÇÒÀÀµ¹ØÏµ£¬Ò»¸öÊÇÉú³ÉÄ¿±êµÄ·½·¨¡£
ÔÚMakefileÖУ¬¹æÔòµÄ˳ÐòÊǺÜÖØÒªµÄ£¬ÒòΪ£¬MakefileÖÐÖ»Ó¦¸ÃÓÐÒ»¸ö×îÖÕÄ¿±ê£¬ÆäËüµÄÄ¿±ê¶¼ÊDZ»Õâ¸öÄ¿±êËùÁ¬´ø³öÀ´µÄ£¬ËùÒÔÒ»¶¨ÒªÈÃmakeÖªµÀÄãµÄ×îÖÕÄ¿±êÊÇʲô¡£Ò»°ãÀ´Ëµ£¬¶¨ÒåÔÚMakefileÖеÄÄ¿±ê¿ÉÄÜ»áÓкܶ࣬µ«ÊǵÚÒ»Ìõ¹æÔòÖеÄÄ¿±ê½«±»È·Á¢Îª×îÖÕµÄÄ¿±ê¡£Èç¹ûµÚÒ»Ìõ¹æÔòÖеÄÄ¿±êÓкܶà¸ö£¬ÄÇô£¬µÚÒ»¸öÄ¿±ê»á³ÉΪ×îÖÕµÄÄ¿±ê¡£makeËùÍê³ÉµÄÒ²¾ÍÊÇÕâ¸öÄ¿±ê¡£
ºÃÁË£¬»¹ÊÇÈÃÎÒÃÇÀ´¿´Ò»¿´ÈçºÎÊéд¹æÔò¡£
3.1 ¹æÔò¾ÙÀý
foo.o: foo.cdefs.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Îļþ£©
3.2 ¹æÔòµÄÓï·¨
targets :prerequisites
command
...
»òÊÇÕâÑù£º
targets : prerequisites; command
command
...
targetsÊÇÎļþÃû£¬ÒÔ¿Õ¸ñ·Ö¿ª£¬¿ÉÒÔʹÓÃͨÅä·û¡£Ò»°ãÀ´Ëµ£¬ÎÒÃǵÄÄ¿±ê»ù±¾ÉÏÊÇÒ»¸öÎļþ£¬µ«Ò²ÓпÉÄÜÊǶà¸öÎļþ¡£
commandÊÇÃüÁîÐУ¬Èç¹ûÆä²»Óë¡°target:prerequisites¡±ÔÚÒ»ÐУ¬ÄÇô£¬±ØÐëÒÔ[Tab¼ü]¿ªÍ·£¬Èç¹ûºÍprerequisitesÔÚÒ»ÐУ¬ÄÇô¿ÉÒÔÓ÷ֺÅ×öΪ·Ö¸ô¡££¨¼ûÉÏ£©
prerequisitesÒ²¾ÍÊÇÄ¿±êËùÒÀÀµµÄÎļþ£¨»òÒÀÀµÄ¿±ê£©¡£Èç¹ûÆäÖеÄij¸öÎļþÒª±ÈÄ¿±êÎļþҪУ¬ÄÇô£¬Ä¿±ê¾Í±»ÈÏΪÊÇ¡°¹ýʱµÄ¡±£¬±»ÈÏΪÊÇÐèÒªÖØÉú³ÉµÄ¡£Õâ¸öÔÚÇ°ÃæÒѾ½²¹ýÁË¡£
Èç¹ûÃüÁîÌ«³¤£¬Äã¿ÉÒÔʹÓ÷´Ð±¿ò£¨¡®\¡¯£©×÷Ϊ»»Ðзû¡£make¶ÔÒ»ÐÐÉÏÓжàÉÙ¸ö×Ö·ûûÓÐÏÞÖÆ¡£¹æÔò¸æËßmakeÁ½¼þÊ£¬ÎļþµÄÒÀÀµ¹ØÏµºÍÈçºÎ³É³ÉÄ¿±êÎļþ¡£
Ò»°ãÀ´Ëµ£¬make»áÒÔUNIXµÄ±ê×¼Shell£¬Ò²¾ÍÊÇ/bin/shÀ´Ö´ÐÐÃüÁî¡£
3.3 ÔÚ¹æÔòÖÐʹÓÃͨÅä·û
Èç¹ûÎÒÃÇÏ붨ÒåһϵÁбȽÏÀàËÆµÄÎļþ£¬ÎÒÃǺÜ×ÔÈ»µØ¾ÍÏëÆðʹÓÃͨÅä·û¡£makeÖ§³ÖÈý¸öͨÅä·û£º¡°*¡±£¬¡°?¡±ºÍ¡°[...]¡±¡£ÕâÊǺÍUnixµÄB-ShellÊÇÏàͬµÄ¡£
"~" //ÔÚlinuxÖдú±íÓû§¸ùĿ¼
²¨À˺ţ¨¡°~¡±£©×Ö·ûÔÚÎļþÃûÖÐÒ²ÓбȽÏÌØÊâµÄÓÃ;¡£Èç¹ûÊÇ¡°~/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 $?
touchprint
ÉÏÃæÕâ¸öÀý×Ó˵Ã÷ÁËͨÅä·ûÒ²¿ÉÒÔÔÚÎÒÃǵĹæÔòÖУ¬Ä¿±êprintÒÀÀµÓÚËùÓеÄ[.c]Îļþ¡£ÆäÖеġ°$?¡±ÊÇÒ»¸ö×Ô¶¯»¯±äÁ¿£¬ÎÒ»áÔÚºóÃæ¸øÄã½²Êö¡£
objects = *.o //ÕâÀï¾ÍÓõ½Í¨Åä·ûºÅÁË£¬Õâ¸öÊÇ´ú±íËùÓеÄ.OÎļþ
ÉÏÃæÕâ¸öÀý×Ó£¬±íʾÁË£¬Í¨·ûͬÑù¿ÉÒÔÓÃÔÚ±äÁ¿ÖС£²¢²»ÊÇ˵[*.o]»áÕ¹¿ª£¬²»£¡objectsµÄÖµ¾ÍÊÇ¡°*.o¡±¡£MakefileÖеıäÁ¿Æäʵ¾ÍÊÇC/C++ÖеĺꡣÈç¹ûÄãÒªÈÃͨÅä·ûÔÚ±äÁ¿ÖÐÕ¹¿ª£¬Ò²¾ÍÊÇÈÃobjectsµÄÖµÊÇËùÓÐ[.o]µÄÎļþÃûµÄ¼¯ºÏ£¬ÄÇô£¬Äã¿ÉÒÔÕâÑù£º
objects := $(wildcard*.o)
ÕâÖÖÓ÷¨Óɹؼü×Ö¡°wildcard¡±Ö¸³ö£¬¹ØÓÚMakefileµÄ¹Ø¼ü×Ö£¬ÎÒÃǽ«ÔÚºóÃæÌÖÂÛ¡£
3.4 ÎļþËÑѰ
ÔÚһЩ´óµÄ¹¤³ÌÖУ¬ÓдóÁ¿µÄÔ´Îļþ£¬ÎÒÃÇͨ³£µÄ×ö·¨ÊǰÑÕâÐí¶àµÄÔ´Îļþ·ÖÀ࣬²¢´æ·ÅÔÚ²»Í¬µÄĿ¼ÖС£ËùÒÔ£¬µ±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>ÔòÖ¸¶¨Á˵ÄÎļþ¼¯µÄËÑË÷µÄĿ¼¡£ÀýÈ磺
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¡±Ä¿Â¼¡£
3.5 αĿ±ê
×îÔçÏȵÄÒ»¸öÀý×ÓÖУ¬ÎÒÃÇÌáµ½¹ýÒ»¸ö¡°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.outils.o
cc-o prog3 prog3.o sort.o utils.o |
ÎÒÃÇÖªµÀ£¬MakefileÖеĵÚÒ»¸öÄ¿±ê»á±»×÷ΪÆäĬÈÏÄ¿±ê¡£ÎÒÃÇÉùÃ÷ÁËÒ»¸ö¡°all¡±µÄαĿ±ê£¬ÆäÒÀÀµÓÚÆäËüÈý¸öÄ¿±ê¡£ÓÉÓÚαĿ±êµÄÌØÐÔÊÇ£¬×ÜÊDZ»Ö´Ðеģ¬ËùÒÔÆäÒÀÀµµÄÄÇÈý¸öÄ¿±ê¾Í×ÜÊDz»Èç¡°all¡±Õâ¸öÄ¿±êС£ËùÒÔ£¬ÆäËüÈý¸öÄ¿±êµÄ¹æÔò×ÜÊǻᱻ¾öÒé¡£Ò²¾Í´ïµ½ÁËÎÒÃÇÒ»¿ÚÆøÉú³É¶à¸öÄ¿±êµÄÄ¿µÄ¡£¡°.PHONY
: all¡±ÉùÃ÷ÁË¡°all¡±Õâ¸öÄ¿±êΪ¡°Î±Ä¿±ê¡±¡£
Ëæ±ãÌáÒ»¾ä£¬´ÓÉÏÃæµÄÀý×ÓÎÒÃÇ¿ÉÒÔ¿´³ö£¬Ä¿±êÒ²¿ÉÒÔ³ÉΪÒÀÀµ¡£ËùÒÔ£¬Î±Ä¿±êͬÑùÒ²¿É³ÉΪÒÀÀµ¡£¿´ÏÂÃæµÄÀý×Ó£º
.PHONY: cleanall cleanobjcleandiff
cleanall : cleanobjcleandiff
rmprogram
cleanobj :
rm*.o
cleandiff :
rm*.diff |
¡°makeclean¡±½«Çå³ýËùÓÐÒª±»Çå³ýµÄÎļþ¡£¡°cleanobj¡±ºÍ¡°cleandiff¡±ÕâÁ½¸öαĿ±êÓеãÏñ¡°×Ó³ÌÐò¡±µÄÒâ˼¡£ÎÒÃÇ¿ÉÒÔÊäÈë¡°make
clean all¡±ºÍ¡°make clean obj¡±ºÍ¡°make clean diff¡±ÃüÁîÀ´´ïµ½Çå³ý²»Í¬ÖÖÀàÎļþµÄÄ¿µÄ
3.6 ¶àÄ¿±ê
MakefileµÄ¹æÔòÖеÄÄ¿±ê¿ÉÒÔ²»Ö¹Ò»¸ö£¬ÆäÖ§³Ö¶àÄ¿±ê£¬ÓпÉÄÜÎÒÃǵĶà¸öÄ¿±êͬʱÒÀÀµÓÚÒ»¸öÎļþ£¬²¢ÇÒÆäÉú³ÉµÄÃüÁî´óÌåÀàËÆ¡£ÓÚÊÇÎÒÃǾÍÄÜ°ÑÆäºÏ²¢ÆðÀ´¡£µ±È»£¬¶à¸öÄ¿±êµÄÉú³É¹æÔòµÄÖ´ÐÐÃüÁîÊÇͬһ¸ö£¬Õâ¿ÉÄÜ»á¿ÉÎÒÃÇ´øÀ´Âé·³£¬²»¹ýºÃÔÚÎÒÃǵĿÉÒÔʹÓÃÒ»¸ö×Ô¶¯»¯±äÁ¿¡°$@¡±£¨¹ØÓÚ×Ô¶¯»¯±äÁ¿£¬½«ÔÚºóÃæ½²Êö£©£¬Õâ¸ö±äÁ¿±íʾ×ÅĿǰ¹æÔòÖÐËùÓеÄÄ¿±êµÄ¼¯ºÏ£¬ÕâÑù˵¿ÉÄܺܳéÏ󣬻¹ÊÇ¿´Ò»¸öÀý×Ó°É¡£
bigoutput littleoutput :text.g
generatetext.g -$(subst output,,$@) > $@
ÉÏÊö¹æÔòµÈ¼ÛÓÚ£º
bigoutput : text.g
generatetext.g -big > bigoutput
littleoutput : text.g
generatetext.g -little > littleoutput
ÆäÖУ¬-$(subst output,,$@)Öеġ°$¡±±íʾִÐÐÒ»¸öMakefileµÄº¯Êý£¬º¯ÊýÃûΪsubst£¬ºóÃæµÄΪ²ÎÊý¡£¹ØÓÚº¯Êý£¬½«ÔÚºóÃæ½²Êö¡£ÕâÀïµÄÕâ¸öº¯ÊýÊǽØÈ¡×Ö·û´®µÄÒâ˼£¬¡°$@¡±±íʾĿ±êµÄ¼¯ºÏ£¬¾ÍÏñÒ»¸öÊý×飬¡°$@¡±ÒÀ´ÎÈ¡³öÄ¿±ê£¬²¢Ö´ÓÚÃüÁî¡£
3.7 ¾²Ì¬Ä£Ê½
¾²Ì¬Ä£Ê½¿ÉÒÔ¸ü¼ÓÈÝÒ׵ض¨Òå¶àÄ¿±êµÄ¹æÔò£¬¿ÉÒÔÈÃÎÒÃǵĹæÔò±äµÃ¸ü¼ÓµÄÓе¯ÐÔºÍÁé»î¡£ÎÒÃÇ»¹ÊÇÏÈÀ´¿´Ò»ÏÂÓï·¨£º
<targets...>: <target-pattern>:
<prereq-patterns ...>
¡¡¡¡¡¡<commands>
...
targets¶¨ÒåÁËһϵÁеÄÄ¿±êÎļþ£¬¿ÉÒÔÓÐͨÅä·û¡£ÊÇÄ¿±êµÄÒ»¸ö¼¯ºÏ¡£
target-parrternÊÇÖ¸Ã÷ÁËtargetsµÄģʽ£¬Ò²¾ÍÊǵÄÄ¿±ê¼¯Ä£Ê½¡£
prereq-parrternsÊÇÄ¿±êµÄÒÀÀµÄ£Ê½£¬Ëü¶Ôtarget-parrternÐγɵÄģʽÔÙ½øÐÐÒ»´ÎÒÀÀµÄ¿±êµÄ¶¨Òå¡£
ÕâÑùÃèÊöÕâÈý¸ö¶«Î÷£¬¿ÉÄÜ»¹ÊÇûÓÐ˵Çå³þ£¬»¹ÊǾٸöÀý×ÓÀ´ËµÃ÷һϰɡ£Èç¹ûÎÒÃǵÄ<target-parrtern>¶¨Òå³É¡°%.o¡±£¬Òâ˼ÊÇÎÒÃǵļ¯ºÏÖж¼ÊÇÒÔ¡°.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¡±µÄ¡°%¡±£¬Ò²¾ÍÊÇ¡°foobar¡±£¬²¢ÎªÆä¼ÓÏ¡°.c¡±µÄºó׺£¬ÓÚÊÇ£¬ÎÒÃǵÄÒÀÀµÄ¿±ê¾ÍÊÇ¡°foo.cbar.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.elcbar.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Öиü´óµÄµ¯ÐÔ¡£
3.8 ×Ô¶¯Éú³ÉÒÀÀµÐÔ
ÔÚ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.cdefs.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]ÎļþÖеÄÄ¿±ê»á³ÉΪĬÈÏÄ¿±ê
4 Makefile ÊéдÃüÁî
ÿÌõ¹æÔòÖеÄÃüÁîºÍ²Ù×÷ϵͳShellµÄÃüÁîÐÐÊÇÒ»Öµġ£make»áÒ»°´Ë³ÐòÒ»ÌõÒ»ÌõµÄÖ´ÐÐÃüÁÿÌõÃüÁîµÄ¿ªÍ·±ØÐëÒÔ[Tab]¼ü¿ªÍ·£¬³ý·Ç£¬ÃüÁîÊǽô¸úÔÚÒÀÀµ¹æÔòºóÃæµÄ·ÖºÅºóµÄ¡£ÔÚÃüÁîÐÐÖ®¼äÖеĿոñ»òÊÇ¿ÕÐлᱻºöÂÔ£¬µ«ÊÇÈç¹û¸Ã¿Õ¸ñ»ò¿ÕÐÐÊÇÒÔTab¼ü¿ªÍ·µÄ£¬ÄÇômake»áÈÏΪÆäÊÇÒ»¸ö¿ÕÃüÁî¡£
ÎÒÃÇÔÚUNIXÏ¿ÉÄÜ»áʹÓò»Í¬µÄShell£¬µ«ÊÇmakeµÄÃüÁîĬÈÏÊDZ»¡°/bin/sh¡±¡ª¡ªUNIXµÄ±ê×¼Shell½âÊÍÖ´Ðеġ£³ý·ÇÄãÌØ±ðÖ¸¶¨Ò»¸öÆäËüµÄShell¡£MakefileÖУ¬¡°#¡±ÊÇ×¢ÊÍ·û£¬ºÜÏñC/C++Öеġ°//¡±£¬ÆäºóµÄ±¾ÐÐ×Ö·û¶¼±»×¢ÊÍ¡£
4.1 ÏÔʾÃüÁî
ͨ³££¬make»á°ÑÆäÒªÖ´ÐеÄÃüÁîÐÐÔÚÃüÁîÖ´ÐÐǰÊä³öµ½ÆÁÄ»ÉÏ¡£µ±ÎÒÃÇÓá°@¡±×Ö·ûÔÚÃüÁîÐÐǰ£¬ÄÇô£¬Õâ¸öÃüÁ²»±»makeÏÔʾ³öÀ´£¬×î¾ß´ú±íÐÔµÄÀý×ÓÊÇ£¬ÎÒÃÇÓÃÕâ¸ö¹¦ÄÜÀ´ÏñÆÁÄ»ÏÔʾһЩÐÅÏ¢¡£È磺
@echo ÕýÔÚ±àÒëXXXÄ£¿é......
µ±makeÖ´ÐÐʱ£¬»áÊä³ö¡°ÕýÔÚ±àÒëXXXÄ£¿é......¡±×Ö´®£¬µ«²»»áÊä³öÃüÁÈç¹ûûÓС°@¡±£¬ÄÇô£¬make½«Êä³ö£º
echo ÕýÔÚ±àÒëXXXÄ£¿é......
ÕýÔÚ±àÒëXXXÄ£¿é......
Èç¹ûmakeÖ´ÐÐʱ£¬´øÈëmake²ÎÊý¡°-n¡±»ò¡°--just-print¡±£¬ÄÇôÆäÖ»ÊÇÏÔʾÃüÁµ«²»»áÖ´ÐÐÃüÁÕâ¸ö¹¦ÄܺÜÓÐÀûÓÚÎÒÃǵ÷ÊÔÎÒÃǵÄMakefile£¬¿´¿´ÎÒÃÇÊéдµÄÃüÁîÊÇÖ´ÐÐÆðÀ´ÊÇʲôÑù×ӵĻòÊÇʲô˳ÐòµÄ¡£
¶ømake²ÎÊý¡°-s¡±»ò¡°--slient¡±ÔòÊÇÈ«Ãæ½ûÖ¹ÃüÁîµÄÏÔʾ¡£
4.2 ÃüÁîÖ´ÐÐ
µ±ÒÀÀµÄ¿±êÐÂÓÚÄ¿±êʱ£¬Ò²¾ÍÊǵ±¹æÔòµÄÄ¿±êÐèÒª±»¸üÐÂʱ£¬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¡±µÈºó׺¡£
4.3 ÃüÁî³ö´í
ÿµ±ÃüÁîÔËÐÐÍêºó£¬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¹æÔòÖеÄÃüÁî³ö´íÁË£¬ÄÇô¾ÍÖÕÄ¿¸Ã¹æÔòµÄÖ´ÐУ¬µ«¼ÌÐøÖ´ÐÐÆäËü¹æÔò¡£
4.4 ǶÌ×Ö´ÐÐmake
ÔÚһЩ´óµÄ¹¤³ÌÖУ¬ÎÒÃÇ»á°ÑÎÒÃDz»Í¬Ä£¿é»òÊDz»Í¬¹¦ÄܵÄÔ´Îļþ·ÅÔÚ²»Í¬µÄĿ¼ÖУ¬ÎÒÃÇ¿ÉÒÔÔÚÿ¸öĿ¼Öж¼Êéдһ¸ö¸ÃĿ¼µÄMakefile£¬ÕâÓÐÀûÓÚÈÃÎÒÃǵÄMakefile±äµÃ¸ü¼ÓµØ¼ò½à£¬¶ø²»ÖÁÓÚ°ÑËùÓеĶ«Î÷È«²¿Ð´ÔÚÒ»¸öMakefileÖУ¬ÕâÑù»áºÜÄÑά»¤ÎÒÃǵÄMakefile£¬Õâ¸ö¼¼Êõ¶ÔÓÚÎÒÃÇÄ£¿é±àÒëºÍ·Ö¶Î±àÒëÓÐ×ŷdz£´óµÄºÃ´¦¡£
ÀýÈ磬ÎÒÃÇÓÐÒ»¸ö×ÓĿ¼½Ðsubdir£¬Õâ¸öĿ¼ÏÂÓиöMakefileÎļþ£¬À´Ö¸Ã÷ÁËÕâ¸öĿ¼ÏÂÎļþµÄ±àÒë¹æÔò¡£ÄÇôÎÒÃÇ×ܿصÄMakefile¿ÉÒÔÕâÑùÊéд£º
subsystem:
cdsubdir && $(MAKE)
ÆäµÈ¼ÛÓÚ£º
subsystem:
$(MAKE)-C subdir
¶¨Òå$(MAKE)ºê±äÁ¿µÄÒâ˼ÊÇ£¬Ò²ÐíÎÒÃǵÄmakeÐèҪһЩ²ÎÊý£¬ËùÒÔ¶¨Òå³ÉÒ»¸ö±äÁ¿±È½ÏÀûÓÚά»¤¡£ÕâÁ½¸öÀý×ÓµÄÒâ˼¶¼ÊÇÏȽøÈë¡°subdir¡±Ä¿Â¼£¬È»ºóÖ´ÐÐmakeÃüÁî¡£
ÎÒÃǰÑÕâ¸öMakefile½Ð×ö¡°×Ü¿ØMakefile¡±£¬×Ü¿ØMakefileµÄ±äÁ¿¿ÉÒÔ´«µÝµ½Ï¼¶µÄMakefileÖУ¨Èç¹ûÄãÏÔʾµÄÉùÃ÷£©£¬µ«ÊDz»»á¸²¸ÇϲãµÄMakefileÖÐËù¶¨ÒåµÄ±äÁ¿£¬³ý·ÇÖ¸¶¨ÁË¡°-e¡±²ÎÊý¡£
Èç¹ûÄãÒª´«µÝ±äÁ¿µ½Ï¼¶MakefileÖУ¬ÄÇôÄã¿ÉÒÔʹÓÃÕâÑùµÄÉùÃ÷£º
export<variable ...>
Èç¹ûÄã²»ÏëÈÃijЩ±äÁ¿´«µÝµ½Ï¼¶MakefileÖУ¬ÄÇôÄã¿ÉÒÔÕâÑùÉùÃ÷£º
unexport<variable ...>
È磺
ʾÀýÒ»£º
exportvariable = value
ÆäµÈ¼ÛÓÚ£º
variable = value
exportvariable
ÆäµÈ¼ÛÓÚ£º
exportvariable := value
ÆäµÈ¼ÛÓÚ£º
variable:= value
exportvariable
ʾÀý¶þ£º
exportvariable += value
ÆäµÈ¼ÛÓÚ£º
variable+= value
exportvariable
Èç¹ûÄãÒª´«µÝËùÓеıäÁ¿£¬ÄÇô£¬Ö»ÒªÒ»¸öexport¾ÍÐÐÁË¡£ºóÃæÊ²Ã´Ò²²»Óøú£¬±íʾ´«µÝËùÓеıäÁ¿¡£
ÐèҪעÒâµÄÊÇ£¬ÓÐÁ½¸ö±äÁ¿£¬Ò»¸öÊÇSHELL£¬Ò»¸öÊÇMAKEFLAGS£¬ÕâÁ½¸ö±äÁ¿²»¹ÜÄãÊÇ·ñexport£¬Æä×ÜÊÇÒª´«µÝµ½Ï²ãMakefileÖУ¬ÌرðÊÇMAKEFILES±äÁ¿£¬ÆäÖаüº¬ÁËmakeµÄ²ÎÊýÐÅÏ¢£¬Èç¹ûÎÒÃÇÖ´ÐС°×Ü¿ØMakefile¡±Ê±ÓÐmake²ÎÊý»òÊÇÔÚÉϲãMakefileÖж¨ÒåÁËÕâ¸ö±äÁ¿£¬ÄÇôMAKEFILES±äÁ¿½«»áÊÇÕâЩ²ÎÊý£¬²¢»á´«µÝµ½Ï²ãMakefileÖУ¬ÕâÊÇÒ»¸öϵͳ¼¶µÄ»·¾³±äÁ¿¡£
µ«ÊÇmakeÃüÁîÖеÄÓм¸¸ö²ÎÊý²¢²»ÍùÏ´«µÝ£¬ËüÃÇÊÇ¡°-C¡±,¡°-f¡±,¡°-h¡±¡°-o¡±ºÍ¡°-W¡±£¨ÓйØMakefile²ÎÊýµÄϸ½Ú½«ÔÚºóÃæËµÃ÷£©£¬Èç¹ûÄã²»ÏëÍùϲ㴫µÝ²ÎÊý£¬ÄÇô£¬Äã¿ÉÒÔÕâÑùÀ´£º
subsystem:
cdsubdir && $(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¡±×ÜÊÇʧЧµÄ¡£
4.5 ¶¨ÒåÃüÁî°ü
Èç¹û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)
ÎÒÃÇÖ´ÐС°makeall¡±½«»á´ò³ö±äÁ¿$(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.c2.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 bg
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))¡±ÕâÑùµÄÐÎʽ£¬¶ø²»ÊÇ¡°$(substa,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)£¬
°Ñ¡°feeton 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.cbar.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 )
°Ñ×Ö´®¡°ab 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.cbar.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.obar.o¡±¡£
$(sort <list> )
Ãû³Æ£ºÅÅÐòº¯Êý¡ª¡ªsort¡£
¹¦ÄÜ£º¸ø×Ö·û´®<list>Öеĵ¥´ÊÅÅÐò£¨ÉýÐò£©¡£
·µ»Ø£º·µ»ØÅÅÐòºóµÄ×Ö·û´®¡£
ʾÀý£º$(sortfoo bar lose)·µ»Ø¡°bar foo lose¡± ¡£
±¸×¢£ºsortº¯Êý»áÈ¥µô<list>ÖÐÏàͬµÄµ¥´Ê¡£
$(word <n>,<text> )
Ãû³Æ£ºÈ¡µ¥´Êº¯Êý¡ª¡ªword¡£
¹¦ÄÜ£ºÈ¡×Ö·û´®<text>ÖеÚ<n>¸öµ¥´Ê¡££¨´ÓÒ»¿ªÊ¼£©
·µ»Ø£º·µ»Ø×Ö·û´®<text>ÖеÚ<n>¸öµ¥´Ê¡£Èç¹û<n>±È<text>Öеĵ¥´ÊÊýÒª´ó£¬ÄÇô·µ»Ø¿Õ×Ö·û´®¡£
ʾÀý£º$(word2, 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>µÄµÚÒ»¸öµ¥´Ê¡£
ʾÀý£º$(firstwordfoo 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>µÄºó׺ÐòÁУ¬Èç¹ûÎļþûÓкó׺£¬Ôò·µ»Ø¿Õ×Ö´®¡£
ʾÀý£º$(suffixsrc/foo.c src-1.0/bar.c hacks)·µ»ØÖµÊÇ¡°.c .c¡±¡£
$(basename <names...> )
Ãû³Æ£ºÈ¡Ç°×ºº¯Êý¡ª¡ªbasename¡£
¹¦ÄÜ£º´ÓÎļþÃûÐòÁÐ<names>ÖÐÈ¡³ö¸÷¸öÎļþÃûµÄǰ׺²¿·Ö¡£
·µ»Ø£º·µ»ØÎļþÃûÐòÁÐ<names>µÄǰ׺ÐòÁУ¬Èç¹ûÎļþûÓÐǰ׺£¬Ôò·µ»Ø¿Õ×Ö´®¡£
ʾÀý£º$(basenamesrc/foo.c src-1.0/bar.c hacks)·µ»ØÖµÊÇ¡°src/foo
src-1.0/barhacks¡±¡£
$(addsuffix <suffix>,<names...> )
Ãû³Æ£º¼Óºó׺º¯Êý¡ª¡ªaddsuffix¡£
¹¦ÄÜ£º°Ñºó׺<suffix>¼Óµ½<names>ÖеÄÿ¸öµ¥´ÊºóÃæ¡£
·µ»Ø£º·µ»Ø¼Ó¹ýºó׺µÄÎļþÃûÐòÁС£
ʾÀý£º$(addsuffix.c,foo bar)·µ»ØÖµÊÇ¡°foo.c bar.c¡±¡£
$(addprefix <prefix>,<names...> )
Ãû³Æ£º¼Óǰ׺º¯Êý¡ª¡ªaddprefix¡£
¹¦ÄÜ£º°Ñǰ׺<prefix>¼Óµ½<names>ÖеÄÿ¸öµ¥´ÊºóÃæ¡£
·µ»Ø£º·µ»Ø¼Ó¹ýǰ׺µÄÎļþÃûÐòÁС£
ʾÀý£º$(addprefixsrc/,foo bar)·µ»ØÖµÊÇ¡°src/foo src/bar¡±¡£
$(join <list1>,<list2> )
Ãû³Æ£ºÁ¬½Óº¯Êý¡ª¡ªjoin¡£
¹¦ÄÜ£º°Ñ<list2>Öеĵ¥´Ê¶ÔÓ¦µØ¼Óµ½<list1>µÄµ¥´ÊºóÃæ¡£Èç¹û<list1>µÄµ¥´Ê¸öÊýÒª±È<list2>µÄ¶à£¬ÄÇô£¬<list1>ÖеĶà³öÀ´µÄµ¥´Ê½«±£³ÖÔÑù¡£Èç¹û<list2>µÄµ¥´Ê¸öÊý±È
<list1>¶à£¬ÄÇô£¬<list2>¶à³öÀ´µÄµ¥´Ê½«±»¸´ÖƵ½<list2>ÖС£
·µ»Ø£º·µ»ØÁ¬½Ó¹ýºóµÄ×Ö·û´®¡£
ʾÀý£º$(joinaaa 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º¯ÊýµÄ·µ»Ø£¬ËùÒÔ£¬$(f
iles)µÄÖµÊÇ¡°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-D
OSÖÐÊÇÎÞÓõģ©
¡°-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 -q
p¡±ÃüÁî¡£Èç¹ûÄãÏë²é¿´Ö´ÐÐ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
ת»»CWeb µ½ TeXµÄ³ÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°cweave¡±¡£
TANGLE
ת»»Webµ½PascalÓïÑԵijÌÐò¡£Ä¬ÈÏÃüÁîÊÇ¡°tangle¡±¡£
CTANGLE
ת»»CWeb µ½ 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·¢·èÁË£¿
ÔÚĬÈÏÇé¿öÏ£¬¶ÔÓÚÖмäÄ¿±ê£¬ËüºÍÒ»°ãµÄÄ¿±êÓÐÁ½¸öµØ·½Ëù²»Í¬£ºµÚÒ»¸ö²»Í¬Êdzý·ÇÖмäµÄÄ¿±ê²»´æÔÚ£¬²Å»áÒý·¢ÖÐ¼ä¹æÔò¡£µÚ¶þ¸ö²»Í¬µÄÊÇ£¬Ö»ÒªÄ¿±ê³É¹¦²úÉú£¬ÄÇô£¬²úÉú×îÖÕÄ¿±ê¹ý³ÌÖУ¬Ëù²úÉúµÄÖмäÄ¿±êÎļþ»á±»ÒÔ¡°rm
-f¡±É¾³ý¡£Í¨³££¬Ò»¸ö±»makefileÖ¸¶¨³ÉÄ¿±ê»òÊÇÒÀÀµÄ¿±êµÄÎļþ²»Äܱ»µ±×÷Öн顣Ȼ¶ø£¬Äã¿ÉÒÔÃ÷ÏÔµØËµÃ÷Ò»¸öÎļþ»òÊÇÄ¿±êÊÇÖнéÄ¿±ê£¬Äã¿ÉÒÔʹÓÃαĿ±ê¡°.INTERMEDIATE¡±À´Ç¿ÖÆÉùÃ÷¡££¨È磺.INTERMEDIATE
£º mid £©ÄãÒ²¿ÉÒÔ×èÖ¹make×Ô¶¯É¾³ýÖмäÄ¿±ê£¬Òª×öµ½ÕâÒ»µã£¬Äã¿ÉÒÔʹÓÃαĿ±ê¡°.SECONDARY¡±À´Ç¿ÖÆÉùÃ÷£¨È磺.SECONDARY
: sec£©¡£Ä㻹¿ÉÒÔ°ÑÄãµÄÄ¿±ê£¬ÒÔģʽµÄ·½Ê½À´Ö¸¶¨£¨È磺%.o£©³ÉαĿ±ê¡°.PRECIOUS¡±µÄÒÀÀµÄ¿±ê£¬ÒÔ±£´æ±»Òþº¬¹æÔòËùÉú³ÉµÄÖмäÎļþ¡£
ÔÚ¡°Òþº¬¹æÔòÁ´¡±ÖУ¬½ûֹͬһ¸öÄ¿±ê³öÏÖÁ½´Î»òÁ½´ÎÒÔÉÏ£¬ÕâÑùÒ»À´£¬¾Í¿É·ÀÖ¹ÔÚmake×Ô¶¯ÍƵ¼Ê±³öÏÖÎÞÏ޵ݹéµÄÇé¿ö¡£
Make »áÓÅ»¯Ò»Ð©ÌØÊâµÄÒþº¬¹æÔò£¬¶ø²»Éú³ÉÖмäÎļþ¡£È磬´ÓÎļþ¡°foo.c¡±Éú³ÉÄ¿±ê³ÌÐò¡°foo¡±£¬°´µÀÀí£¬make»á±àÒëÉú³ÉÖмäÎļþ¡°foo.o¡±£¬È»ºóÁ´½Ó³É¡°foo¡±£¬µ«ÔÚʵ¼ÊÇé¿öÏ£¬ÕâÒ»¶¯×÷¿ÉÒÔ±»Ò»Ìõ¡°cc¡±µÄÃüÁîÍê³É£¨cc
¨Co foo foo.c£©£¬ÓÚÊÇÓÅ»¯¹ýµÄ¹æÔò¾Í²»»áÉú³ÉÖмäÎļþ¡£
Îå¡¢¶¨Òåģʽ¹æÔò
Äã¿ÉÒÔʹÓÃģʽ¹æÔòÀ´¶¨ÒåÒ»¸öÒþº¬¹æÔò¡£Ò»¸öģʽ¹æÔò¾ÍºÃÏñÒ»¸öÒ»°ãµÄ¹æÔò£¬Ö»ÊÇÔÚ¹æÔòÖУ¬Ä¿±êµÄ¶¨ÒåÐèÒªÓÐ"%"×Ö·û¡£"%"µÄÒâ˼ÊDZíʾһ¸ö»ò¶à¸öÈÎÒâ×Ö·û¡£ÔÚÒÀÀµÄ¿±êÖÐͬÑù¿ÉÒÔʹÓÃ"%"£¬Ö»ÊÇÒÀÀµÄ¿±êÖеÄ"%"µÄȡֵ£¬È¡¾öÓÚÆäÄ¿±ê¡£
ÓÐÒ»µãÐèҪעÒâµÄÊÇ£¬"%"µÄÕ¹¿ª·¢ÉúÔÚ±äÁ¿ºÍº¯ÊýµÄÕ¹¿ªÖ®ºó£¬±äÁ¿ºÍº¯ÊýµÄÕ¹¿ª·¢ÉúÔÚmakeÔØÈëMakefileʱ£¬¶øÄ£Ê½¹æÔòÖеÄ"%"Ôò·¢ÉúÔÚÔËÐÐʱ¡£
1¡¢Ä£Ê½¹æÔò½éÉÜ
ģʽ¹æÔòÖУ¬ÖÁÉÙÔÚ¹æÔòµÄÄ¿±ê¶¨ÒåÖÐÒª°üº¬"%"£¬·ñÔò£¬¾ÍÊÇÒ»°ãµÄ¹æÔò¡£Ä¿±êÖеÄ"%"¶¨Òå±íʾ¶ÔÎļþÃûµÄÆ¥Å䣬"%"±íʾ³¤¶ÈÈÎÒâµÄ·Ç¿Õ×Ö·û´®¡£ÀýÈ磺"%.c"±íʾÒÔ".c"½áβµÄÎļþÃû£¨ÎļþÃûµÄ³¤¶ÈÖÁÉÙΪ3£©£¬¶ø"s.%.c"Ôò±íʾÒÔ"s."¿ªÍ·£¬".c"½áβµÄÎļþÃû£¨ÎļþÃûµÄ³¤¶ÈÖÁÉÙΪ
5£©¡£
Èç¹û"%"¶¨ÒåÔÚÄ¿±êÖУ¬ÄÇô£¬Ä¿±êÖеÄ"%"µÄÖµ¾ö¶¨ÁËÒÀÀµÄ¿±êÖеÄ"%"µÄÖµ£¬Ò²¾ÍÊÇ˵£¬Ä¿±êÖеÄģʽµÄ"%"¾ö¶¨ÁËÒÀÀµÄ¿±êÖÐ"%"µÄÑù×Ó¡£ÀýÈçÓÐÒ»¸öģʽ¹æÔòÈçÏ£º
%.o : %.c ; <command ......>
Æäº¬ÒåÊÇ£¬Ö¸³öÁËÔõô´ÓËùÓеÄ[.c]ÎļþÉú³ÉÏàÓ¦µÄ[.o]ÎļþµÄ¹æÔò¡£Èç¹ûÒªÉú³ÉµÄÄ¿±êÊÇ"a.o
b.o"£¬ÄÇô"%c"¾ÍÊÇ"a.c b.c"¡£Ò»µ©ÒÀÀµÄ¿±êÖеÄ"%"ģʽ±»È·¶¨£¬ÄÇô£¬make»á±»ÒªÇóȥƥÅ䵱ǰĿ¼ÏÂËùÓеÄÎļþÃû£¬Ò»µ©ÕÒµ½£¬make¾Í»á¹æÔòϵÄÃüÁËùÒÔ£¬ÔÚģʽ¹æÔòÖУ¬Ä¿±ê¿ÉÄÜ»áÊǶà¸öµÄ£¬Èç¹ûÓÐģʽƥÅä³ö¶à¸öÄ¿±ê£¬make¾Í»á²úÉúËùÓеÄģʽĿ±ê£¬´Ëʱ£¬make¹ØÐĵÄÊÇÒÀÀµµÄÎļþÃûºÍÉú³ÉÄ¿±êµÄÃüÁîÕâÁ½¼þÊ¡£
2¡¢Ä£Ê½¹æÔòʾÀý
ÏÂÃæÕâ¸öÀý×Ó±íʾÁË,°ÑËùÓеÄ[.c]Îļþ¶¼±àÒë³É[.o]Îļþ.
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
ÆäÖУ¬"$@"±íʾËùÓеÄÄ¿±êµÄ°¤¸öÖµ£¬"$<"±íʾÁËËùÓÐÒÀÀµÄ¿±êµÄ°¤¸öÖµ¡£ÕâÐ©Ææ¹ÖµÄ±äÁ¿ÎÒÃǽÐ"×Ô¶¯»¯±äÁ¿"£¬ºóÃæ»áÏêϸ½²Êö¡£
ÏÂÃæµÄÕâ¸öÀý×ÓÖÐÓÐÁ½¸öÄ¿±êÊÇģʽµÄ£º
%.tab.c %.tab.h: %.y
bison -d $<
ÕâÌõ¹æÔò¸æËßmake°ÑËùÓеÄ[.y]Îļþ¶¼ÒÔ"bison -d <n>.y"Ö´ÐУ¬È»ºóÉú³É"<n>.tab.c"ºÍ"<n>.tab.h"Îļþ¡££¨ÆäÖУ¬"<n>"
±íʾһ¸öÈÎÒâ×Ö·û´®£©¡£Èç¹ûÎÒÃǵÄÖ´ÐгÌÐò"foo"ÒÀÀµÓÚÎļþ"parse.tab.o"ºÍ"scan.o"£¬²¢ÇÒÎļþ"scan.o"ÒÀÀµÓÚÎļþ"parse.tab.h"£¬Èç¹û"parse.y"Îļþ±»¸üÐÂÁË£¬ÄÇô¸ù¾ÝÉÏÊöµÄ¹æÔò£¬"bison-d
parse.y"¾Í»á±»Ö´ÐÐÒ»´Î£¬ÓÚÊÇ£¬"parse.tab.o"ºÍ"scan.o"µÄÒÀÀµÎļþ¾ÍÆëÁË¡££¨¼ÙÉ裬"parse.tab.o"ÓÉ"parse.tab.c"Éú³É£¬ºÍ"scan.o"ÓÉ"scan.c"Éú³É£¬¶ø"foo"ÓÉ"parse.tab.o"ºÍ"scan.o"Á´½ÓÉú³É£¬
¶øÇÒfooºÍÆä[.o]ÎļþµÄÒÀÀµ¹ØÏµÒ²Ð´ºÃ£¬ÄÇô£¬ËùÓеÄÄ¿±ê¶¼»áµÃµ½Âú×㣩
3¡¢×Ô¶¯»¯±äÁ¿
ÔÚÉÏÊöµÄģʽ¹æÔòÖУ¬Ä¿±êºÍÒÀÀµÎļþ¶¼ÊÇһϵÀýµÄÎļþ£¬ÄÇôÎÒÃÇÈçºÎÊéдһ¸öÃüÁîÀ´Íê³É´Ó²»Í¬µÄÒÀÀµÎļþÉú³ÉÏàÓ¦µÄÄ¿±ê£¿ÒòΪÔÚÿһ´ÎµÄ¶Ôģʽ¹æÔòµÄ½âÎöʱ£¬¶¼»áÊDz»Í¬µÄÄ¿±êºÍÒÀÀµÎļþ¡£×Ô¶¯»¯±äÁ¿¾ÍÊÇÍê³ÉÕâ¸ö¹¦Äܵġ£ÔÚÇ°Ãæ£¬ÎÒÃÇÒѾ¶Ô×Ô¶¯»¯±äÁ¿ÓÐËùÌáÉæ£¬ÏàÐÅÄã¿´µ½ÕâÀïÒѶÔËüÓÐÒ»¸ö¸ÐÐÔÈÏʶÁË¡£Ëùν×Ô¶¯»¯±äÁ¿£¬¾ÍÊÇÕâÖÖ±äÁ¿»á°ÑģʽÖÐËù¶¨ÒåµÄһϵÁеÄÎļþ×Ô¶¯µØ°¤¸öÈ¡³ö£¬Ö±ÖÁËùÓеķûºÏģʽµÄÎļþ¶¼È¡ÍêÁË¡£ÕâÖÖ×Ô¶¯»¯±äÁ¿Ö»Ó¦³öÏÖÔÚ¹æÔòµÄÃüÁîÖС£
ÏÂÃæÊÇËùÓеÄ×Ô¶¯»¯±äÁ¿¼°Æä˵Ã÷£º
$@
±íʾ¹æÔòÖеÄÄ¿±êÎļþ¼¯¡£ÔÚģʽ¹æÔòÖУ¬Èç¹ûÓжà¸öÄ¿±ê£¬ÄÇô£¬"$@"¾ÍÊÇÆ¥ÅäÓÚÄ¿±êÖÐģʽ¶¨ÒåµÄ¼¯ºÏ¡£
$%
½öµ±Ä¿±êÊǺ¯Êý¿âÎļþÖУ¬±íʾ¹æÔòÖеÄÄ¿±ê³ÉÔ±Ãû¡£ÀýÈ磬Èç¹ûÒ»¸öÄ¿±êÊÇ"foo.a(bar.o)"£¬ÄÇô£¬"$%"¾ÍÊÇ"bar.o"£¬"$@"¾ÍÊÇ"foo.a"¡£Èç¹ûÄ¿±ê²»ÊǺ¯Êý¿âÎļþ£¨UnixÏÂÊÇ
[.a]£¬WindowsÏÂÊÇ[.lib]£©£¬ÄÇô£¬ÆäֵΪ¿Õ¡£
$<
ÒÀÀµÄ¿±êÖеĵÚÒ»¸öÄ¿±êÃû×Ö¡£Èç¹ûÒÀÀµÄ¿±êÊÇÒÔģʽ£¨¼´"%"£©¶¨ÒåµÄ£¬ÄÇô"$<"½«ÊÇ·ûºÏģʽµÄһϵÁеÄÎļþ¼¯¡£×¢Ò⣬ÆäÊÇÒ»¸öÒ»¸öÈ¡³öÀ´µÄ¡£
$?
ËùÓбÈÄ¿±êеÄÒÀÀµÄ¿±êµÄ¼¯ºÏ¡£ÒÔ¿Õ¸ñ·Ö¸ô¡£
$^
ËùÓеÄÒÀÀµÄ¿±êµÄ¼¯ºÏ¡£ÒÔ¿Õ¸ñ·Ö¸ô¡£Èç¹ûÔÚÒÀÀµÄ¿±êÖÐÓжà¸öÖØ¸´µÄ£¬ÄǸöÕâ¸ö±äÁ¿»áÈ¥³ýÖØ¸´µÄÒÀÀµÄ¿±ê£¬Ö»±£ÁôÒ»·Ý¡£
$+
Õâ¸ö±äÁ¿ºÜÏñ"$^"£¬Ò²ÊÇËùÓÐÒÀÀµÄ¿±êµÄ¼¯ºÏ¡£Ö»ÊÇËü²»È¥³ýÖØ¸´µÄÒÀÀµÄ¿±ê¡£
$*
Õâ¸ö±äÁ¿±íʾĿ±êģʽÖÐ"%"¼°Æä֮ǰµÄ²¿·Ö¡£Èç¹ûÄ¿±êÊÇ"dir/a.foo.b"£¬²¢ÇÒÄ¿±êµÄģʽÊÇ"a.%.b"£¬ÄÇô£¬"$*"µÄÖµ¾ÍÊÇ"dir
/a.foo"¡£Õâ¸ö±äÁ¿¶ÔÓÚ¹¹ÔìÓйØÁªµÄÎļþÃûÊDZÈ
½ÏÓнϡ£Èç¹ûÄ¿±êÖÐûÓÐģʽµÄ¶¨Ò壬ÄÇô"$*"Ò²¾Í²»Äܱ»ÍƵ¼³ö£¬µ«ÊÇ£¬Èç¹ûÄ¿±êÎļþµÄºó׺ÊÇ
makeËùʶ±ðµÄ£¬ÄÇô"$*"¾ÍÊdzýÁ˺ó׺µÄÄÇÒ»²¿·Ö¡£ÀýÈ磺Èç¹ûÄ¿±êÊÇ"foo.c"£¬ÒòΪ".c"ÊÇmakeËùÄÜʶ±ðµÄºó׺Ãû£¬ËùÒÔ£¬"$*"µÄÖµ¾ÍÊÇ"foo"¡£Õâ¸öÌØÐÔÊÇGNU
makeµÄ£¬ºÜÓпÉÄܲ»¼æÈÝÓÚÆäËü°æ±¾µÄmake£¬ËùÒÔ£¬ÄãÓ¦¸Ã¾¡Á¿±ÜÃâʹÓÃ"$*"£¬³ý·ÇÊÇÔÚÒþº¬¹æÔò»òÊǾ²Ì¬Ä£Ê½ÖС£Èç¹ûÄ¿±êÖеĺó׺ÊÇmakeËù²»ÄÜʶ±ðµÄ£¬ÄÇô"$*"¾ÍÊÇ¿ÕÖµ¡£µ±ÄãÏ£ÍûÖ»¶Ô¸üйýµÄÒÀÀµÎļþ½øÐвÙ×÷ʱ£¬"$?"ÔÚÏÔʽ¹æÔòÖкÜÓÐÓã¬ÀýÈ磬¼ÙÉèÓÐÒ»¸öº¯Êý¿âÎļþ½Ð"lib"£¬ÆäÓÉÆäËü¼¸¸öobjectÎļþ¸üС£ÄÇô°ÑobjectÎļþ´ò°üµÄ±È½ÏÓÐЧÂʵÄMakefile¹æÔòÊÇ£º
lib : foo.o bar.o lose.o win.o
ar r lib $?
ÔÚÉÏÊöËùÁгöÀ´µÄ×Ô¶¯Á¿±äÁ¿ÖС£Ëĸö±äÁ¿£¨$@¡¢$<¡¢$%¡¢$*£©ÔÚÀ©Õ¹Ê±Ö»»áÓÐÒ»¸öÎļþ£¬¶øÁíÈý¸öµÄÖµÊÇÒ»¸öÎļþÁÐ±í¡£ÕâÆß¸ö×Ô¶¯»¯±äÁ¿»¹¿ÉÒÔÈ¡µÃÎļþµÄĿ¼Ãû»òÊÇÔÚµ±Ç°Ä¿Â¼ÏµķûºÏģʽµÄÎļþÃû£¬Ö»ÐèÒª´îÅäÉÏ"D"»ò"F"×ÖÑù¡£ÕâÊÇGNU
makeÖÐÀϰ汾µÄÌØÐÔ£¬ÔÚа汾ÖУ¬ÎÒÃÇʹÓú¯Êý"dir"»ò"notdir"¾Í¿ÉÒÔ×öµ½ÁË¡£"D"µÄº¬Òå¾ÍÊÇDirectory£¬¾ÍÊÇĿ¼£¬"F"µÄº¬Òå¾ÍÊÇFile£¬¾ÍÊÇÎļþ¡£
ÏÂÃæÊǶÔÓÚÉÏÃæµÄÆß¸ö±äÁ¿·Ö±ð¼ÓÉÏ"D"»òÊÇ"F"µÄº¬Ò壺
$(@D)
±íʾ"$@"µÄĿ¼²¿·Ö£¨²»ÒÔб¸Ü×÷Ϊ½á⣩£¬Èç¹û"$@"ÖµÊÇ"dir/foo.o"£¬ÄÇô"$(@D)"¾ÍÊÇ"dir"£¬¶øÈç¹û"$@"ÖÐûÓаüº¬Ð±¸ÜµÄ»°£¬ÆäÖµ¾ÍÊÇ"."£¨µ±Ç°Ä¿Â¼£©¡£
$(@F)
±íʾ"$@"µÄÎļþ²¿·Ö£¬Èç¹û"$@"ÖµÊÇ"dir/foo.o"£¬ÄÇô"$(@F)"¾ÍÊÇ"foo.o"£¬"$(@F)"Ï൱ÓÚº¯Êý"$(notdir$@)"¡£
"$(*D)"
"$(*F)"
ºÍÉÏÃæËùÊöµÄͬÀí£¬Ò²ÊÇÈ¡ÎļþµÄĿ¼²¿·ÖºÍÎļþ²¿·Ö¡£¶ÔÓÚÉÏÃæµÄÄǸöÀý×Ó£¬"$(*D)"·µ»Ø"dir"£¬¶ø"$(*F)"·µ»Ø"foo"
"$(%D)"
"$(%F)"
·Ö±ð±íʾÁ˺¯Êý°üÎļþ³ÉÔ±µÄĿ¼²¿·ÖºÍÎļþ²¿·Ö¡£Õâ¶ÔÓÚÐÎͬ"archive(member)"ÐÎʽµÄÄ¿±êÖеÄ"member"Öаüº¬Á˲»Í¬µÄĿ¼ºÜÓÐÓá£
"$(<D)"
"$(<F)"
·Ö±ð±íʾÒÀÀµÎļþµÄĿ¼²¿·ÖºÍÎļþ²¿·Ö¡£
"$(^D)"
"$(^F)"
·Ö±ð±íʾËùÓÐÒÀÀµÎļþµÄĿ¼²¿·ÖºÍÎļþ²¿·Ö¡££¨ÎÞÏàͬµÄ£©
"$(+D)"
"$(+F)"
·Ö±ð±íʾËùÓÐÒÀÀµÎļþµÄĿ¼²¿·ÖºÍÎļþ²¿·Ö¡££¨¿ÉÒÔÓÐÏàͬµÄ£©
"$(?D)"
"$(?F)"
·Ö±ð±íʾ±»¸üеÄÒÀÀµÎļþµÄĿ¼²¿·ÖºÍÎļþ²¿·Ö¡£
×îºóÏëÌáÐÑһϵÄÊÇ£¬¶ÔÓÚ"$<"£¬ÎªÁ˱ÜÃâ²úÉú²»±ØÒªµÄÂé·³£¬ÎÒÃÇ×îºÃ¸ø$ºóÃæµÄÄǸöÌØ¶¨×Ö·û¶¼¼ÓÉÏÔ²À¨ºÅ£¬±ÈÈ磬"$(<
)"¾ÍÒª±È"$<"ÒªºÃһЩ¡£»¹µÃҪעÒâµÄÊÇ£¬ÕâЩ±äÁ¿Ö»Ê¹ÓÃÔÚ¹æÔòµÄÃüÁîÖУ¬¶øÇÒÒ»°ã¶¼ÊÇ"ÏÔʽ¹æÔò"ºÍ"¾²Ì¬Ä£Ê½¹æÔò"£¨²Î¼ûÇ°Ãæ"Êéд¹æÔò"Ò»Õ£©¡£ÆäÔÚÒþº¬¹æÔòÖв¢Ã»ÓÐÒâÒå¡£
4¡¢Ä£Ê½µÄÆ¥Åä
Ò»°ãÀ´Ëµ£¬Ò»¸öÄ¿±êµÄģʽÓÐÒ»¸öÓÐǰ׺»òÊǺó׺µÄ"%"£¬»òÊÇûÓÐǰºó׺£¬Ö±½Ó¾ÍÊÇÒ»¸ö"%"¡£ÒòΪ"%"´ú±íÒ»¸ö»ò¶à¸ö×Ö·û£¬ËùÒÔÔÚ¶¨ÒåºÃÁ˵ÄģʽÖУ¬ÎÒÃǰÑ"%"ËùÆ¥ÅäµÄÄÚÈݽÐ×ö"¾¥"£¬ÀýÈç"%.c"ËùÆ¥ÅäµÄÎļþ"test.c"ÖÐ"test"¾ÍÊÇ"¾¥"¡£ÒòΪÔÚÄ¿±êºÍÒÀÀµÄ¿±êÖÐͬʱÓÐ"%"ʱ£¬ÒÀÀµÄ¿±êµÄ"¾¥"»á´«¸øÄ¿±ê£¬µ±×öÄ¿±êÖеÄ"¾¥"¡£
µ±Ò»¸öģʽƥÅä°üº¬ÓÐб¸Ü£¨Êµ¼ÊÒ²²»¾³£°üº¬£©µÄÎļþʱ£¬ÄÇôÔÚ½øÐÐģʽƥÅäʱ£¬Ä¿Â¼²¿·Ö»áÊ×Ïȱ»ÒÆ¿ª£¬È»ºó½øÐÐÆ¥Å䣬³É¹¦ºó£¬ÔÙ°ÑĿ¼¼Ó»ØÈ¥¡£ÔÚ½øÐÐ"¾¥"µÄ´«µÝʱ£¬ÎÒÃÇÐèÒªÖªµÀÕâ¸ö²½Öè¡£ÀýÈçÓÐÒ»¸öģʽ"e%t"£¬Îļþ"src/eat"
Æ¥ÅäÓÚ¸Ãģʽ£¬ÓÚÊÇ"src/a"¾ÍÊÇÆä"¾¥"£¬Èç¹ûÕâ¸öģʽ¶¨ÒåÔÚÒÀÀµÄ¿±êÖУ¬¶ø±»ÒÀÀµÓÚÕâ¸öģʽµÄÄ¿±êÖÐÓÖÓиöģʽ"c%r"£¬ÄÇô£¬Ä¿±ê¾ÍÊÇ"src/car"¡££¨"¾¥"±»´«µÝ£©
5¡¢ÖØÔØÄÚ½¨Òþº¬¹æÔò
Äã¿ÉÒÔÖØÔØÄÚ½¨µÄÒþº¬¹æÔò£¨»òÊǶ¨ÒåÒ»¸öÈ«Ðµģ©£¬ÀýÈçÄã¿ÉÒÔÖØÐ¹¹ÔìºÍÄÚ½¨Òþº¬¹æÔò²»Í¬µÄÃüÁÈ磺
%.o : %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) -D$(date)
Äã¿ÉÒÔÈ¡ÏûÄÚ½¨µÄÒþº¬¹æÔò£¬Ö»Òª²»ÔÚºóÃæÐ´ÃüÁî¾ÍÐС£È磺
%.o : %.s
ͬÑù£¬ÄãÒ²¿ÉÒÔÖØÐ¶¨ÒåÒ»¸öȫеÄÒþº¬¹æÔò£¬ÆäÔÚÒþº¬¹æÔòÖеÄλÖÃÈ¡¾öÓÚÄãÔÚÄÄÀïдÏÂÕâ¸ö¹æÔò¡£³¯Ç°µÄλÖþͿ¿Ç°¡£
Áù¡¢ÀÏʽ·ç¸ñµÄ"ºó׺¹æÔò"
ºó׺¹æÔòÊÇÒ»¸ö±È½ÏÀÏʽµÄ¶¨ÒåÒþº¬¹æÔòµÄ·½·¨¡£ºó׺¹æÔò»á±»Ä£Ê½¹æÔòÖð²½µØÈ¡´ú¡£ÒòΪģʽ¹æÔò¸üÇ¿¸üÇåÎú¡£ÎªÁ˺ÍÀϰ汾µÄMakefile¼æÈÝ£¬GNU
makeͬÑù¼æÈÝÓÚÕâЩ¶«Î÷¡£ºó׺¹æÔòÓÐÁ½ÖÖ·½Ê½£º"Ë«ºó׺"ºÍ"µ¥ºó׺"¡£Ë«ºó׺¹æÔò¶¨ÒåÁËÒ»¶Ôºó׺£ºÄ¿±êÎļþµÄºó׺ºÍÒÀÀµÄ¿±ê£¨Ô´Îļþ£©µÄºó׺¡£Èç".c.o"Ï൱ÓÚ"%o
: %c"¡£µ¥ºó׺¹æÔòÖ»¶¨ÒåÒ»¸öºó׺£¬Ò²¾ÍÊÇÔ´ÎļþµÄºó׺¡£Èç".c"Ï൱ÓÚ"%
: %.c"¡£
ºó׺¹æÔòÖÐËù¶¨ÒåµÄºó׺Ӧ¸ÃÊÇmakeËùÈÏʶµÄ£¬Èç¹ûÒ»¸öºó׺ÊÇmakeËùÈÏʶµÄ£¬ÄÇôÕâ¸ö¹æÔò¾ÍÊǵ¥ºó׺¹æÔò£¬¶øÈç¹ûÁ½¸öÁ¬ÔÚÒ»ÆðµÄºó׺¶¼±»makeËùÈÏʶ£¬ÄǾÍÊÇË«ºó׺¹æÔò¡£ÀýÈ磺".c"ºÍ".o"¶¼ÊÇmakeËùÖªµÀ¡£Òò¶ø£¬Èç¹ûÄ㶨ÒåÁËÒ»¸ö¹æÔòÊÇ".c.o"ÄÇôÆä¾ÍÊÇË«ºó׺¹æÔò£¬ÒâÒå¾ÍÊÇ".c"ÊÇÔ´ÎļþµÄºó׺£¬".o"ÊÇÄ¿±êÎļþµÄºó׺¡£ÈçÏÂʾÀý£º
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
ºó׺¹æÔò²»ÔÊÐíÈκεÄÒÀÀµÎļþ£¬Èç¹ûÓÐÒÀÀµÎļþµÄ»°£¬ÄǾͲ»ÊǺó׺¹æÔò£¬ÄÇЩºó׺ͳͳ±»ÈÏΪÊÇÎļþÃû£¬È磺
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
Õâ¸öÀý×Ó£¬¾ÍÊÇ˵£¬Îļþ".c.o"ÒÀÀµÓÚÎļþ"foo.h"£¬¶ø²»ÊÇÎÒÃÇÏëÒªµÄÕâÑù£º
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
ºó׺¹æÔòÖУ¬Èç¹ûûÓÐÃüÁÄÇÊǺÁÎÞÒâÒåµÄ¡£ÒòΪËûÒ²²»»áÒÆÈ¥ÄÚ½¨µÄÒþº¬¹æÔò¡£
¶øÒªÈÃmakeÖªµÀÒ»Ð©ÌØ¶¨µÄºó׺£¬ÎÒÃÇ¿ÉÒÔʹÓÃαĿ±ê".SUFFIXES"À´¶¨Òå»òÊÇɾ³ý£¬È磺.SUFFIXES:.hack
.win
°Ñºó׺.hackºÍ.win¼ÓÈëºó׺ÁбíÖеÄĩβ¡£
.SUFFIXES: # ɾ³ýĬÈϵĺó׺
.SUFFIXES: .c .o .h # ¶¨Òå×Ô¼ºµÄºó׺
ÏÈÇå³þĬÈϺó׺£¬ºó¶¨Òå×Ô¼ºµÄºó׺ÁÐ±í¡£
makeµÄ²ÎÊý"-r"»ò"-no-builtin-rules"Ò²»áʹÓõÃĬÈϵĺó׺ÁбíΪ¿Õ¡£¶ø±äÁ¿"SUFFIXE"±»ÓÃÀ´¶¨ÒåĬÈϵĺó׺ÁÐ±í£¬Äã¿ÉÒÔÓÃ".SUFFIXES"À´¸Ä±äºó׺ÁÐ±í£¬µ«Çë²»Òª¸Ä±ä±äÁ¿"SUFFIXE"µÄÖµ¡£
Æß¡¢Òþº¬¹æÔòËÑË÷Ëã·¨
±ÈÈçÎÒÃÇÓÐÒ»¸öÄ¿±ê½Ð T¡£ÏÂÃæÊÇËÑË÷Ä¿±êTµÄ¹æÔòµÄËã·¨¡£Çë×¢Ò⣬ÔÚÏÂÃæ£¬ÎÒÃÇûÓÐÌáµ½ºó׺¹æÔò£¬ÔÒòÊÇ£¬ËùÓеĺó׺¹æÔòÔÚMakefile±»ÔØÈëÄÚ´æÊ±£¬»á±»×ª»»³Éģʽ¹æÔò¡£Èç¹ûÄ¿±êÊÇ"archive(member)"µÄº¯Êý¿âÎļþģʽ£¬ÄÇôÕâ¸öËã·¨»á±»ÔËÐÐÁ½´Î£¬µÚÒ»´ÎÊÇÕÒÄ¿±êT£¬Èç¹ûûÓÐÕÒµ½µÄ»°£¬ÄÇô½øÈëµÚ¶þ´Î£¬µÚ¶þ´Î»á°Ñ"member"µ±×÷TÀ´ËÑË÷¡£
1¡¢°ÑTµÄĿ¼²¿·Ö·ÖÀë³öÀ´¡£½ÐD£¬¶øÊ£Óಿ·Ö½ÐN¡££¨È磺Èç¹ûTÊÇ"src/foo.o"£¬ÄÇô£¬D¾ÍÊÇ"src/"£¬N¾ÍÊÇ"foo.o"£©
2¡¢´´½¨ËùÓÐÆ¥ÅäÓÚT»òÊÇNµÄģʽ¹æÔòÁÐ±í¡£
3¡¢Èç¹ûÔÚģʽ¹æÔòÁбíÖÐÓÐÆ¥ÅäËùÓÐÎļþµÄģʽ£¬Èç"%"£¬ÄÇô´ÓÁбíÖÐÒÆ³ýÆäËüµÄģʽ¡£
4¡¢ÒƳýÁбíÖÐûÓÐÃüÁîµÄ¹æÔò¡£
5¡¢¶ÔÓÚµÚÒ»¸öÔÚÁбíÖеÄģʽ¹æÔò£º
1£©ÍƵ¼Æä"¾¥"S£¬SÓ¦¸ÃÊÇT»òÊÇNÆ¥ÅäÓÚģʽÖÐ"%"·Ç¿ÕµÄ²¿·Ö¡£
2£©¼ÆËãÒÀÀµÎļþ¡£°ÑÒÀÀµÎļþÖеÄ"%"¶¼Ìæ»»³É"¾¥"S¡£Èç¹ûÄ¿±êģʽÖÐûÓаüº¬Ð±¿ò×Ö·û£¬¶ø°ÑD¼ÓÔÚµÚÒ»¸öÒÀÀµÎļþµÄ¿ªÍ·¡£
3£©²âÊÔÊÇ·ñËùÓеÄÒÀÀµÎļþ¶¼´æÔÚ»òÊÇÀíµ±´æÔÚ¡££¨Èç¹ûÓÐÒ»¸öÎļþ±»¶¨Òå³ÉÁíÍâÒ»¸ö¹æÔòµÄÄ¿±êÎļþ£¬»òÕßÊÇÒ»¸öÏÔʽ¹æÔòµÄÒÀÀµÎļþ£¬ÄÇôÕâ¸öÎļþ¾Í½Ð"Àíµ±´æÔÚ"£©
4£©Èç¹ûËùÓеÄÒÀÀµÎļþ´æÔÚ»òÊÇÀíµ±´æÔÚ£¬»òÊǾÍûÓÐÒÀÀµÎļþ¡£ÄÇôÕâÌõ¹æÔò½«±»²ÉÓã¬Í˳ö¸ÃËã·¨¡£
6¡¢Èç¹û¾¹ýµÚ5²½£¬Ã»ÓÐģʽ¹æÔò±»ÕÒµ½£¬ÄÇô¾Í×ö¸ü½øÒ»²½µÄËÑË÷¡£¶ÔÓÚ´æÔÚÓÚÁбíÖеĵÚÒ»¸öģʽ¹æÔò£º
1£©Èç¹û¹æÔòÊÇÖÕÖ¹¹æÔò£¬ÄǾͺöÂÔËü£¬¼ÌÐøÏÂÒ»Ìõģʽ¹æÔò¡£
2£©¼ÆËãÒÀÀµÎļþ¡££¨Í¬µÚ5²½£©
3£©²âÊÔËùÓеÄÒÀÀµÎļþÊÇ·ñ´æÔÚ»òÊÇÀíµ±´æÔÚ¡£
4£©¶ÔÓÚ²»´æÔÚµÄÒÀÀµÎļþ£¬µÝ¹éµ÷ÓÃÕâ¸öËã·¨²éÕÒËûÊÇ·ñ¿ÉÒÔ±»Òþº¬¹æÔòÕÒµ½¡£
5£©Èç¹ûËùÓеÄÒÀÀµÎļþ´æÔÚ»òÊÇÀíµ±´æÔÚ£¬»òÊǾ͸ù±¾Ã»ÓÐÒÀÀµÎļþ¡£ÄÇôÕâÌõ¹æÔò±»²ÉÓã¬Í˳ö¸ÃËã·¨¡£
7¡¢Èç¹ûûÓÐÒþº¬¹æÔò¿ÉÒÔʹÓ㬲鿴".DEFAULT"¹æÔò£¬Èç¹ûÓУ¬²ÉÓ㬰Ñ".DEFAULT"µÄÃüÁî¸øTʹÓá£
Ò»µ©¹æÔò±»ÕÒµ½£¬¾Í»áÖ´ÐÐÆäÏ൱µÄÃüÁ¶ø´Ëʱ£¬ÎÒÃǵÄ×Ô¶¯»¯±äÁ¿µÄÖµ²Å»áÉú³É¡£
ʹÓÃmake¸üк¯Êý¿âÎļþ
º¯Êý¿âÎļþÒ²¾ÍÊǶÔObjectÎļþ£¨³ÌÐò±àÒëµÄÖмäÎļþ£©µÄ´ò°üÎļþ¡£ÔÚUnixÏ£¬Ò»°ãÊÇÓÉÃüÁî"ar"À´Íê³É´ò°ü¹¤×÷¡£
Ò»¡¢º¯Êý¿âÎļþµÄ³ÉÔ±
Ò»¸öº¯Êý¿âÎļþÓɶà¸öÎļþ×é³É¡£Äã¿ÉÒÔÒÔÈçϸñʽָ¶¨º¯Êý¿âÎļþ¼°Æä×é³É£º
archive(member)
Õâ¸ö²»ÊÇÒ»¸öÃüÁ¶øÒ»¸öÄ¿±êºÍÒÀÀµµÄ¶¨Òå¡£Ò»°ãÀ´Ëµ£¬ÕâÖÖÓ÷¨»ù±¾ÉϾÍÊÇΪÁË"ar"ÃüÁîÀ´·þÎñµÄ¡£È磺
foolib(hack.o) : hack.o
ar cr foolib hack.o
Èç¹ûÒªÖ¸¶¨¶à¸ömember£¬ÄǾÍÒÔ¿Õ¸ñ·Ö¿ª£¬È磺
foolib(hack.o kludge.o)
ÆäµÈ¼ÛÓÚ£º
foolib(hack.o) foolib(kludge.o)
Ä㻹¿ÉÒÔʹÓÃShellµÄÎļþͨÅä·ûÀ´¶¨Ò壬È磺
foolib(*.o)
¶þ¡¢º¯Êý¿â³ÉÔ±µÄÒþº¬¹æÔò
µ± makeËÑË÷Ò»¸öÄ¿±êµÄÒþº¬¹æÔòʱ£¬Ò»¸öÌØÊâµÄÌØÐÔÊÇ£¬Èç¹ûÕâ¸öÄ¿±êÊÇ"a(m)"ÐÎʽµÄ£¬Æä»á°ÑÄ¿±ê±ä³É"(m)"¡£ÓÚÊÇ£¬Èç¹ûÎÒÃǵijÉÔ±ÊÇ"%.o"
µÄģʽ¶¨Ò壬²¢ÇÒÈç¹ûÎÒÃÇʹÓÃ"makefoo.a(bar.o)"µÄÐÎʽµ÷ÓÃMakefileʱ£¬Òþº¬¹æÔò»áÈ¥ÕÒ"bar.o"µÄ¹æÔò£¬Èç¹ûûÓж¨Òåbar.oµÄ¹æÔò£¬ÄÇôÄÚ½¨Òþº¬¹æÔòÉúЧ£¬make»áÈ¥ÕÒbar.cÎļþÀ´Éú³Ébar.o£¬Èç¹ûÕҵõ½µÄ»°£¬makeÖ´ÐеÄÃüÁî´óÖÂÈçÏ£º
cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o
»¹ÓÐÒ»¸ö±äÁ¿Òª×¢ÒâµÄÊÇ"$%"£¬ÕâÊÇרÊôº¯Êý¿âÎļþµÄ×Ô¶¯»¯±äÁ¿£¬ÓÐ¹ØÆä˵Ã÷Çë²Î¼û"×Ô¶¯»¯±äÁ¿"Ò»½Ú¡£
Èý¡¢º¯Êý¿âÎļþµÄºó׺¹æÔò
Äã¿ÉÒÔʹÓÃ"ºó׺¹æÔò"ºÍ"Òþº¬¹æÔò"À´Éú³Éº¯Êý¿â´ò°üÎļþ£¬È磺
.c.a:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
ÆäµÈЧÓÚ£º
(%.o) : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
ËÄ¡¢×¢ÒâÊÂÏî
ÔÚ½øÐк¯Êý¿â´ò°üÎļþÉú³Éʱ£¬ÇëСÐÄʹÓÃmakeµÄ²¢ÐлúÖÆ£¨"-j"²ÎÊý£©¡£Èç¹û¶à¸öarÃüÁîÔÚͬһʱ¼äÔËÐÐÔÚͬһ¸öº¯Êý¿â´ò°üÎļþÉÏ£¬¾ÍºÜÓпÉÒÔËð»µÕâ¸öº¯Êý¿âÎļþ¡£ËùÒÔ£¬ÔÚmakeδÀ´µÄ°æ±¾ÖУ¬Ó¦¸ÃÌṩһÖÖ»úÖÆÀ´±ÜÃâ²¢ÐвÙ×÷·¢ÉúÔÚº¯Êý´ò°üÎļþÉÏ¡£
µ«¾ÍĿǰ¶øÑÔ£¬Ä㻹ÊÇÓ¦¸Ã²»Òª¾¡Á¿²»ÒªÊ¹ÓÃ"-j"²ÎÊý¡£
ºóÐò
ÖÕÓÚµ½Ð´½áÊøÓïµÄʱºòÁË£¬ÒÔÉÏ»ù±¾ÉϾÍÊÇGNU makeµÄMakefileµÄËùÓÐϸ½ÚÁË¡£ÆäËüµÄ²úÉ̵Ämake»ù±¾ÉÏÒ²¾ÍÊÇÕâÑùµÄ£¬ÎÞÂÛʲôÑùµÄmake£¬¶¼ÊÇÒÔÎļþµÄÒÀÀµÐÔΪ»ù´¡µÄ£¬Æä»ù±¾ÊǶ¼ÊÇ×ñÑÒ»¸ö±ê×¼µÄ¡£ÕâÆªÎĵµÖÐ80%µÄ¼¼Êõϸ½Ú¶¼ÊÊÓÃÓÚÈκεÄmake£¬ÎҲ²â"º¯Êý"ÄÇÒ»ÕµÄÄÚÈÝ¿ÉÄܲ»ÊÇÆäËümakeËùÖ§³ÖµÄ£¬¶øÒþº¬¹æÔò·½Ã棬ÎÒÏ벻ͬµÄmake»áÓв»Í¬µÄʵÏÖ£¬ÎÒûÓо«Á¦À´²é¿´GNUµÄmakeºÍVCµÄnmake¡¢BCBµÄmake£¬»òÊDZðµÄUNIXϵÄmakeÓÐЩʲôÑùµÄ²î±ð£¬Ò»ÊÇʱ¼ä¾«Á¦²»¹»£¬¶þÊÇÒòΪÎÒ»ù±¾É϶¼ÊÇÔÚUnixÏÂʹÓÃmake£¬ÒÔǰÔÚSCOUnixºÍIBMµÄAIX£¬ÏÖÔÚÔÚLinux¡¢Solaris¡¢HP-UX¡¢AIXºÍAlphaÏÂʹÓã¬LinuxºÍSolarisϸü¶àÒ»µã¡£²»¹ý£¬ÎÒ¿ÉÒԿ϶¨µÄÊÇ£¬ÔÚUnixϵÄmake£¬ÎÞÂÛÊÇÄÄÖÖÆ½Ì¨£¬¼¸ºõ¶¼Ê¹ÓÃÁËRichard
Stallman¿ª·¢µÄmakeºÍcc/gccµÄ±àÒëÆ÷£¬¶øÇÒ£¬»ù±¾É϶¼ÊÇGNUµÄmake£¨¹«Ë¾ÀïËùÓеÄUNIX»úÆ÷É϶¼±»×°ÉÏÁËGNUµÄ¶«Î÷£¬ËùÒÔ£¬Ê¹ÓÃGNUµÄ³ÌÐòÒ²¾Í¶àÁËһЩ£©¡£GNUµÄ¶«Î÷»¹ÊǺܲ»´íµÄ£¬ÌرðÊÇʹÓõÃÉîÁËÒÔºó£¬Ô½À´Ô½¾õµÃGNUµÄÈí¼þµÄÇ¿´ó£¬Ò²Ô½À´Ô½¾õµÃGNUµÄÔÚ²Ù×÷ϵͳÖУ¨Ö÷ÒªÊÇUnix£¬ÉõÖÁWindows£©"ɱÉËÁ¦"¡£
¶ÔÓÚÉÏÊöËùÓеÄmakeµÄϸ½Ú£¬ÎÒÃDz»µ«¿ÉÒÔÀûÓÃmakeÕâ¸ö¹¤¾ßÀ´±àÒëÎÒÃǵijÌÐò£¬»¹¿ÉÒÔÀûÓÃmakeÀ´Íê³ÉÆäËüµÄ¹¤×÷£¬ÒòΪ¹æÔòÖеÄÃüÁî¿ÉÒÔÊÇÈκÎShell֮ϵÄÃüÁËùÒÔ£¬ÔÚUnixÏ£¬Äã²»Ò»¶¨Ö»ÊÇʹÓóÌÐòÓïÑԵıàÒëÆ÷£¬Ä㻹¿ÉÒÔÔÚMakefileÖÐÊéдÆäËüµÄÃüÁÈ磺tar¡¢awk¡¢mail¡¢sed¡¢cvs¡¢compress¡¢ls¡¢rm¡¢yacc¡¢rpm¡¢
ftp¡¡µÈµÈ£¬µÈµÈ£¬À´Íê³ÉÖîÈç"³ÌÐò´ò°ü"¡¢"³ÌÐò±¸·Ý"¡¢"ÖÆ×÷³ÌÐò°²×°°ü"¡¢"Ìá½»´úÂë"¡¢"ʹÓóÌÐòÄ£°å"¡¢"ºÏ²¢Îļþ"µÈµÈÎ廨°ËÃŵŦÄÜ£¬Îļþ²Ù×÷£¬Îļþ¹ÜÀí£¬±à³Ì¿ª·¢Éè¼Æ£¬»òÊÇÆäËüһЩÒìÏëÌ쿪µÄ¶«Î÷¡£±ÈÈ磬ÒÔǰÔÚÊéÐ´ÒøÐн»Ò׳ÌÐòʱ£¬ÓÉÓÚÒøÐеĽ»Ò׳ÌÐò»ù±¾Ò»Ñù£¬¾Í¼ûµ½ÓÐÈËÊéдÁËһЩ½»Ò×µÄͨÓóÌÐòÄ£°å£¬ÔÚ¸ÃÄ£°åÖаÑÒ»Ð©ÍøÂçͨѶ¡¢Êý¾Ý¿â²Ù×÷µÄ¡¢ÒµÎñ²Ù×÷¹²ÐԵĶ«Î÷дÔÚÒ»¸öÎļþÖУ¬ÔÚÕâЩÎļþÖÐÓÃЩÖîÈç"@@@N¡¢###N"Ææ¹Ö×Ö´®±êעһЩλÖã¬È»ºóÊéд½»Ò×ʱ£¬Ö»Ðè°´ÕÕÒ»ÖÖÌØ¶¨µÄ¹æÔòÊéÐ´ÌØ¶¨µÄ´¦Àí£¬×îºóÔÚmakeʱ£¬Ê¹ÓÃawkºÍsed£¬°ÑÄ£°åÖеÄ"@@@N¡¢###N"µÈ×Ö´®Ìæ´ú³ÉÌØ¶¨µÄ³ÌÐò£¬ÐγÉCÎļþ£¬È»ºóÔÙ±àÒë¡£Õâ¸ö¶¯×÷ºÜÏñÊý¾Ý¿âµÄ"À©Õ¹C"ÓïÑÔ£¨¼´ÔÚCÓïÑÔÖÐÓÃ"EXEC¡¡SQL"µÄÑù×ÓÖ´ÐÐSQLÓï¾ä£¬ÔÚÓÃ
cc/gcc±àÒë֮ǰ£¬ÐèҪʹÓÃ"À©Õ¹C"µÄ·Òë³ÌÐò£¬Èçcpre£¬°ÑÆä·Òë³É±ê×¼C£©¡£Èç¹ûÄãÔÚʹÓÃmakeʱÓÐһЩ¸üΪ¾øÃîµÄ·½·¨£¬Çë¼ÇµÃ¸æËßÎÒ°¡¡£
»ØÍ·¿´¿´ÕûƪÎĵµ£¬²»¾õ¼ÇÆð¼¸Äêǰ¸Õ¸Õ¿ªÊ¼ÔÚUnixÏÂ×ö¿ª·¢µÄʱºò£¬ÓÐÈËÎÊÎһ᲻»áдMakefileʱ£¬ÎÒÁ½ÑÛ·¢Ö±£¬¸ù±¾²»ÖªµÀÔÚ˵ʲô¡£Ò»¿ªÊ¼¿´µ½±ðÈËÔÚviÖÐдÍê³ÌÐòºóÊäÈë"!make"ʱ£¬»¹ÒÔΪÊÇviµÄ¹¦ÄÜ£¬ºóÀ´²ÅÖªµÀÓÐÒ»¸öMakefileÔÚ×÷¹Ö£¬ÓÚÊÇÉÏÍø²é°¡²é£¬ÄÇʱÓÖ²»Ô¸Òâ¿´Ó¢ÎÄ£¬·¢Ï־͸ù±¾Ã»ÓÐÖÐÎĵÄÎĵµ½éÉÜMakefile£¬Ö»µÃ¿´±ðÈËдµÄMakefile£¬×Ô¼ºÏ¹ÅöϹ¸ã²Å»ýÀÛÁËÒ»µã֪ʶ£¬µ«ÔÚºÜ¶àµØ·½ÍêÈ«ÊÇÖªÆäÈ»²»ÖªËùÒÔÈ»¡£ºóÀ´¿ªÊ¼´ÓÊÂUNIXϲúÆ·Èí¼þµÄ¿ª·¢£¬¿´µ½Ò»¸ö400ÈËÄ꣬½ü200ÍòÐдúÂëµÄ´ó¹¤³Ì£¬·¢ÏÖÒª±àÒëÕâÑùÒ»¸öÅÓÈ»´óÎÈç¹ûûÓÐMakefile£¬ÄÇ»áÊǶàô¿Ö²ÀµÄÒ»Ñùʰ¡¡£ÓÚÊǺáÏÂÐÄÀ´£¬ºÝÃüµØ¶ÁÁËÒ»¶ÑÓ¢ÎÄÎĵµ£¬²Å¾õµÃ¶ÔÆäÕÆÎÕÁË¡£µ«·¢ÏÖÄ¿Ç°ÍøÉ϶ÔMakefile½éÉܵÄÎÄÕ»¹ÊÇÉÙµÃÄÇôµÄ¿ÉÁ¯£¬ËùÒÔÏëдÕâÑùһƪÎÄÕ£¬¹²Ïí¸ø´ó¼Ò£¬Ï£ÍûÄܶԸ÷λÓÐËù°ïÖú¡£
|