首页 > 其他 > 详细

《GNU_Makefile》——第3章,Makefile总述

时间:2020-05-13 21:13:30      阅读:65      评论:0      收藏:0      [点我收藏+]

1.makefile的内容

  一个完整的makefile包含5个东西:

    显示规则,隐含规则,变量定义,指示符,注释

(1)显示规则

    描述如何更新目标文件。

(2)隐含规则

    make程序内置的规则。

    make根据目标文件名(后缀)推导出依赖文件,并使用默认的命令对目标进行更新

(3)变量定义

    使用一个字符或字符串代表一个文本串

(4)指示符

    指明make读取makefile文件时,要执行的动作。

    【1】读取一个文件,如 -f 

    【2】处理或忽略makefile中特定部分,如 条件执行(ifeq, ifneq, ifdef, ifndef)

    【3】定义一个多行变量,如 define 

(5)注释

    用 #,连接符 \

 

2. 指定首个makefile文件

  make默认读取本目录的makefile文件。

  使用 make -f xxx, 来显示指定。

 

3.包含其他makefile文件

  使用指示符 include

  include FILENAMES...

  include指示符命令make暂停当前makefile文件读取,去读取include指定的文件,完成后,继续读取当前makefile文件。

  如果include 指定的文件,不是用绝对路径描述,则make会在命令行参数 -I 或 --include-dir 指定的目录查找该文件,若没找到则在 /usr/gnu/include /usr/local/include /usr/include 中查找

  若依旧没找到include指定的文件,make不会退出,只会报警告。当解析阶段结束,进入运行阶段,make会尝试使用规则创建该文件,若无法创建,则会报错退出。

  Make*** No rule to make target ‘<filename>’. Stop
  若不希望因为无法加载或创建文件导致报错,可以使用 -include 或 sinclude。

 

4.MAKEFILES

  若设置了 MAKEFILES 环境变量,make会先读取该变量指定的makefile文件。

 

5.MAKEFILE_LIST

  当make读取了多个makefile文件,在对这些文件进行执行前,会将其名字追加到 MAKEFILE_LIST 。

  可以这样使用

name1 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
include inc.mk
name2 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
all:
    @echo name1 = $(name1)
    @echo name2 = $(name2)

  运行结果

name1 = Makefile
name2 = inc.mk

6.

7.

8.

9.make如何解析makefile文件

  GNUmake执行分为两阶段

  第一阶段(解析):读取所有makefile文件,构建目标依赖关系树。

  第二阶段(运行):根据关系树和时间戳,使用规则,更新过期了的目标。

 

10.总结

  make的执行过程如下:

(1)读取所有makefile文件(通过MAKEFILES环境变量,-f命令行参数,include指示符确定makefile文件)

(2)查找重建所有已读取makefile文件的规则。

(3)初始化并展开立即展开变量和函数,并根据条件判断确定执行分支

(4)根据终极目标和目标依赖关系建立关系树

(5)根据时间戳和依赖关系树更新过期的目标

 

  

 

《GNU_Makefile》——第3章,Makefile总述

原文:https://www.cnblogs.com/yangxinrui/p/12882319.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!