Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Make ÃüÁî½Ì³Ì
 
  2717  次浏览      27
 2017-12-19 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÈîÒ»·åµÄÍøÂçÈÕÖ¾,±¾ÎĽéÉÜMakeÃüÁîµÄÓ÷¨£¬ÈκÎֻҪij¸öÎļþÓб仯£¬¾ÍÒªÖØÐ¹¹½¨µÄÏîÄ¿£¬¶¼¿ÉÒÔÓÃMake¹¹½¨¡£

MakeÊÇ×î³£ÓõĹ¹½¨¹¤¾ß£¬µ®ÉúÓÚ1977Ä꣬Ö÷ÒªÓÃÓÚCÓïÑÔµÄÏîÄ¿¡£µ«ÊÇʵ¼ÊÉÏ £¬ÈκÎֻҪij¸öÎļþÓб仯£¬¾ÍÒªÖØÐ¹¹½¨µÄÏîÄ¿£¬¶¼¿ÉÒÔÓÃMake¹¹½¨¡£

±¾ÎĽéÉÜMakeÃüÁîµÄÓ÷¨£¬´Ó¼òµ¥µÄ½²Æð£¬²»ÐèÒªÈκλù´¡£¬Ö»Òª»áʹÓÃÃüÁîÐУ¬¾ÍÄÜ¿´¶®¡£ÎҵIJο¼×ÊÁÏÖ÷ÒªÊÇIsaac SchlueterµÄ¡¶MakefileÎļþ½Ì³Ì¡·ºÍ¡¶GNU MakeÊֲᡷ¡£

Ò»¡¢MakeµÄ¸ÅÄî

MakeÕâ¸ö´Ê£¬Ó¢ÓïµÄÒâ˼ÊÇ"ÖÆ×÷"¡£MakeÃüÁîÖ±½ÓÓÃÁËÕâ¸öÒâ˼£¬¾ÍÊÇÒª×ö³öij¸öÎļþ¡£±ÈÈ磬Ҫ×ö³öÎļþa.txt£¬¾Í¿ÉÒÔÖ´ÐÐÏÂÃæµÄÃüÁî¡£

$ make 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:
rm *.o

ÉÏÃæ´úÂëµÄÄ¿±êÊÇclean£¬Ëü²»ÊÇÎļþÃû£¬¶øÊÇÒ»¸ö²Ù×÷µÄÃû×Ö£¬ÊôÓÚ"αĿ±ê "£¬×÷ÓÃÊÇɾ³ý¶ÔÏóÎļþ¡£

$ make clean

µ«ÊÇ£¬Èç¹ûµ±Ç°Ä¿Â¼ÖУ¬ÕýºÃÓÐÒ»¸öÎļþ½Ð×öclean£¬ÄÇôÕâ¸öÃüÁî²»»áÖ´ÐС£ÒòΪMake·¢ÏÖcleanÎļþÒѾ­´æÔÚ£¬¾ÍÈÏΪûÓбØÒªÖØÐ¹¹½¨ÁË£¬¾Í²»»áÖ´ÐÐÖ¸¶¨µÄrmÃüÁî¡£

ΪÁ˱ÜÃâÕâÖÖÇé¿ö£¬¿ÉÒÔÃ÷È·ÉùÃ÷cleanÊÇ"αĿ±ê"£¬Ð´·¨ÈçÏ¡£

.PHONY: clean
clean:
rm *.o temp

ÉùÃ÷cleanÊÇ"αĿ±ê"Ö®ºó£¬make¾Í²»»áÈ¥¼ì²éÊÇ·ñ´æÔÚÒ»¸ö½Ð×öcleanµÄÎļþ£¬¶øÊÇÿ´ÎÔËÐж¼Ö´ÐжÔÓ¦µÄÃüÁî¡£Ïñ.PHONYÕâÑùµÄÄÚÖÃÄ¿±êÃû»¹Óв»ÉÙ£¬¿ÉÒԲ鿴Êֲᡣ

Èç¹ûMakeÃüÁîÔËÐÐʱûÓÐÖ¸¶¨Ä¿±ê£¬Ä¬ÈÏ»áÖ´ÐÐMakefileÎļþµÄµÚÒ»¸öÄ¿±ê¡£

$ make

ÉÏÃæ´úÂëÖ´ÐÐ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

