Makfile總結

Makfile總結在前面的三篇文章徹底掌握Makefile(一)、徹底掌握Makefile(二)和徹底掌握Makeifle(三)當中我們仔細介紹了Makefile各種使用方法,在本篇文章當中主要是對前面三篇關于makefile的文章做一個總結,方便大家快速查閱和檢查 。
Makefile基礎以及小技巧Make命令的工作流程當我們在命令行當中輸入make的時候他的執行流程如下:

  • make命令首先會在當前目錄下面尋找makefile或者Makefile文件 。
  • 尋找到makefile文件之后,他會在文件當中尋找到一個編譯目標 , 比如在上面的makefile文件當中他會找到demo這個編譯目標,而不是clean這個目標,因為clean是第二個編譯目標 。
  • 然后make會解析編譯目標的依賴,如果這個依賴是其他的編譯目標A的話,那么make會先完成它依賴的編譯目標A的命令,如果它依賴的編譯目標A也存在依賴B的話,make就會去執行依賴的B的編譯命令,如此的遞歸下去,知道有所得依賴目標都存在了 , 才會完成第一個編譯目標的編譯,這個也很好理解,只有依賴文件都存在了我們才能夠完成正確的編譯過程 。
Makefile當中的小技巧
  • makefile基本規則
編譯目標:依賴文件 編譯命令
  • 一個最基本的makefile
main: demo.o myprint.o gcc demo.o myprint.o -o out echo make 解析編譯完成demo.o: demo.c gcc -c demo.c -o demo.omyprint.o: myprint.c gcc -c myprint.c -o myprint.oclean: rm myprint.o demo.o out
  • 在makefile當中使用變量
cflags=-cmain: demo.o myprint.o gcc demo.o myprint.o -o outdemo.o: demo.c gcc $(cflags) demo.c -o demo.omyprint.o: myprint.c gcc $(cflags) myprint.c -o myprint.oclean: rm myprint.o demo.o out
  • 在makefile當中使用include
include submakefiledemo.o: demo.c gcc $(cflags) demo.c -o demo.omyprint.o: myprint.c gcc $(cflags) myprint.c -o myprint.oclean: rm myprint.o demo.o out
  • 在makefile當中使用PHONY
cflags=-cmain: demo.o myprint.o gcc demo.o myprint.o -o maindemo.o: demo.c gcc $(cflags) demo.c -o demo.omyprint.o: myprint.c gcc $(cflags) myprint.c -o myprint.oclean: rm myprint.o demo.o main.PHONY: clean # 增加這一行
  • 在makefile當中使用通配符
cflags=-cmain: demo.o myprint.o gcc demo.o myprint.o -o main%.o: %.c gcc $(cflags) $<clean: rm myprint.o demo.o main.PHONY: clean
  • 在makefile當中使用VPATH自動搜索
cflags=-cVPATH=./filesmain: demo.o myprint.o a.o b.o gcc demo.o myprint.o a.o b.o -o maindemo.o:demo.c gcc $(cflags) demo.c myprint.o:myprint.c gcc $(cflags) myprint.c a.o: a.c gcc $(cflags) $<b.o: b.c gcc $(cflags) $<clean: rm myprint.o demo.o main.PHONY: clean
  • @符號
有時候在makefile當中我們不想輸出某些命令(如果不進行設置makefile會輸出每一條我們執行過的命令),我們就可以使用@符號進行修飾 。
main: demo.c @echo hello world
  • override覆蓋命令行的賦值,讓makefile文件當中的變量覆蓋命令行當中的變量 。
Makefile當中進行if判斷ifeq 和 ifneq主要是用于判斷字符是否相等 。
cc=g++main: demo.c echo $(cc)ifeq ($(cc), gcc) echo $(cc) = 相等的語句執行了else echo $(cc) != 不相等的語句執行了endifcc=g++main: demo.c echo $(cc)ifneq ($(cc), gcc) echo $(cc) != gccelse echo $(cc) = gccendififdef 和 ifndef判斷變量是否被定義或者為空
foo = 1main: demo.c echo demoifdef foo echo define fooelse echo not define fooendifmain: demo.c echo demoifdef foo echo define fooelse echo not define fooendifMakefile當中的函數在makefile當中除了能夠使用條件表達式之外我們還可以使用函數 , 在makefile當中函數的使用規則如下:
$(<函數名> <函數參數>)或者將()替換為{}函數的調用規則如上圖所示,函數參數用.隔開 。
字符串函數subst$(subst <from>,<to>,<text>)
  • 字符串替換函數 。
  • 表示文本,這個函數會將text當中是的字符串替換為 。
s = ii am learning makefiless = $(subst ii, you, $(s))main: demo.c echo demo echo $(s) echo $(ss)patsubst$(patsubst <pattern>,<replacement>,<text>)
  • pattern 表示第一個參數,用于表示如何對 text 進行匹配 。
  • replacement 表示第二個參數 表示如何對匹配的字符進行重寫 。
  • patsubst在進行匹配替換的時候,會先將字符串text根據空格或者tab鍵或者回車換行符進行分割,然后一一的進行替換和匹配 。
s = a.c b.c d.c abc.c abo.css = $(patsubst %.c, %.o, $(s))main: demo.c echo demo echo $(s) echo $(ss)

推薦閱讀