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


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