Makefile簡介
Makefile
是一種特殊格式的檔案,被make
工具使用來管理軟體的構建過程。Makefile
定義了一組規則和依賴關係,告訴make
如何編譯和連結程式。
Makefile語句
TARGET: PREREQUISTS
COMMAND
Makefile
的語句由上述三部分組成,例如target: hello prerequists: hello.c command: gcc hello.c -o hello
hello: hello.c
gcc hello.c -o hello
Makefile引用
$@
指代當前TARGET
Makefile變數
-
遞迴展開方式變數
這一型別的定義由
=
進行定義,此時是嚴格的文字替換。例如:xs = mh ns = $(xs) all:; echo $(ns)
在執行語句時,首先,
echo $(ns)
會替換為echo $(xs)
然後才會替換成echo mh
。這就是遞迴的進行替換。 -
直接展開方式變數
這一型別的定義由
:=
進行定義,在變數定義時就展開。ns := $(xs) xs = mh
此時由於
ns
是直接展開的,如果xs
定義在後面,此時ns
會直接變為空,無法完成對xs
變數的引用。
Makefile偽目標
偽目標使用.PHONY
進行宣告,其後的值如share
,此語句表明share
並不是真正的目標,只執行後續的命令,而不生成目標。
.PHONY: shared
shared: # 不生成shared目標檔案
ls
Makefile例項
CC = gcc
APP = webserver
SRCS-y := reactor.c webserver.c websocket.c
all: shared
.PHONY: shared build
shared: build/$(APP)-shared
ln -sf $(APP)-shared build/$(APP)
build/$(APP)-shared: $(SRCS-y) | build
$(CC) $(SRCS-y) -o $@
build:
@mkdir -p $@ # @不列印命令
注意
-
Makefile
在vscode
中使用時可能會報錯"make: *** No rule to make target '@mkdir', needed by 'build'. Stop."
原因:
vscode
中的tab
可能預設為四個空格解法:將
tab
修改為非四個空格