±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÈîÒ»·åµÄÍøÂçÈÕÖ¾,±¾ÎĽéÉÜMakeÃüÁîµÄÓ÷¨£¬ÈκÎֻҪij¸öÎļþÓб仯£¬¾ÍÒªÖØÐ¹¹½¨µÄÏîÄ¿£¬¶¼¿ÉÒÔÓÃMake¹¹½¨¡£ |
|
MakeÊÇ×î³£ÓõĹ¹½¨¹¤¾ß£¬µ®ÉúÓÚ1977Ä꣬Ö÷ÒªÓÃÓÚCÓïÑÔµÄÏîÄ¿¡£µ«ÊÇʵ¼ÊÉÏ
£¬ÈκÎֻҪij¸öÎļþÓб仯£¬¾ÍÒªÖØÐ¹¹½¨µÄÏîÄ¿£¬¶¼¿ÉÒÔÓÃMake¹¹½¨¡£
±¾ÎĽéÉÜMakeÃüÁîµÄÓ÷¨£¬´Ó¼òµ¥µÄ½²Æð£¬²»ÐèÒªÈκλù´¡£¬Ö»Òª»áʹÓÃÃüÁîÐУ¬¾ÍÄÜ¿´¶®¡£ÎҵIJο¼×ÊÁÏÖ÷ÒªÊÇIsaac
SchlueterµÄ¡¶MakefileÎļþ½Ì³Ì¡·ºÍ¡¶GNU MakeÊֲᡷ¡£