Ö´ÐÐ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£©¡£

test:
# ÕâÊDzâÊÔ

Ö´ÐÐÉÏÃæµÄ¹æÔò£¬»áµÃµ½ÏÂÃæµÄ½á¹û¡£

$ make test
# ÕâÊDzâÊÔ

ÔÚÃüÁîµÄÇ°Ãæ¼ÓÉÏ@£¬¾Í¿ÉÒԹرջØÉù¡£

test:
@# ÕâÊDzâÊÔ

ÏÖÔÚÔÙÖ´ÐÐmake test£¬¾Í²»»áÓÐÈκÎÊä³ö¡£

ÓÉÓÚÔÚ¹¹½¨¹ý³ÌÖУ¬ÐèÒªÁ˽⵱ǰÔÚÖ´ÐÐÄÄÌõÃüÁËùÒÔͨ³£Ö»ÔÚ×¢Êͺʹ¿ÏÔʾµÄechoÃüÁîÇ°Ãæ¼ÓÉÏ@¡£


test:
@# ÕâÊDzâÊÔ
@echo TODO

3.3 ͨÅä·û

ͨÅä·û£¨wildcard£©ÓÃÀ´Ö¸¶¨Ò»×é·ûºÏÌõ¼þµÄÎļþÃû¡£Makefile µÄͨÅä·ûÓë Bash Ò»Ö£¬Ö÷ÒªÓÐÐǺţ¨*£©¡¢Îʺţ¨£¿£©ºÍ [...] ¡£±ÈÈ磬 *.o ±íʾËùÓкó׺ÃûΪoµÄÎļþ¡£


clean:
rm -f *.o

3.4 ģʽƥÅä

MakeÃüÁîÔÊÐí¶ÔÎļþÃû£¬½øÐÐÀàËÆÕýÔòÔËËãµÄÆ¥Å䣬Ö÷ÒªÓõ½µÄÆ¥Åä·ûÊÇ%¡£±ÈÈ磬¼Ù¶¨µ±Ç°Ä¿Â¼ÏÂÓÐ f1.c ºÍ f2.c Á½¸öÔ´ÂëÎļþ£¬ÐèÒª½«ËüÃDZàÒëΪ¶ÔÓ¦µÄ¶ÔÏóÎļþ¡£

%.o: %.c

µÈͬÓÚÏÂÃæµÄд·¨¡£


f1.o: f1.c
f2.o: f2.c

ʹÓÃÆ¥Åä·û%£¬¿ÉÒÔ½«´óÁ¿Í¬ÀàÐ͵ÄÎļþ£¬Ö»ÓÃÒ»Ìõ¹æÔò¾ÍÍê³É¹¹½¨¡£

3.5 ±äÁ¿ºÍ¸³Öµ·û

Makefile ÔÊÐíʹÓõȺÅ×Ô¶¨Òå±äÁ¿¡£

txt = Hello World
test:
@echo $(txt)

ÉÏÃæ´úÂëÖУ¬±äÁ¿ txt µÈÓÚ Hello World¡£µ÷ÓÃʱ£¬±äÁ¿ÐèÒª·ÅÔÚ $( ) Ö®ÖС£

µ÷ÓÃShell±äÁ¿£¬ÐèÒªÔÚÃÀÔª·ûºÅǰ£¬ÔÙ¼ÓÒ»¸öÃÀÔª·ûºÅ£¬ÕâÊÇÒòΪMakeÃüÁî»á¶ÔÃÀÔª·ûºÅתÒå¡£

test:
@echo $$HOME

ÓÐʱ£¬±äÁ¿µÄÖµ¿ÉÄÜÖ¸ÏòÁíÒ»¸ö±äÁ¿¡£

v1 = $(v2)

ÉÏÃæ´úÂëÖУ¬±äÁ¿ 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 b.txt:
touch $@

µÈͬÓÚÏÂÃæµÄд·¨¡£


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

ÉÏÃæ´úÂëµÄÔËÐнá¹û¡£

one
two
three

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 º¯ÊýÓÃÀ´Îı¾Ìæ»»£¬¸ñʽÈçÏ¡£

$(subst from,to,text)

ÏÂÃæµÄÀý×Ó½«×Ö·û´®"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 ÏîÄ¿¡£

   
2717 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