前言

  • 本笔记主要记录Makefile一些概念要点。
  • 本笔记为提取性笔记,章节与《跟我一起写Makefile》同步,所以会看到有些小标题会跳过。

概念

Chapter 2:介绍

2.1 makefile的规则

target ... : prerequisites ...
command
...
...
  • target

    • 可以是一个object file(目标文件)
    • 也可以是一个执行文件
    • 还可以是一个标签(label)。
  • prerequisites

    • 生成该 target 所依赖的文件 和 / 或 targe。
  • command

    • 为该 target 要执行的命令(任意的shell命令)。
  • 注:prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行

2.3 make 是如何工作的 **

在默认的方式下,也就是我们只输入 make 命令,就会按下面流程走

  1. make会在当前目录下找名字叫 Makefilemakefile 的文件。

    • GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件—— GNU-makefilemakefileMakefile
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到edit这个文件,并把这个文件作为最终的目标文件。
    • 注:此处的 "edit" 是第一个目标,例子就不贴出来了。
  3. 如果 edit 文件不存在,或是edit所依赖的后面的.o文件的文件修改时间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
  4. 如果 edit 所依赖的.o文件也不存在,那么 make 会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成.o文件,然后再用.o文件生成make的终极任务,也就是执行文件 edit 了。

2.5 让 make 自动推导

 该功能了解一下。

 只要make看到一个.o文件,它就会自动地把.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。并且cc -c whatever.c也会被推导出来。

如:

whatever.o : whatever.h
# 等价于
whatever.o : whatever.c whatever.h
cc -c whatever.c

2.8 Makefile 里面有什么

Makefile 里主要包含了五个东西:

* 显式规则

* 隐晦规则

* 变量定义

* 文件指示

* 注释

  • 注:还值得一提的是,在Makefile中的命令,必须要以Tab键开始。

    以上几点详细解释参考《跟我一起写Maefile》对于章节

2.9 Makefile 的文件名

  • 默认情况下,make命令会在当前目录下按顺序找寻文件名为 GNUmakefilemakefileMakefile的文件。

    • 推荐使用 Makefile 命名。
  • 也可以使用别名命名,如 Makefile.buildabcde等等,只需要使用 make -f 文件名make -file 文件名 来指定文件名即可。

2.10 引用其它的Makefile

  • 在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的 #include ,被 包含的文件会原模原样的放在当前文件的包含位置。
  • include 语法:
    • filename 可以是当前操作系统 Shell 的文件模式(可以包含路径、通配符和多个文件)(多个文件时用空格隔开)。
include <filename>

