嵌入式linux學習----Makefile基礎知識

一、嵌入式linux學習----Makefile基礎知識


1.1 Makefile作用

makefile關係到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因爲makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。

1. 2 Makefile規格

foo.o : foo.c defs.h 
	cc -c -g foo.c

foo.o是我們的目標,foo.c和defs.h是目標所依賴的源文件,而只有一個命令“cc -c -g foo.c”(以Tab鍵開頭)。這個規則告訴我們兩件事:
1、文件的依賴關係,foo.o依賴於foo.c和defs.h的文件,如果foo.c和defs.h的文件日期要比foo.o文件日期要新,或是foo.o不存在,那麼依賴關係發生。
2、如果生成(或更新)foo.o文件。也就是那個cc命令,其說明了,如何生成foo.o這個文件。(當然foo.c文件include了defs.h文件)。

1.3 Makefile變量

1.3.1 變量的引用

變量引用方式:$(VARIABLE_NAME)或者$(VARIABLE_NAME),引用的是VARIABLE_NAME的值而不是符號。

1.3.2 遞歸方式拓展的變量

這類變量可以通過"="或"define"定義。遞歸變量被用的時候再去擴展。

student = lilei
CLASS = $(student)$(teacher)
teacher = young
all:
	@echo $(CLASS)

輸出:lilei young
遞歸方式拓展的變量在定義時可以引用之前沒有定義的變量(可能後續定義或makefile命令行傳遞的變量)。但是,要注意因爲出現變量的遞歸而出現無限的變量展開的過程。如下:

X = $(Y)
Y = $(Z)
Z = $(X)

這樣的話,會陷入無限變量展開,因爲最終引用的自己。

1.3.3 直接展開式變量

直接展開式變量通過“:=“定義。變量值中其他變量或函數引用在定義變量時展開。

X := student
Y := $(X)
X := teacher
all:
	@echo $(X) $(Y)

輸出結果爲:teacher student
直接展開式變量在定義時就完成了對所引用變量和函數的展開,因此不能實現對其後續定義的引用。

1.3.4 條件賦值

“?="來進行條件賦值,只有此變量在之前沒有賦值的情況下才會對變量進行賦值。

X := student
X ?= teacher
Y ?= student
all:
	@echo $(X) $(Y)

輸出 student student

1.3.5 變量的替換引用

格式 $(VAR:A=B)或者${VAR:A=B),將已經定義的變量VAR值的後綴字符(串)A結尾的字使用指定的字符(串)B替換。結尾的含義是空格前(變量值多個字之間使用空格分開)。

X := fun.o main.o
Y := $(X .o=.c)
all:
	@echo $(X) $(Y)

輸出 fun.o main.o fun.c main.c
注意的是$(X .o=.c)中等號兩邊不能有空格。

1.3.6 追加變量值

一個通用變量在定義之後的其他地方,可以對其值進行追加。Makefile使用”+=“來進行一個變量的追加操作。

X = fun.o main.o
X += sub.o
all:
	@echo $(X)

輸出:fun.o main.o sub.o
注意的是一個變量在追加前未被定義,則”+=“會自動變成”=“,即變量變成遞歸展開式變量。

1.4 Makefile函數

1.4.1 加前綴函數

$(addprefix prefix,name…)
函數名稱:加前綴函數。

$(addprefix src/,foo bar main)

返回值:src/foo src/bar src/main

1.4.2 加後綴函數

$(addsuffix,name…)
函數名稱:加後綴函數。

$(addsuffix .c,foo bar main)

返回值:foo.c bar.c main.c


參考資料: 嵌入式linux學習手冊  —朱兆祺

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章