《跟我一起學makefile》學習筆記(二)

2021-09-14 06:13:58 字數 3805 閱讀 4977

學習記錄(對應文件的p10-p20)

四、使用變數

edit的規則

edit:main.o kbd.o display.o \

insert.o search.o files.o utils.o

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

insert.o search.o files.o utils.o

存在的問題,.o檔案的字串被重複了2次。因此需要變數(理解成c中的巨集)

objects = main.o kbd.o command.o display.o \

insert.o search.o files.o utils.o

使用$(objects)

改良版的makefile

objects = main.o kbd.o command.o display.o \

insert.o search.o files.o utils.o

edit:$(objects)

cc -o edit $(objects)

main.o:main.c defs.h

cc -c main.c

......

clean:

rm edit $(objects)

五、讓make自動推導

make看到.o檔案,自動把.c檔案加在依賴關係中

新的makefile

objects = main.o kbd.o command.o display.o \

insert.o search.o files.o utils.o

edit:$(objects)

cc -o edit $(objects)

main.o:defs.h

kbd.o:defs.h command.h

......

.phony:clean

clean:

rm edit $(objects)

其中.phony表示,clean是偽目標檔案

六、另類風格的makefile

解決的問題:重複的.**件

make自動推導命令和檔案

objects = main.o kbd.o command.o display.o \

insert.o search.o files.o utils.o

edit:$(objects)

cc -o edit $(objects)

$(objects):defs.h

kbd.o command.o files.o : command.h

display.o insert.o search.o files.o: buffer.h

.phony:clean

clean:

rm edit $(objects)

七、清空目標檔案的規則

.phony:clean

clean:

-rm edit $(objects)

減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。

第四部分、makefile總述

一、makefile裡有什麼?

顯式規則、隱晦規則、變數定義、檔案指示、注釋

1、顯式規則

書寫者明顯指出,要生成的檔案、依賴的檔案、生成的命令

2、隱晦規則

make自動推導

3、變數的定義

變數一般都是字串

4、檔案指示

(1)在乙個makefile中引用另乙個makefile,類似include

(2)根據某些情況指定makefile中的有效部分,類似預編譯#if

(3)定義乙個多行的命令

5、注釋

只有行注釋,#開頭。如果你要在你的 makefile 中使用「#」字元,可以用反斜框進行

轉義,如:「\#」。

二、makefile的檔名

首選makefile,也行makefile

別的檔名「make.linux」,使用 make 的「-f」和「--file」引數,如:make -f make.linux

三、引用其他的makefile

include

在include前面可以有空字元,決不能以tab開始

例子:幾個 makefile檔案:a.mk、b.mk、c.mk,還有乙個檔案:foo.make,

以及乙個變數$(bar),其包含了 e.mk 和f.mk。  

include foo.make *.mk $(bar)  

等價於:  

include foo.make a.mk b.mk c.mk e.mk f.mk

make 命令開始時,會把找尋 include 所指出的其它 makefile。

如果檔案都沒有指定路徑,在當前目錄下首先尋找,

如果當前目錄下沒有找到,那麼,make 還會在下面的幾個目錄下找:  

1、如果 make 執行時,有「-i」或「--include-dir」引數,那麼 make 就會在這個引數  

所指定的目錄下去尋找。  

2、如果目錄/include(一般是:/usr/local/bin 或/usr/include)存在的話,

make 也會去找。如果有檔案沒有找到的話,make 會生成一條警告資訊,但不會馬上出現致

命錯誤。繼續載入其它的檔案,一旦完成 makefile 的讀取,make 會再重試這些沒有找

到,或是不能讀取的檔案,如果還是不行,make 才會出現一條致命資訊。如果你想讓 make

不理那些無法讀取的檔案,而繼續執行,在 include 前加乙個減號「-」。

四、環境變數makefiles

最好不用

五、make的工作方式

1、讀入所有的makefile

2、讀入被include的其它makefile

3、初始化檔案中的變數

4、推導隱晦規則,分析所有規則

5、為所有目標檔案建立依賴關係

6、根據依賴關係,決定哪些目標要重新生成

7、執行生成命令

第五部分、書寫規則

依賴關係、生成目標的方法

只有乙個最終目標

一、規則舉例

foo.o:foo.c defs.h

cc -c -g foo.c

依賴關係

生成的方法

二、規則的語法

target : prerequisites

command

三、在規則中使用萬用字元

* ? ...(後面詳講)

讓萬用字元在變數中展開,也就是讓 objects 的值是所有[.o]的檔名的集合,

objects := $(wildcard *.o)  

這種用法由關鍵字「wildcard」指出,關於 makefile 的關鍵字,我們將在後面討論。  

四、檔案搜尋

特殊變數vpath

vpath = src:../headers

指定2個目錄src和../headers

關鍵字vpath,指定不同的檔案在不同的搜尋目錄中

1、vpath

為符合模式的檔案指定搜尋目錄

2、vpath

清除符合模式的檔案的搜尋目錄。  

3、vpath  

清除所有已被設定好了的檔案搜尋目錄。  

vapth 使用方法中的需要包含「%」字元。「%」的意思是匹配零或若干字元,

例如,「%.h」表示所有以「.h」結尾的檔案。

指定了要搜尋的檔案集,

則指定搜尋目錄。例如:

vpath %h ../headers

五、偽目標

不是乙個檔案,只是乙個標籤

《跟我一起學makefile》學習筆記(一)

最近在學習朱有鵬老師的嵌入式課程,講到了makefile,朱老師推薦了陳皓老師的 跟我一起學makefile 自己對makefile一知半解,決定跟著文件,系統地學習一下,現記錄如下 對應文件的p1 p9 第一部分 概述 makefile,管理大型工程的原始碼,定義一系列規則。指定哪些檔案先編譯 後...

讀《跟我一起學Makefile》有感

其實在之前的工作中有很多的機會接觸到makefile,但是總是沒能拿出時間通讀其語法,我想這與自身不夠積極的態度是直接掛鉤的。先說說在這次的收穫 首先從最基本的語法規則到變數定義,熟悉了其最基本的工作流程 再者結合文中的示例,自己再實際練習,熟悉了其中個別函式及特殊規則的應用。在接觸到專案中的mak...

學習《跟我一起學makefile》使用條件判斷

文章 使用條件判斷,可以讓make根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。下面的例子,判斷 cc 變數是否gcc,如果是的話,則使用gnu函式編譯目標。libs for gcc lgnu normal libs foo objects ifeq ...