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总述的更多相关文章

  1. [转] Makefile 基础 (2) —— Makefile 总述

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  2. Makefile总述②文件命名、包含其他文件makefile、变量、重建重载、解析

    Makefile的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则.隐含规则.变量定义.指示符和注释. 显式规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件( Ma ...

  3. makefile笔记2 - makefile总述

    一.makefile的组成 Makefile 里主要包含了五个东西:显示规则.隐晦规则.变量定义.文件指示和注释. 1. 显示规则.显示规则说明了,如何生成一个或多的的目标文件.这是由 Makefil ...

  4. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

  5. Linux makefile教程之总述二[转]

    Makefile 总述——————— 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或 ...

  6. Web应用程序系统的多用户权限控制设计及实现-总述【1】

    中大型的Web系统开发均需要权限的配置,基于多角色,多用户的操作权限管理是一个系统开发的基础.搭建好一套权限,用户,角色,页面一体的开发架构,可以用于后期业务的开发,同时也可用于不同业务的系统开发. ...

  7. Solr4.8.0源码分析(5)之查询流程分析总述

    Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilt ...

  8. 自顶向下深入分析Netty(七)--ChannelPipeline和ChannelHandler总述

    自顶向下深入分析Netty(七)--ChannelPipeline和ChannelHandler总述 自顶向下深入分析Netty(七)--ChannelPipeline源码实现 自顶向下深入分析Net ...

  9. 自顶向下深入分析Netty(六)--Channel总述

    自顶向下深入分析Netty(六)--Channel总述 自顶向下深入分析Netty(六)--Channel源码实现 6.1 总述 6.1.1 Channel JDK中的Channel是通讯的载体,而N ...

随机推荐

  1. Flask实现群聊

    后端 from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import WSGIServer from ge ...

  2. ip地址和网络端口总结

    ip地址 ip地址默认指ipv4地址,用4个字节表示,转换为点分10进制,可以表达范围0.0.0.0到255.255.255.255的地址,大约为42.95亿个地址.互联网编号分配机构(IANA,In ...

  3. Termux基础教程(一):技能部署

    Termux基础教程 by CUCI Termux 是一个 Android 下一个高级的终端模拟器,开源且不需要 root,支持 apt 管理软件包,十分方便安装软件包,完美支持 Python. PH ...

  4. Ubuntu20.04 体验和美化

    Ubuntu20.04美化和体验 windows用久了,换下系统也挺好的.ubuntu20.04优化后,用起来蛮舒服的. 系统配置 1.修改软件源 Ubuntu默认是国外的软件源, 我们可以手动切换为 ...

  5. spring boot:使用多个redis数据源(spring boot 2.3.1)

    一,什么情况下需要使用多个redis数据源? 为了缓存数据,通常我们会在线上使用多个redis的cluster, 每个cluster中缓存不同的数据,以方便管理. 例如:我们缓存了杂志文章/商品信息/ ...

  6. 一文读懂Redis常见对象类型的底层数据结构

    Redis是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合( ...

  7. 洛谷 P6419 Kamp 题解

    明天就SX AFO了交篇题解%一下 这题大概是我第一道有独立思考切掉的紫题 之前的都是各种抄借鉴题解 为什么写这题的题解呢?另一个重要的原因是这样的↓ 翻了翻已有题解中的几篇,下面几种情况屡见不鲜 样 ...

  8. 【认知服务 Azure Cognitive Service】使用认知服务的密钥无法访问语音服务[ErrorCode=AuthenticationFailure] (2020-08时的遇见的问题,2020-09月已解决)

    问题情形 根据微软认知服务的文档介绍,创建认知服务(Cognitive Service)后,可以调用微软的影像(计算机视觉,人脸),语言(LUIS, 文本分析,文本翻译),语音(文本转语音,语音转文本 ...

  9. 树莓派调试PCF8591遇到的小问题

    错误提示:bus = smbus.SMBus(1) IOError: [Errno 2] No such file or directory 提示的内容为端口没有打开即IIC端口:如图,打开IIC使能 ...

  10. plsql查询中文乱码

    1.查看数据库字符集 select userenv('language') from dual 查看数据库字符集 2.在环境变量中添加并设置变量 变量名:NLS_LANG: 变量值:第一步查询的数据库 ...