寻找其它的 Makefile 路径及顺序

  1. 先在 filename 指定路径找。如:include <./Makefile.build> ,表示在当前路径先找。
  2. 如果 filename 没有指定路径的话,就先从 make 当前路径先找。
  3. 以上两个都没有,便开始找 make-I--include-dir 指定路径找。
  4. 还没找到便去目录 /include (一般是:/usr/local/bin 或 /usr/include)找。
  5. 都没有便发出警告。(若想略过警告,可以使用 - 号,-include
  • 总结一下:filename指定路径->当前路径->-I或--include-dir 指定路径->最后路径

2.11 环境变量 MAKEFILES

不建议使用 MAKEFILE 变量。需要了解,可以看文档。

**若使用Makefile时,出现了神奇的 bug ,可以先看看当前环境变量中有没有定义这个变量。

2.12 make 的工作方式

GNU 的 make 工作时的执行步骤如下:

  1. 读入所有的 Makefile。
  2. 读入被 include 的其它 Makefile。
  3. 初始化文件中的变量。
  4. 推导隐晦规则,并分析所有规则。
  5. 为所有的目标文件创建依赖关系链。
  6. 根据依赖关系,决定哪些目标要重新生成。
  7. 执行生成命令。

参考

书籍

  • 《GUN Makefile》
  • 《跟我一起写Makefile》

【Makefile】2-Makefile的介绍及原理的更多相关文章

  1. Configure,Makefile.am, Makefile.in, Makefile文件

    一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...

  2. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  3. 转载:AbstractQueuedSynchronizer的介绍和原理分析

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  4. Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码

    摘要 终端传值给Makefile,咋传?只需在终端输入以下命令,那么就可以在Makefile文件中放心大担的使用$(abcde)这个变量了,它的值为BBB Makefile fun.h #includ ...

  5. AbstractQueuedSynchronizer的介绍和原理分析(转)

    简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...

  6. CGLIB介绍与原理

    转载: http://blog.csdn.net/zghwaicsdn/article/details/50957474 CGLIB介绍与原理(部分节选自网络) 一.什么是CGLIB? CGLIB是一 ...

  7. Servlet过滤器介绍之原理分析

    zhangjunhd 的BLOG     写留言去学院学习发消息 加友情链接进家园 加好友 博客统计信息 51CTO博客之星 用户名:zhangjunhd 文章数:110 评论数:858 访问量:19 ...

  8. Makefile.am, Makefile.in 与 Makefile的关系(转)

    文章出处:http://blog.mcuol.com/User/wangguangdong/Article/17384_1.htm Makefile.am, Makefile.in, Makefile ...

  9. Hadoop数据管理介绍及原理分析

    Hadoop数据管理介绍及原理分析 最近2014大数据会议正如火如荼的进行着,Hadoop之父Doug Cutting也被邀参加,我有幸听了他的演讲并获得亲笔签名书一本,发现他竟然是左手写字,当然这个 ...

随机推荐

  1. 「NGK每日快讯」11.28日NGK公链第25期官方快讯!

  2. BGV币与YFI币、YFII币存在着怎样的相关性?

    大多数的玩家并没有长期的打算,而是更倾向于关注短期利好的币种.比如最近在圈内赚足眼球的YFI,之所以能够成为明星角色,并非它的技术和平台,而是因为它在短期就创造了86倍的暴涨.YFI币的暴涨在某种程度 ...

  3. redis的两种持久化的机制,你真的了解么?

    redis提供了两种持久化的机制 RDB和AOF机制 RDB(redis Database):RDB保存某一个时间点之前的快照数据. AOF(Append-Only File):指所有的命令行记录以r ...

  4. 【SpringMVC】 4.2 异常处理

    SpringMVC学习记录 注意:以下内容是学习 北京动力节点 的SpringMVC视频后所记录的笔记.源码以及个人的理解等,记录下来仅供学习 第4章 SpringMVC 核心技术 4.2异常处理   ...

  5. CSS中Position属性static、absolute、fixed、relative

    在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如下图所示   CSS中Position属性有四个可选值,它们分别是:static.absolute.fixed.rel ...

  6. Java进阶专题(二十六) 数据库原理研究与优化

    前言 在一个大数据量的系统中,这些数据的存储.处理.搜索是一个非常棘手的问题. 比如存储问题:单台服务器的存储能力及数据处理能力都是有限的, 因此需要增加服务器, 搭建集群来存储海量数据. 读写性能问 ...

  7. Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)

    1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...

  8. 主键策略+mybayisPlus自动增长

    主键策略: 1.自动增长 有一点小缺陷:例如当一张表里的数据过于庞大时我们会进行分表操作,若是用自动增长策略,那么除了第一张表外的每一张表都必须知道上一张的表的的最后ID值.这个操作便会造成效率的变低 ...

  9. JVM线上故障初步简易排查

    线上故障主要包括cpu 磁盘 内存 网络等问题 依次排查 1.cpu 1) 先用ps找到进程pid 2) top -H -p pid 找到cpu占用高的线程 3)printf '%x\n' pid 获 ...

  10. 关于电脑硬盘的二三事(SATA接口)

    @ 目录 前言 接口分类 SATA3接口 机械硬盘 机械硬盘的特点和主要参数 西部数据机械盘分类 绿·蓝·黑盘 红盘 紫盘 金盘 希捷机械盘分类 酷狼 酷鱼 酷鹰 银河 SATA3接口的固态硬盘 固态 ...