Linux Makefile 編譯速度的優化【轉】


轉自:https://blog.csdn.net/QQ1452008/article/details/51851801

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/QQ1452008/article/details/51851801

前言

如何提高 Makefile 的編譯速度呢?既然是提高,那肯定是對於大項目而言,因為小項目本身源文件不多,Makefile 優化與否,對於編譯速度而言,影響並不大。當然對於那些追求速度達到極致的人而言,就另當別論了。廢話不多說了,切入主題!

本博文會隨着所遇見的Makefile編譯速度有關的問題而持續更新。

1. 賦值運算符的影響

‘:=’ 和 ‘=’ 兩個賦值運算符是如何影響編譯速度的呢?這其中的奧妙就在於它們的本質含義,若是理解透徹了也就不會心存疑惑了,博主也是苦思了很久,並且搜索了很多網絡資料,最后被該篇博文一語驚醒!請點擊此處查看該博文

  • = 賦值運算符 - 遞歸展開式 - 延后展開
    “=”表示將整個 Makefile 展開后,再決定變量的值,即變量的值將會是整個Makefile中最后被遞歸展開所指定的值,而不管其引用的中間變量是在執行目標規則之前還是之后。

示例如下:

foo = $(bar) bar = $(ugh) ugh = $(Huh) all: @echo $(foo) Huh = AfterTarget

 

make之后其結果為 : AfterTarget 其整個執行過程如下: 首先“$(foo)”被替換為“$(bar)”, 接下來 “$(bar)”被替換為“$(ugh)”, “$(ugh)”被替換為“$(Huh)”, 最后$(Huh)被替換為“AfterTarget”。 整個替換的過程是在執行“echo $(foo)”是進行的。

 

注意一句話:整個替換的過程是在執行“echo $(foo)”時進行的。

  • :=賦值運算符 - 直接展開式 - 立即展開
    “:=”表示變量的值決定於它在 Makefile 中的位置,而不是整個 Makefile 展開后的最終值。在使用該賦值運算符來定義變量時,變量值中對另外變量的引用或者函數的引用在定義時就被展開了,即定義時變量就已經是其表達式最終的值了。

示例如下:

x := foo y := $(x) bar x := xyz

 

在上例中,y的值將會是 foo bar ,而不是 xyz bar 了。


以上是這兩個賦值運算符基本的說明,下面詳細描述其是怎么影響編譯速度的!

示例如下:

TmpDir = /Source  #此處隨意定義了一個目錄, #但切記在實際編寫的 Makefile 中,不要在賦值語句后面寫注釋, #否則會把 /Source 到 # 之間的空格也算進去的。 #在下面引用該變量的時候實際上‘/Source_’最后還多了一個空格 #為了表示清楚,我用下划線表示空格,這樣的目錄肯定是不存在的 #以下語句調用了Shell函數,其結果是把指定目錄下的所有源文件賦值給 x 變量, #兩者取其一運行make #x := $(shell cd $(TmpDir); ls *.c) x = $(shell cd $(TmpDir); ls *.c) all: @echo $(x) @echo $(x) @echo $(x)

 

  1. := 是立即變量賦值,在定義時值已經被確定。執行 make 時, x 的值已經是指定目錄下的所有源文件了,所以盡管后面執行了三次 @echo $(x) ,但其實 Shell函數只調用了一次

  2. = 是延時變量賦值,只有在這個變量被使用時才展開。執行 make 時, x 定義時其值並沒有展開,所以后面執行了三次 @echo $(x) ,每次都調用了 Shell 函數,最終調用了三次 Shell 函數

通過以上分析過程,對於這兩個運算符是如何影響編譯速度的疑惑應該心里有底了。

  • 總結
    makefile 的解析分為兩個階段,第一階段生成規則和依賴關系,第二階段執行規則;只有立即展開的變量會在第一階段計算,而延后展開的變量會在第二階段計算。

    當使用‘=’賦值運算符對變量進行賦值,若變量定義中使用了函數,則包含在變量值中的函數總會在引用了該變量的規則的地方被執行,若 Makefile 中多處引用了該變量(不要忽略了隱晦規則中的引用),此時就需要考慮使用‘:=’賦值運算符,來減少變量的展開次數以及函數的調用次數,從而提高編譯速度。

參考博文:http://blog.csdn.net/crylearner/article/details/17271195

--------------------- 本文來自 Jerry_yl_ 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/QQ1452008/article/details/51851801?utm_source=copy 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM