make和makefile

makefile文件帮助我们记录了整个项目工程的所有需要编译的文件列表,这样我们在编译时仅需要输入简单的make命令就能编译出我们期望的结果。

makefile文件反映了整个项目中各个模块的依赖关系,这样我们改动了某些源文件以后,仅需简单的输入make命令,make工具就会根据makefile文件里描述的依赖关系帮助我们分析那些模块需要重新编译,并执行相应的操作。

在linux/unix开发环境中,makefile文件则是描述了一个特定编译系统所需要的策略,而make工具则是通过解析makefile文件并执行相应的命令来帮助我们构建其编译系统。

makefile简介

makefile就是一个简单的文本文件,它基本就是有一条条规则构造。

一条makefile的规则构成如下:

target:prerequisites

<tab> command1

<tab> command2

.....

<tab> command

target:规则的目标,可以简单理解为这条规则存在的目的是什么。通常是程序中间或者最后需要生成的文件名,也可以不对应具体的文件,而仅仅就是个概念上的规则目标。

prerequisites:规则的依赖列表,可以简单的理解为要达到本条规则的目标所需要的先决条件是什么。可以是文件名,也可以是其他规则的目标;

command:规则的命令,可以简单的理解为当目标所需要的先决条件的满足了之后,需要执行什么动作来达成规则的目标。规则的命令其实就是shell命令。一条规则中可以有多行命令,特别注意:每行命令都必须以tab键开始。

make工作原理

make命令如何使用?

make从哪里读取makefile?

mak如何解析执行makefile文件的规则?

make命令的基本使用范式如下:

make [ -f makefile ] [ options ] ... [ targets ] ...

使用make命令最简单的方式主要有以下四种方式:

1.简单粗暴,不带任何参数,直接指向make:

make

2.指定makefile文件

make –f <makefile_name>

3.指定makefile目标

make <target>

4.到指定目录下执行make

make –C <subdir> <target>

在执行make 的时候,我们可以带上 –f <文件名>参数,来指定make命令从哪里读取make文件;而如果我们不显示指定,则make就会在当前目录下依次查找名字为GNUmakefile,和Makefile,makefile的文件来作为其makefile文件。

在读取完makefile的内容后,make工具并不是逐条去执行makefile里的规则,而是以某条规则为突破口,多米诺骨牌效应式的去执行makefile里的规则。而这条作为突破口的规则的目标,称为终极目标 ,我们可以在执行make时以参数的形式指定终极目标,从而执行作为突破口的规则,如果我们不显式指定终极目标,make一般情况下将选择makefile的第一条规则的目标作为终极目标。

一般情况下,make执行一条规则的具体过程是这样的:

make解析makefile的流程如下:
假设makefile内容如下:

终极目标:依赖A 
依赖B 依赖C

终极目标命令

依赖A:子依赖A1 子依赖A2

依赖A命令

依赖B:子依赖B1 子依赖B2

依赖B命令

依赖C:子依赖C1 子依赖C2

依赖C命令

过程一,以终极目标为树根,解析出整颗依赖树:

过程二,对整颗依赖树以从底到上,从左到右的顺序,解析执行每一条规则:

最新文章

  1. android 学习中的一些问题记录 主要是概念问题
  2. 一个App需要的东西
  3. java中的异常理解
  4. docker 初探
  5. Android Camera进行拍照
  6. vbs脚本总结
  7. squid代理服务器搭建及配置
  8. 关于使用digitalocean的vps
  9. HTML5视频
  10. java学习一目了然&mdash;&mdash;异常必知
  11. u-boot TFTP: &amp;#39;Access violation&amp;#39; (2)
  12. 关于css的hack问题
  13. 来一波CSS兼容问题小总结吧
  14. WPF制作带明细的环形图标
  15. MySQL之增_insert-replace
  16. mysql:联合查询
  17. java web 项目中获取当前路径的几种方法
  18. 利用python实现简单随机验证码
  19. linux shell 脚本 svn自动更新项目并且打包 、发布、备份
  20. TCP 三次握手与四次断开

热门文章

  1. .NET / C# 时间与时间戳的转换
  2. 通过Ldap实现人事系统组织人事和AD的同步
  3. VMwarm下安装ubuntu的一些问题
  4. [Windows] - DNS防污染工具Pcap_DNSProxy
  5. JS 中类型和类型转换
  6. 老生常谈之js深拷贝与浅拷贝
  7. Android-----解析xml文件的三种方式
  8. 设计模式之动态代理(JDK代理)
  9. .Net core 使用swagger进行Api管理
  10. Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制