GNU make-Makefile檔案簡介

LemHou發表於2024-08-06

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 $@ # @不列印命令

注意

  1. Makefilevscode中使用時可能會報錯"make: *** No rule to make target '@mkdir', needed by 'build'. Stop."

    原因:vscode中的tab可能預設為四個空格

    解法:將tab修改為非四個空格

相關文章