天天看點

make使用總結(3)-Makefile文法make使用總結(3)-Makefile文法

make使用總結(3)-Makefile文法

變量

Makefile中的變量主要是用來儲存、處理字元串。變量名區分大小寫.引用變量時使用

$(variableName)

的格式,如

$(BIN)

.由于

$

有特殊含義,是以當遇到真實的

$

時用

$$

來表示。可以使用

$$$$

列印目前程序id。

Makefile中變量的使用如下

BIN := main
SRCPATH = src1
SRCPATH += src2
OBJPATH ?= obj

SRCS :=  $(wildcard *.c);
           

變量指派可以分為兩種:

  1. 立即指派

    :指派時使用

    :=

    ::=

    。如

    BIN := main

    就是立即指派。在變量指派時就會展開。如

    SRCS := $(wildcard *.c)

    ,在指派過程中就會展開

    wildcard()

    函數,将函數的傳回值指派給SRCS變量。推薦使用此方式指派。
  2. 延時指派

    :指派時使用

    =

    。如

    SRCPATH = src1

    為延時指派。在變量被規則使用到時才進行展開。

為了友善Makefile檔案編寫,還可以使用如下指派:

  1. +=

    :對變量進行追加.eg:

    SRCPATH += src2

    .
  2. ?=

    :在變量未定義時進行指派.eg:

    OBJPATH ?= obj

    .

為了友善規則編寫,make還定義了一些

自動變量

。主要是為了友善擷取

規則

中的具體的

目标

名和

依賴項

.

  1. [email protected]

    :目前規則的

    目标

  2. $<

    :第一個

    依賴項

  3. $^

    :所有的依賴項清單,重名依賴項被忽略
  4. $?

    :所有比目标檔案新的依賴項清單
  5. $+

    :包括重名依賴項的所有依賴項清單
  6. $*

    :模式規則或靜态模式規則中的莖,也即

    %

    所代表的部分
  7. 上述七個自動化變量除了直接引用外,還可以在其後增加D或者F字元擷取目錄名和檔案名,如: ( @ D ) 表 示 目 标 文 件 的 目 錄 名 , (@D)表示目标檔案的目錄名, (@D)表示目标檔案的目錄名,(@F)表示目标檔案的檔案名

為了友善Makefile編寫,make定義了一些有固定含義的變量,如下:

  1. VPATH

    :這個變量在編寫makefile時經常遇到。主要用來指定依賴檔案的搜尋路徑,使用空格或冒号将多個路徑分開.當規則的依賴檔案或目标檔案不在目前目錄時,make會在此變量指定的目錄下去尋找依賴檔案。
  2. vpath

    :功能同

    VPATH

    ,但比VPATH更靈活,可以使用模式比對來指定搜尋路徑,還可以清除搜尋路徑.用法如下
    1. vpath PATTERN DIR:為比對PATTERN模式的檔案指定搜尋目錄。eg:

      vpath %.c ../wild_code/

      指定所有.c檔案的搜尋路徑
    2. vpath PATTERN:清除比對PATTERN模式的檔案設定的搜尋目錄。
    3. vpath:清除全部搜尋目錄。
  3. CURDIR

    :make會自動設定為目前目錄的路徑.
  4. MAKECMDGOALS

    :make時指令行上指定的目标清單
  5. GPATH

    :如果不希望在目前目錄下生成目标檔案,可以使用GPATH變量.
  6. MAKE

    :指make指令。在Makefile檔案中調用

    $(MAKE)

    來執行一次make指令操作。在工程中存在多個Makefile時,會使用在根Makefile中使用$(MAKE)來執行其他子Makefile。此時一般需要

    -c

    選項來指定目錄。

在使用makefile的變量中我們需要注意,來在于不同地方的變量:

  1. 系統環境變量:就是Linux系統自帶的環境變量,在Makefile中可以使用。
  2. make定義的全局變量:如

    VPATH

    等。
  3. 指令行變量:在執行make時指定的指令行變量會覆寫Makefile中同名的變量定義,如果希望變量不被覆寫則需要使用

    override

    關鍵字。
  4. 自定義變量:使用者自定的變量。自定義變量優先級高于環境變量。make的

    -e

    選項可防止環境變量被同名變量覆寫。

替換引用

我們在編寫Makefile檔案時,經常會遇到将所有的所有

xxx.c

檔案名替換為

xxx.o

檔案名。除了使用函數可以實作這一目的,變量的替換引用也可以做到這一點。

文法:

$(var:a=b) 或 ${var:a=b}

含義:把變量var中每一個字元串結尾的a用b替換掉。

如下面的例程OBJS變量的最終結果為

OBJS := test1.o test2.o test3.o

SRCS := test1.c test2.c test3.c
OBJS := $(SRCS:.c=.o)
           

關于技術交流

此處後的文字已經和題目内容無關,可以不看。

qq群:825695030

微信公衆号:嵌入式的日常

如果上面的文章對你有用,歡迎打賞、點贊、評論。

make使用總結(3)-Makefile文法make使用總結(3)-Makefile文法

繼續閱讀