學習記錄(對應文件的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 ...