MAKEFILE文件使用說明

MAKEFILE文件使用說明:linux

  • Make

shell下執行make,查找文件的順序以下GNUmakefile => makefile => Makefile,一般狀況都是用Makefile來命名shell

make -f xxx ,-f是指定文件名macos

make 默認執行Makefile的第一個目標函數

make 後面的參數能夠給文件裏面的變量賦值,如make TARGET=allui

 

簡單事例:lua

事例一,內含多個目標構建:spa

  

 

事例二,pbc在mac與linux下的構建:命令行

   

 

 

  • 規則三要素:目標、依賴、命令
    • 每個命令的起始符必須是Tab,命令能夠是shell命令或shell下可執行的程序
    • 目標,能夠是單個或多個,如 all linux macosx:
    • 依賴,能夠是一個表達式目標/模式變量,如$(TARGET) : PARAM := xxx,同時也能夠是另外一個目標
    • 命令,跟目標依賴同一行時用’;’與依賴隔開,換行須要用Tab鍵開頭

 

以下就是一個簡單的目標實例:TARGET是目標,pbc-lua53.c是依賴,命令行Tab鍵開頭orm

$(TARGET) : pbc-lua53.cblog

$(CC) $(CFLAGS)  -shared -o $@ -I../.. -I$(LUADIR) $^ -L../../build -lpbc

 

Makefile文件能夠包含多個規則,當第一個規則的命令在執行的時候發現沒有相應的依賴,就從後面的規則中尋找。

最前面的規則是終極目標必定寫在最前面,也就是最後要生成的文件。

 

  • 原理,如圖

  

    1. 讀入全部Makefile
    2. 讀入被include的全部Makefile
    3. 初始化文件中的變量
    4. 推到隱晦規則,並分析全部規則
    5. 爲全部的目標文件建立依賴關係鏈
    6. 根據依賴關係決定哪些目標從新生成
    7. 執行生成命令

 

  • 自動化變量
    • $<:規則中第一個依賴
    • $@:規則中目標名
    • $^:規則中全部依賴
    • $(TARGET):TARGET爲聲明的變量

 

  • 符號
    • =,基本賦值,變量的值會是整個makefile展開後的值
    • ?=,若是沒有被賦值,就賦值
    • :=,覆蓋以前的值,變量的值取決於它在makefile中的位置,而不是整個makefile文件展開後的最終值
    • +=,添加等號後面的值
    • # 註釋
    • % 自動匹配,如%.o:%.c。目標:依賴
    • 反斜槓(\),換行符

 

例,Makefile的內容以下,包含條件表達式:

ifdef DEFINE_VRE
    VRE = 「Hello World!
else
endif

ifeq ($(OPT),define)
    VRE ?= 「Hello World! First!
endif

ifeq ($(OPT),add)
    VRE += 「Kelly!
endif

ifeq ($(OPT),recover)
    VRE := 「Hello World! Again!
endif

all:
    @echo $(VRE)

敲入如下make命令:
make DEFINE_VRE=true OPT=define 輸出:Hello World!
make DEFINE_VRE=true OPT=add 輸出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover  輸出:Hello World! Again!
make DEFINE_VRE= OPT=define 輸出:Hello World! First!
make DEFINE_VRE= OPT=add 輸出:Kelly!
make DEFINE_VRE= OPT=recover 輸出:Hello World! Again!

 

= 與:= 的區別以下

 x = foo

    y = $(x) bar

 x = xyz

       執行後y的值爲 xyz bar ,而不是 foo bar 

x := foo

            y := $(x) bar

            x := xyz

執行後y的值爲foo bar

  • 函數
    • src=$(wildcard ./*.c),wildcard查找當前目錄的全部.c文件返回給src
    • obj=$(patsubst ./%.c, ./%.o, $(src)),patsubst是替換當前目錄全部.c文件爲.o文件
    • .PHONEY:clean 的做用,忽略當前目錄的clean文件是否存在。假如Makefile文件統計目錄也有clean文件,若是沒有.PHONEY的聲明,是沒法執行make clean 操做
    • @echo,輸出當前行,若是用echo則當前命令行也會輸出
    • VPATH 文件查找。如 vpath %.c src,表示在src目錄查找.c結尾的文件,多個目錄用:隔開,如src:src2
    • foreach,$(foreach <var>,<list>,<text> ),如
      • names := a b c d
      • files := $(foreach n,$(names),$(n).o)
      • $(files)的值是「a.o b.o c.o d.o」。

 

    • include,引入多個makefile文件,如include platform.mk a.make $(M),表示同時引入platform.mk與a.make文件。include後面只能有一個空格符號
相關文章
相關標籤/搜索