makefile:帶你瞭解一種常用於 GNU GCC 編譯的工具語言

LiteOS 源碼中使用 makefile 進行文件的批處理編譯和連接到生成文件,如果在使用 LiteOS 來設計工程時使用 GNU 編譯器進行編譯,一般會都會使用到 makefile 進行編譯和鏈接程序,如果使用的 Keil 或 IAR 的編譯器進行編譯則在 Keil IDE 或 IAR IDE 中設置編譯器信息和文件包換路徑就可以了進行編譯鏈接和輸出文件。

1、makefile 介紹

target … : prerequisites …
        recipe
        …
        …

target(目標) 通常是由程序生成的文件的名稱。目標的示例是可執行文件或目標文件。目標也可以是要執行的操作的名稱,例如 “clean”;

**prerequisites(前置條件)**是一個文件,該文件用作創建目標的輸入。一個目標通常取決於幾個文件;

**recipe(命令)**是一種要執行的動作。配方可能在同一行上或在自己的行上具有多個命令。請注意:您需要在每個配方行的開頭添加一個製表符!這是一個模糊的地方,引起了人們的注意。如果您希望在食譜中使用製表符以外的其他字符作爲前綴,則可以將. RECIPEPREFIX 變量設置爲其他字符

"目標" 是必需的,不可省略;"前置條件" 和 "命令" 都是可選的,但是兩者之中必須至少存在一個。

一條規則說明了如何以及何時重新制作作爲特定規則目標的某些文件。make 根據創建或更新目標的先決條件執行方法。規則還可以解釋如何以及何時執行某項操作。一個 makefile 可能包含除規則之外的其他文本,但是一個簡單的 makefile 只需包含規則。規則看起來可能比此樣例中顯示的要複雜一些,但所有規則或多或少都適合該模式。

1.2Makefile 語法

① # 表示註釋

② 通配符用來指定一組符合條件的文件名。Makefile 的通配符與 Bash 一致,主要有星號(*)、問號(?)和 [...] 。比如, *.o 表示所有後綴名爲 o 的文件。

③ % 模式匹配

如需要編譯當前目錄下 a.c 和 b.c 兩個文件,原來的寫法是:

a.o: a.c
b.c: b.c

利用 % 可以簡寫爲:

%.o : %.c

在處理大量同類型文件時既可以利用 % 簡寫文件

④ “=” 自定義變量

txt = Hello World
test:
    @echo $(txt)

上面的 txt 代替的了 “Hello World”

同時基於 “=” Makefile 提供了(=、:=、?=、+=)四個賦值運算操作。

⑤ 內置變量

Make 有自己的操作變量,特指一些自己的功能命令;如:$(CC) 指向當前使用的編譯器,$(MAKE) 指向當前使用的 Make 工具

具體變量規則可參考:https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

⑥ 自動變量(Automatic Variables)

makefile 提供一些與規則相關的變量,常用的有:

(1)$@ ----- 指代當前目標

(2)$< ----- 指代第一個前置條件

a.txt: b.txt c.txt
    cp $< $@

上面的代碼和下面的代碼一致

a.txt: b.txt c.txt
    cp b.txt a.txt

$<指代第一個前置條件,即 “b.txt”;$@ 指代目標值即 “a.txt”

(3)$? ------ 指代比目標更新的所有前置條件,之間以空格分隔。比如,規則爲 t: p1 p2,其中 p2 的時間戳比 t 新,$? 就指代 p2。

(4)$^ ------ 指代所有前置條件,之間以空格分隔。比如,規則爲 t: p1 p2,那麼 $^ 就指代 p1 p2 。

(5)$* ------ 指代匹配符 % 匹配的部分, 比如 % 匹配 f1.txt 中的 f1 ,$* 就表示 f1。

(6)$(@D) 和 $(@F)------ 分別指向 $@ 的目錄名和文件名。比如,$@是 src/input.c,那麼 $(@D) 的值爲 src ,$(@F) 的值爲 input.c。

(7)$(<D) 和 $(<F) ------ 分別指向 $< 的目錄名和文件名。

1.3 makefile 循環

Makefile 使用 Bash 語法,完成判斷和循環。

如 ifeq -- else -- endif 使用

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

以上代碼通過判斷編譯器是否爲 gcc 決定編譯不同的路徑。

1.4 makefile 函數

Makefile 提供一些內置函數,使用格式如下:

$(function arguments)
# 或者
${function arguments}

內建函數如下表:具體函數參考路徑 (https://www.gnu.org/software/make/manual/html_node/Functions.html)

2.mikefile 文件編寫

如下文件編譯一個 C 語言工程,包含 main.c kdb.c display.c 三個源文件及 defs.h、command.h、兩個頭文件

編譯代如下:

edit : main.o kbd.o command.o display.o 
    cc -o edit main.o kbd.o command.o display.o

main.o : main.c defs.h
    cc -c main.c
kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
command.o : command.c defs.h command.h
    cc -c command.c
display.o : display.c defs.h
    cc -c display.c

clean :
     rm edit main.o kbd.o command.o display.o

.PHONY: edit clean

該代碼中,清空了輸出文件,然後利用 gcc 編譯器編譯了三個頭文件和兩個文件。

本文分享自華爲雲社區《一文讀懂 LiteOS 中的 “makefile” 文件(1)----makfile 簡介》,原文作者:o0 龍龍 0o 。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/iluceq9HQxYVmjBE7A9JGA