Makfile的作用就是讓編譯器能夠自動編譯我們的代碼,他的基本原理如下:
目標:條件
動作
例如:
main.o : main.c
gcc -g -c main.c -o main.o
根據(jù)給定的條件執(zhí)行相應的動作到達需要的目標,這個和現(xiàn)實生活中解決問題的一般思路是一樣的。
Makefile的自動變量:
Makefile 有六個自動變量:$@代表目標,$^是第一個條件,$?是所有時間比目標更新的條件,$<是去掉重復部分的所有條件,$+沒有去掉重復部分的所有條件,$*是目標的名稱,就是沒有后綴的目標,以前對這幾個變量總是搞不清楚,但是看了趙鑫磊著的《Linux就是這個范兒》之后就完全理解了,這本書里面的Linux Shell和Makefile的相關知識寫得很好。
Makefile的函數(shù)定義和調用
函數(shù)定義:
define func
echo "func be called"
echo "param $1 $2"
endef
函數(shù)調用:
$(call func,a,b) 輸出如下
func be called
param a b
Makefile命令修飾符
@,-,+的用處,例如
@echo "some message" 意思是這個命令執(zhí)行不輸出到stdout,如果這個命令有創(chuàng)建中間文件(.o文件)也不會創(chuàng)建;
-這個表示執(zhí)行這個命令即使遇到錯誤也不要停止,例如:
-include(sub-makefile.mk) 等效sinclude
+符號用于調試,被它修改的目標、命令或者函數(shù)等只會輸出執(zhí)行的信息到stdout,而不會實際執(zhí)行這個命令。