GNU Makefile簡介

前 言


    本篇旨在介紹GNU Makefile的基本概念。雖是基礎,個人認爲,也是GNU Makefile的核心內容,理

解掌握這些核心,GNU Makefile也應在指掌之間了。


make是怎樣處理Makefile文件的?


    先描述一下下面幾條include指令的處理過程。

   include filenames
   -include filenames
   sinclude filenames

    對於這幾條指令的語法不做詳細描述,只描述一下它們的處理過程以及彼此之間的區別。

當make遇到以上指令時,會暫停對當前makefile的讀取,依次讀取filenames指定的文件列表。如果在依

次讀取filenames文件列表中文件時,某個文件不能找到,make會給出一個警告信息,然後繼續讀取剩下

的文件,讀取完後會回到include指令之後位置,繼續讀取被暫停的makefile。當所有的內容都被讀後,

make會試圖根據所有讀取到make規則來創建在include時缺失的文件,如果不能找到創建規則,make將報

錯。

    include和-include的區別在於,在被包含的文件缺失且沒有對應的創建規則時,include會報錯,

而-include不會報錯。sinclude可簡單認爲等同於-include。


    接下來,描述make對makefile的讀取過程。

    makefile的讀取分爲2個階段。


    階段1:

    . 讀取所有的makefile,以及包含的makfile;

    . 將讀取的所有變量及其值,所有隱式、顯式規則內置;

    . 建立所有目標和先決條件的依賴樹。


    階段2:

    . 決定要建立的目標並執行所需的規則創建目標。


    makefile包含變量、規則、註釋等。

    理解變量,規則中變量的展開的時機(在階段1,還是階段2展開),對於正確理解makefile,編寫

makefile非常重要。

    下面標記爲immediate的爲階段1展開,標記爲deferred的爲第2階段展開。


    變量的展開時機:    

   immediate = deferred
   immediate ?= deferred
   immediate := immediate
   immediate ::= immediate
   immediate += deferred or immediate
   immediate != immediate

   define immediate
       deferred
   endef

   define immediate =
       deferred
   endef

   define immediate ?=
       deferred
   endef

   define immediate :=
       immediate
   endef

   define immediate ::=
       immediate
   endef

   define immediate +=
       deferred or immediate
   endef

   define immediate !=
       immediate
   endef


    規則各部分展開時機

    immediate : immediate ; deferred
        deferred


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