Ò»¡¢MakeµÄ¸ÅÄî
MakeÕâ¸ö´Ê£¬Ó¢ÓïµÄÒâ˼ÊÇ"ÖÆ×÷"¡£MakeÃüÁîÖ±½ÓÓÃÁËÕâ¸öÒâ˼£¬¾ÍÊÇÒª×ö³öij¸öÎļþ¡£±ÈÈ磬Ҫ×ö³öÎļþa.txt£¬¾Í¿ÉÒÔÖ´ÐÐÏÂÃæµÄÃüÁî¡£
µ«ÊÇ£¬Èç¹ûÄãÕæµÄÊäÈëÕâÌõÃüÁËü²¢²»»áÆð×÷Óá£ÒòΪMakeÃüÁî±¾Éí²¢²»ÖªµÀ£¬ÈçºÎ×ö³öa.txt£¬ÐèÒªÓÐÈ˸æËßËü£¬ÈçºÎµ÷ÓÃÆäËûÃüÁîÍê³ÉÕâ¸öÄ¿±ê¡£
±ÈÈ磬¼ÙÉèÎļþ a.txt ÒÀÀµÓÚ b.txt ºÍ c.txt £¬ÊǺóÃæÁ½¸öÎļþÁ¬½Ó£¨catÃüÁµÄ²úÎï¡£ÄÇô£¬make
ÐèÒªÖªµÀÏÂÃæµÄ¹æÔò¡£
a.txt:
b.txt c.txt
cat b.txt c.txt > a.txt |
Ò²¾ÍÊÇ˵£¬make a.txt ÕâÌõÃüÁîµÄ±³ºó£¬Êµ¼ÊÉÏ·Ö³ÉÁ½²½£ºµÚÒ»²½£¬È·ÈÏ b.txt ºÍ c.txt
±ØÐëÒѾ´æÔÚ£¬µÚ¶þ²½Ê¹Óà cat ÃüÁî ½«Õâ¸öÁ½¸öÎļþºÏ²¢£¬Êä³öΪÐÂÎļþ¡£
ÏñÕâÑùµÄ¹æÔò£¬¶¼Ð´ÔÚÒ»¸ö½Ð×öMakefileµÄÎļþÖУ¬MakeÃüÁîÒÀÀµÕâ¸öÎļþ½øÐй¹½¨¡£MakefileÎļþÒ²¿ÉÒÔдΪmakefile£¬
»òÕßÓÃÃüÁîÐвÎÊýÖ¸¶¨ÎªÆäËûÎļþÃû¡£
$ make -f rules.txt
# »òÕß
$ make --file=rules.txt
|
ÉÏÃæ´úÂëÖ¸¶¨makeÃüÁîÒÀ¾Ýrules.txtÎļþÖеĹæÔò£¬½øÐй¹½¨¡£
×ÜÖ®£¬makeÖ»ÊÇÒ»¸ö¸ù¾ÝÖ¸¶¨µÄShellÃüÁî½øÐй¹½¨µÄ¹¤¾ß¡£ËüµÄ¹æÔòºÜ¼òµ¥£¬Äã¹æ¶¨Òª¹¹½¨ÄĸöÎļþ¡¢ËüÒÀÀµÄÄЩԴÎļþ£¬µ±ÄÇЩÎļþÓб䶯ʱ£¬ÈçºÎÖØÐ¹¹½¨Ëü¡£
¶þ¡¢MakefileÎļþµÄ¸ñʽ
¹¹½¨¹æÔò¶¼Ð´ÔÚMakefileÎļþÀïÃæ£¬ÒªÑ§»áÈçºÎMakeÃüÁ¾Í±ØÐëѧ»áÈçºÎ±àдMakefileÎļþ¡£
2.1 ¸ÅÊö
MakefileÎļþÓÉһϵÁйæÔò£¨rules£©¹¹³É¡£Ã¿Ìõ¹æÔòµÄÐÎʽÈçÏ¡£
<target> : <prerequisites>
[tab] <commands>
|
ÉÏÃæµÚÒ»ÐÐðºÅÇ°ÃæµÄ²¿·Ö£¬½Ð×ö"Ä¿±ê"£¨target£©£¬Ã°ºÅºóÃæµÄ²¿·Ö½Ð×ö"ǰÖÃÌõ¼þ"£¨prerequisites£©£»µÚ¶þÐбØÐëÓÉÒ»¸ötab¼üÆðÊ×£¬ºóÃæ¸ú×Å"ÃüÁî"£¨commands£©¡£
"Ä¿±ê"ÊDZØÐèµÄ£¬²»¿ÉÊ¡ÂÔ£»"ǰÖÃÌõ¼þ"ºÍ"ÃüÁî"¶¼ÊÇ¿ÉÑ¡µÄ£¬µ«ÊÇÁ½ÕßÖ®ÖбØÐëÖÁÉÙ´æÔÚÒ»¸ö¡£
ÿÌõ¹æÔò¾ÍÃ÷È·Á½¼þÊ£º¹¹½¨Ä¿±êµÄǰÖÃÌõ¼þÊÇʲô£¬ÒÔ¼°ÈçºÎ¹¹½¨¡£ÏÂÃæ¾ÍÏêϸ½²½â£¬Ã¿Ìõ¹æÔòµÄÕâÈý¸ö×é³É²¿·Ö¡£
2.2 Ä¿±ê£¨target£©
Ò»¸öÄ¿±ê£¨target£©¾Í¹¹³ÉÒ»Ìõ¹æÔò¡£Ä¿±êͨ³£ÊÇÎļþÃû£¬Ö¸Ã÷MakeÃüÁîËùÒª¹¹½¨µÄ¶ÔÏ󣬱ÈÈçÉÏÎĵÄ
a.txt ¡£Ä¿±ê¿ÉÒÔÊÇÒ»¸öÎļþÃû£¬Ò²¿ÉÒÔÊǶà¸öÎļþÃû£¬Ö®¼äÓÿոñ·Ö¸ô¡£
³ýÁËÎļþÃû£¬Ä¿±ê»¹¿ÉÒÔÊÇij¸ö²Ù×÷µÄÃû×Ö£¬Õâ³ÆÎª"αĿ±ê"£¨phony target£©¡£
ÉÏÃæ´úÂëµÄÄ¿±êÊÇclean£¬Ëü²»ÊÇÎļþÃû£¬¶øÊÇÒ»¸ö²Ù×÷µÄÃû×Ö£¬ÊôÓÚ"αĿ±ê "£¬×÷ÓÃÊÇɾ³ý¶ÔÏóÎļþ¡£
µ«ÊÇ£¬Èç¹ûµ±Ç°Ä¿Â¼ÖУ¬ÕýºÃÓÐÒ»¸öÎļþ½Ð×öclean£¬ÄÇôÕâ¸öÃüÁî²»»áÖ´ÐС£ÒòΪMake·¢ÏÖcleanÎļþÒѾ´æÔÚ£¬¾ÍÈÏΪûÓбØÒªÖØÐ¹¹½¨ÁË£¬¾Í²»»áÖ´ÐÐÖ¸¶¨µÄrmÃüÁî¡£
ΪÁ˱ÜÃâÕâÖÖÇé¿ö£¬¿ÉÒÔÃ÷È·ÉùÃ÷cleanÊÇ"αĿ±ê"£¬Ð´·¨ÈçÏ¡£
.PHONY:
clean
clean:
rm *.o temp |
ÉùÃ÷cleanÊÇ"αĿ±ê"Ö®ºó£¬make¾Í²»»áÈ¥¼ì²éÊÇ·ñ´æÔÚÒ»¸ö½Ð×öcleanµÄÎļþ£¬¶øÊÇÿ´ÎÔËÐж¼Ö´ÐжÔÓ¦µÄÃüÁî¡£Ïñ.PHONYÕâÑùµÄÄÚÖÃÄ¿±êÃû»¹Óв»ÉÙ£¬¿ÉÒԲ鿴Êֲᡣ
Èç¹ûMakeÃüÁîÔËÐÐʱûÓÐÖ¸¶¨Ä¿±ê£¬Ä¬ÈÏ»áÖ´ÐÐMakefileÎļþµÄµÚÒ»¸öÄ¿±ê¡£
ÉÏÃæ´úÂëÖ´ÐÐMakefileÎļþµÄµÚÒ»¸öÄ¿±ê¡£
2.3 ǰÖÃÌõ¼þ£¨prerequisites£©
ǰÖÃÌõ¼þͨ³£ÊÇÒ»×éÎļþÃû£¬Ö®¼äÓÿոñ·Ö¸ô¡£ËüÖ¸¶¨ÁË"Ä¿±ê"ÊÇ·ñÖØÐ¹¹½¨µÄÅжϱê×¼£ºÖ»ÒªÓÐÒ»¸öǰÖÃÎļþ²»´æÔÚ£¬»òÕßÓйý¸üУ¨Ç°ÖÃÎļþµÄlast-modificationʱ¼ä´Á±ÈÄ¿±êµÄʱ¼ä´ÁУ©£¬"Ä¿±ê"¾ÍÐèÒªÖØÐ¹¹½¨¡£
result.txt:
source.txt
cp source.txt result.txt |
ÉÏÃæ´úÂëÖУ¬¹¹½¨ result.txt µÄǰÖÃÌõ¼þÊÇ source.txt ¡£Èç¹ûµ±Ç°Ä¿Â¼ÖУ¬source.txt
ÒѾ´æÔÚ£¬ÄÇômake result.txt¿ÉÒÔÕý³£ÔËÐУ¬·ñÔò±ØÐëÔÙдһÌõ¹æÔò£¬À´Éú³É source.txt
¡£
source.txt:
echo "this is the source" > source.txt |
ÉÏÃæ´úÂëÖУ¬source.txtºóÃæÃ»ÓÐǰÖÃÌõ¼þ£¬¾ÍÒâζ×ÅËü¸úÆäËûÎļþ¶¼Î޹أ¬Ö»ÒªÕâ¸öÎļþ»¹²»´æÔÚ£¬Ã¿´Îµ÷ÓÃmake
source.txt£¬Ëü¶¼»áÉú³É¡£
$ make result.txt
$ make result.txt
|
ÉÏÃæÃüÁîÁ¬ÐøÖ´ÐÐÁ½´Îmake result.txt¡£µÚÒ»´ÎÖ´ÐлáÏÈн¨ source.txt£¬È»ºóÔÙн¨
result.txt¡£µÚ¶þ´ÎÖ´ÐУ¬Make·¢ÏÖ source.txt ûÓб䶯£¨Ê±¼ä´ÁÍíÓÚ result.txt£©£¬¾Í²»»áÖ´ÐÐÈκβÙ×÷£¬result.txt
Ò²²»»áÖØÐÂÉú³É¡£
Èç¹ûÐèÒªÉú³É¶à¸öÎļþ£¬ÍùÍù²ÉÓÃÏÂÃæµÄд·¨¡£
source:
file1 file2 file3 |
ÉÏÃæ´úÂëÖУ¬source ÊÇÒ»¸öαĿ±ê£¬Ö»ÓÐÈý¸öǰÖÃÎļþ£¬Ã»ÓÐÈκζÔÓ¦µÄÃüÁî¡£
Ö´ÐÐmake sourceÃüÁîºó£¬¾Í»áÒ»´ÎÐÔÉú³É file1£¬file2£¬file3
Èý¸öÎļþ¡£Õâ±ÈÏÂÃæµÄд·¨Òª·½±ãºÜ¶à¡£
$
make file1
$ make file2
$ make file3 |
2.4 ÃüÁcommands£©
ÃüÁcommands£©±íʾÈçºÎ¸üÐÂÄ¿±êÎļþ£¬ÓÉÒ»Ðлò¶àÐеÄShellÃüÁî×é³É¡£ËüÊǹ¹½¨"Ä¿±ê"µÄ¾ßÌåÖ¸ÁËüµÄÔËÐнá¹ûͨ³£¾ÍÊÇÉú³ÉÄ¿±êÎļþ¡£
ÿÐÐÃüÁî֮ǰ±ØÐëÓÐÒ»¸ötab¼ü¡£Èç¹ûÏëÓÃÆäËû¼ü£¬¿ÉÒÔÓÃÄÚÖñäÁ¿.RECIPEPREFIXÉùÃ÷¡£
.RECIPEPREFIX
= >
all:
> echo Hello, world |
ÉÏÃæ´úÂëÓÃ.RECIPEPREFIXÖ¸¶¨£¬´óÓںţ¨>£©Ìæ´útab¼ü¡£ËùÒÔ£¬Ã¿Ò»ÐÐÃüÁîµÄÆðÊ×±ä³ÉÁË´óÓںţ¬¶ø²»ÊÇtab¼ü¡£
ÐèҪעÒâµÄÊÇ£¬Ã¿ÐÐÃüÁîÔÚÒ»¸öµ¥¶ÀµÄshellÖÐÖ´ÐС£ÕâЩShellÖ®¼äûÓм̳йØÏµ¡£
var-lost:
export foo=bar
echo "foo=[$$foo]" |
ÉÏÃæ´úÂëÖ´Ðкó£¨make var-lost£©£¬È¡²»µ½fooµÄÖµ¡£ÒòΪÁ½ÐÐÃüÁîÔÚÁ½¸ö²»Í¬µÄ½ø³ÌÖ´ÐС£Ò»¸ö½â¾ö°ì·¨Êǽ«Á½ÐÐÃüÁîдÔÚÒ»ÐУ¬ÖмäÓ÷ֺŷָô¡£
var-kept:
export foo=bar; echo "foo=[$$foo]"
|
ÁíÒ»¸ö½â¾ö°ì·¨ÊÇÔÚ»»Ðзûǰ¼Ó·´Ð±¸ÜתÒå¡£
var-kept:
export foo=bar; \
echo "foo=[$$foo]"
|
×îºóÒ»¸ö·½·¨ÊǼÓÉÏ.ONESHELL:ÃüÁî¡£
.ONESHELL:
var-kept:
export foo=bar;
echo "foo=[$$foo]"
|
Èý¡¢MakefileÎļþµÄÓï·¨
3.1 ×¢ÊÍ
¾®ºÅ£¨#£©ÔÚMakefileÖбíʾעÊÍ¡£
# ÕâÊÇ×¢ÊÍ
result.txt: source.txt
# ÕâÊÇ×¢ÊÍ
cp source.txt result.txt # ÕâÒ²ÊÇ×¢ÊÍ
|
3.2 »ØÉù£¨echoing£©
Õý³£Çé¿öÏ£¬make»á´òӡÿÌõÃüÁȻºóÔÙÖ´ÐУ¬Õâ¾Í½Ð×ö»ØÉù£¨echoing£©¡£
Ö´ÐÐÉÏÃæµÄ¹æÔò£¬»áµÃµ½ÏÂÃæµÄ½á¹û¡£
ÔÚÃüÁîµÄÇ°Ãæ¼ÓÉÏ@£¬¾Í¿ÉÒԹرջØÉù¡£
ÏÖÔÚÔÙÖ´ÐÐmake test£¬¾Í²»»áÓÐÈκÎÊä³ö¡£
ÓÉÓÚÔÚ¹¹½¨¹ý³ÌÖУ¬ÐèÒªÁ˽⵱ǰÔÚÖ´ÐÐÄÄÌõÃüÁËùÒÔͨ³£Ö»ÔÚ×¢Êͺʹ¿ÏÔʾµÄechoÃüÁîÇ°Ãæ¼ÓÉÏ@¡£
test:
@# ÕâÊDzâÊÔ
@echo TODO
|
3.3 ͨÅä·û
ͨÅä·û£¨wildcard£©ÓÃÀ´Ö¸¶¨Ò»×é·ûºÏÌõ¼þµÄÎļþÃû¡£Makefile
µÄͨÅä·ûÓë Bash Ò»Ö£¬Ö÷ÒªÓÐÐǺţ¨*£©¡¢Îʺţ¨£¿£©ºÍ [...] ¡£±ÈÈ磬 *.o ±íʾËùÓкó׺ÃûΪoµÄÎļþ¡£
3.4 ģʽƥÅä
MakeÃüÁîÔÊÐí¶ÔÎļþÃû£¬½øÐÐÀàËÆÕýÔòÔËËãµÄÆ¥Å䣬Ö÷ÒªÓõ½µÄÆ¥Åä·ûÊÇ%¡£±ÈÈ磬¼Ù¶¨µ±Ç°Ä¿Â¼ÏÂÓÐ f1.c
ºÍ f2.c Á½¸öÔ´ÂëÎļþ£¬ÐèÒª½«ËüÃDZàÒëΪ¶ÔÓ¦µÄ¶ÔÏóÎļþ¡£
µÈͬÓÚÏÂÃæµÄд·¨¡£
ʹÓÃÆ¥Åä·û%£¬¿ÉÒÔ½«´óÁ¿Í¬ÀàÐ͵ÄÎļþ£¬Ö»ÓÃÒ»Ìõ¹æÔò¾ÍÍê³É¹¹½¨¡£
3.5 ±äÁ¿ºÍ¸³Öµ·û
Makefile ÔÊÐíʹÓõȺÅ×Ô¶¨Òå±äÁ¿¡£
txt
= Hello World
test:
@echo $(txt) |
ÉÏÃæ´úÂëÖУ¬±äÁ¿ txt µÈÓÚ Hello World¡£µ÷ÓÃʱ£¬±äÁ¿ÐèÒª·ÅÔÚ $( ) Ö®ÖС£
µ÷ÓÃShell±äÁ¿£¬ÐèÒªÔÚÃÀÔª·ûºÅǰ£¬ÔÙ¼ÓÒ»¸öÃÀÔª·ûºÅ£¬ÕâÊÇÒòΪMakeÃüÁî»á¶ÔÃÀÔª·ûºÅתÒå¡£
ÓÐʱ£¬±äÁ¿µÄÖµ¿ÉÄÜÖ¸ÏòÁíÒ»¸ö±äÁ¿¡£
ÉÏÃæ´úÂëÖУ¬±äÁ¿ v1 µÄÖµÊÇÁíÒ»¸ö±äÁ¿ v2¡£Õâʱ»á²úÉúÒ»¸öÎÊÌ⣬v1 µÄÖµµ½µ×ÔÚ¶¨ÒåʱÀ©Õ¹£¨¾²Ì¬À©Õ¹£©£¬»¹ÊÇÔÚÔËÐÐʱÀ©Õ¹£¨¶¯Ì¬À©Õ¹£©£¿Èç¹û
v2 µÄÖµÊǶ¯Ì¬µÄ£¬ÕâÁ½ÖÖÀ©Õ¹·½Ê½µÄ½á¹û¿ÉÄÜ»á²îÒìºÜ´ó¡£
ΪÁ˽â¾öÀàËÆÎÊÌ⣬MakefileÒ»¹²ÌṩÁËËĸö¸³ÖµÔËËã·û £¨=¡¢:=¡¢£¿=¡¢+=£©£¬ËüÃǵÄÇø±ðÇë¿´StackOverflow¡£
VARIABLE
= value
# ÔÚÖ´ÐÐʱÀ©Õ¹£¬ÔÊÐíµÝ¹éÀ©Õ¹¡£
VARIABLE := value
# ÔÚ¶¨ÒåʱÀ©Õ¹¡£
VARIABLE ?= value
# Ö»ÓÐÔڸñäÁ¿Îª¿Õʱ²ÅÉèÖÃÖµ¡£
VARIABLE += value
# ½«Öµ×·¼Óµ½±äÁ¿µÄβ¶Ë¡£ |
3.6 ÄÚÖñäÁ¿£¨Implicit Variables£©
MakeÃüÁîÌṩһϵÁÐÄÚÖñäÁ¿£¬±ÈÈ磬$(CC) Ö¸Ïòµ±Ç°Ê¹ÓõıàÒëÆ÷£¬$(MAKE) Ö¸Ïòµ±Ç°Ê¹ÓõÄMake¹¤¾ß¡£ÕâÖ÷ÒªÊÇΪÁË¿çÆ½Ì¨µÄ¼æÈÝÐÔ£¬ÏêϸµÄÄÚÖñäÁ¿Çåµ¥¼ûÊֲᡣ
output:
$(CC) -o output input.c |
3.7 ×Ô¶¯±äÁ¿£¨Automatic Variables£©
MakeÃüÁÌṩһЩ×Ô¶¯±äÁ¿£¬ËüÃǵÄÖµÓ뵱ǰ¹æÔòÓйء£Ö÷ÒªÓÐÒÔϼ¸¸ö¡£
£¨1£©$@
$@Ö¸´úµ±Ç°Ä¿±ê£¬¾ÍÊÇMakeÃüÁǰ¹¹½¨µÄÄǸöÄ¿±ê¡£±ÈÈ磬make
fooµÄ $@ ¾ÍÖ¸´úfoo¡£
µÈͬÓÚÏÂÃæµÄд·¨¡£
a.txt:
touch a.txt
b.txt:
touch b.txt
|
£¨2£©$<
$< Ö¸´úµÚÒ»¸öǰÖÃÌõ¼þ¡£±ÈÈ磬¹æÔòΪ t: p1 p2£¬ÄÇô$< ¾ÍÖ¸´úp1¡£
a.txt: b.txt c.txt
cp $< $@
|
µÈͬÓÚÏÂÃæµÄд·¨¡£
a.txt: b.txt c.txt
cp b.txt a.txt
|
£¨3£©$?
$? Ö¸´ú±ÈÄ¿±ê¸üеÄËùÓÐǰÖÃÌõ¼þ£¬Ö®¼äÒÔ¿Õ¸ñ·Ö¸ô¡£±ÈÈ磬¹æÔòΪ t: p1 p2£¬ÆäÖÐ p2 µÄʱ¼ä´Á±È
t У¬$?¾ÍÖ¸´úp2¡£
£¨4£©$^
$^ Ö¸´úËùÓÐǰÖÃÌõ¼þ£¬Ö®¼äÒÔ¿Õ¸ñ·Ö¸ô¡£±ÈÈ磬¹æÔòΪ t: p1 p2£¬ÄÇô $^ ¾ÍÖ¸´ú p1 p2
¡£
£¨5£©$*
$* Ö¸´úÆ¥Åä·û % Æ¥ÅäµÄ²¿·Ö£¬ ±ÈÈç% Æ¥Åä f1.txt ÖеÄf1 £¬$* ¾Í±íʾ f1¡£
£¨6£©$(@D) ºÍ $(@F)
$(@D) ºÍ $(@F) ·Ö±ðÖ¸Ïò $@ µÄĿ¼ÃûºÍÎļþÃû¡£±ÈÈ磬$@ÊÇ src/input.c£¬ÄÇô$(@D)
µÄֵΪ src £¬$(@F) µÄֵΪ input.c¡£
£¨7£©$(<D) ºÍ $(<F)
$(<D) ºÍ $(<F) ·Ö±ðÖ¸Ïò $< µÄĿ¼ÃûºÍÎļþÃû¡£
ËùÓеÄ×Ô¶¯±äÁ¿Çåµ¥£¬Çë¿´ÊֲᡣÏÂÃæÊÇ×Ô¶¯±äÁ¿µÄÒ»¸öÀý×Ó¡£
dest/%.txt: src/%.txt
@[ -d dest ] || mkdir dest
cp $< $@
|
ÉÏÃæ´úÂ뽫 src Ŀ¼Ï嵀 txt Îļþ£¬¿½±´µ½ dest Ŀ¼Ï¡£Ê×ÏÈÅÐ¶Ï dest Ŀ¼ÊÇ·ñ´æÔÚ£¬Èç¹û²»´æÔÚ¾Íн¨£¬È»ºó£¬$<
Ö¸´úǰÖÃÎļþ£¨src/%.txt£©£¬ $@ Ö¸´úÄ¿±êÎļþ£¨dest/%.txt£©¡£
3.8 ÅжϺÍÑ»·
MakefileʹÓà Bash Óï·¨£¬Íê³ÉÅжϺÍÑ»·¡£
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
|
ÉÏÃæ´úÂëÅжϵ±Ç°±àÒëÆ÷ÊÇ·ñ gcc £¬È»ºóÖ¸¶¨²»Í¬µÄ¿âÎļþ¡£
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
# µÈͬÓÚ
all:
for i in one two three; do \
echo $i; \
done
|
ÉÏÃæ´úÂëµÄÔËÐнá¹û¡£
3.9 º¯Êý
Makefile »¹¿ÉÒÔʹÓú¯Êý£¬¸ñʽÈçÏ¡£
$(function arguments)
# »òÕß
${function arguments}
|
MakefileÌṩÁËÐí¶àÄÚÖú¯Êý£¬¿É¹©µ÷Óá£ÏÂÃæÊǼ¸¸ö³£ÓõÄÄÚÖú¯Êý¡£
£¨1£©shell º¯Êý
shell º¯ÊýÓÃÀ´Ö´ÐÐ shell ÃüÁî
srcfiles := $(shell echo src/{00..99}.txt)
|
£¨2£©wildcard º¯Êý
wildcard º¯ÊýÓÃÀ´ÔÚ Makefile ÖУ¬Ìæ»» Bash µÄͨÅä·û¡£
srcfiles
:= $(wildcard src/*.txt) |
£¨3£©subst º¯Êý
subst º¯ÊýÓÃÀ´Îı¾Ìæ»»£¬¸ñʽÈçÏ¡£
ÏÂÃæµÄÀý×Ó½«×Ö·û´®"feet on the street"Ìæ»»³É"fEEt
on the strEEt"¡£
$(subst
ee,EE,feet on the street) |
ÏÂÃæÊÇÒ»¸öÉÔ΢¸´ÔÓµÄÀý×Ó¡£
comma:= ,
empty:=
# space±äÁ¿ÓÃÁ½¸ö¿Õ±äÁ¿×÷Ϊ±êʶ·û£¬µ±ÖÐÊÇÒ»¸ö¿Õ¸ñ
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# bar is now `a,b,c'.
|
£¨4£©patsubstº¯Êý
patsubst º¯ÊýÓÃÓÚģʽƥÅäµÄÌæ»»£¬¸ñʽÈçÏ¡£
$(patsubst
pattern,replacement,text) |
ÏÂÃæµÄÀý×Ó½«ÎļþÃû"x.c.c bar.c"£¬Ìæ»»³É"x.c.o bar.o"¡£
$(patsubst
%.c,%.o,x.c.c bar.c) |
£¨5£©Ìæ»»ºó׺Ãû
Ìæ»»ºó׺Ãûº¯ÊýµÄд·¨ÊÇ£º±äÁ¿Ãû + ðºÅ + ºó׺ÃûÌæ»»¹æÔò¡£Ëüʵ¼ÊÉÏpatsubstº¯ÊýµÄÒ»ÖÖ¼òдÐÎʽ¡£
$(patsubst
%.c,%.o,x.c.c bar.c) |
ÉÏÃæ´úÂëµÄÒâ˼ÊÇ£¬½«±äÁ¿OUTPUTÖеĺó׺Ãû .js È«²¿Ìæ»»³É .min.js ¡£
ËÄ¡¢Makefile µÄʵÀý
£¨1£©Ö´Ðжà¸öÄ¿±ê
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff |
ÉÏÃæ´úÂë¿ÉÒÔµ÷Óò»Í¬Ä¿±ê£¬É¾³ý²»Í¬ºó׺ÃûµÄÎļþ£¬Ò²¿ÉÒÔµ÷ÓÃÒ»¸öÄ¿±ê£¨cleanall£©£¬É¾³ýËùÓÐÖ¸¶¨ÀàÐ͵ÄÎļþ¡£
£¨2£©±àÒëCÓïÑÔÏîÄ¿
Hello
World!
edit : main.o kbd.o command.o display.o
cc -o edit main.o kbd.o command.o display.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
cc -c display.c
clean :
rm edit main.o kbd.o command.o display.o
.PHONY: edit clean |
½ñÌ죬MakeÃüÁîµÄ½éÉܾ͵½ÕâÀï¡£ÏÂһƪÎÄÕÂÎÒ»á½éÉÜ£¬ÈçºÎÓà Make À´¹¹½¨ Node.js ÏîÄ¿¡£
|