1. 前言

在Android源码这样庞大的项目工程中,编译规则是通过makefile文件来组织起来的, make命令通过makefile文件中描述源程序之间的依赖关系进行自动编译;makefile文件是按照规定格式编写,需说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系;

2. make命令

make命令后接参数,称为目标;常见目标如下图所示:

指令 含义
make all  编译所有目标
make -j   使用所有的核心编译目标
make -j8 使用8个核心编译目标
make install 安装已编译的程序
make uninstall  卸载已安装的程序
make clean  删除由make命令产生的文件,通常删除目标文件.o
make distclean  删除由./configure产生的文件
make check 测试刚编译的软件
make installcheck 检查安装的库和程序
make dist  重新打包成packname-version.tar.gz

执行make命令时,需要一个Makefile文件,以告诉make命令如何编译和链接程序;

make的一些选项:

1、-f

直接运行make命令会在当前文件夹下寻找makefile或者Makefile文件,你可以通过-f选项来改变这种默认特性

make -f my_makefile
make 命令会选择扫描 my_makefile 来代替 Makefile。

2、-C

你可以为 make 命令提供不同的目录路径,在寻找 Makefile 之前会切换目录的。这是一个目录,假设你就在当前目录下:

$ ls
file file2 frnd1.cpp
但是你想运行的 make 命令的 Makefile 文件保存在 ../make-dir/ 目录下,你可以这样做:
$ make -C ../make-dir/make 命令首先切到特定的目录下,在那执行,然后再切换回来。

3、-B

make -B 会强制编译所有的目标文件以及最终的执行文件。

2.1 make如何工作

 1. make在当前目录下寻找“Makefile”或“makefile”文件
 2. 若找到,查找文件中的第一个目标文件.o
 3. 若目标文件不存在,根据依赖关系查找.s文件
 4. 若.s文件不存在,根据依赖关系查找.i文件
 5.  若.i文件不存在,根据依赖关系查找.c文件,此时.c文件一定存在,于是生成一个.o文件,再去执行

网络图片解释:

3. Makefile 文件

Makefile文件由一系列规则rules构成,每条规则形式如下:

<target>: <prerequisites>
[Tab]<commands>

第一行冒号前为目标,冒号后为前置条件;第二行必须由一个Tab键起首,后接命令;目标是必须的,不可省略;前置条件和命令是可选的,但两者必须至少存在一个。

用图来表达,比较通俗易懂:

3.1 目标target

目标可以是文件名,指明make命令所要构建的对象;也可以是某个操作名称,称“伪目标”;

clean:rm *.o

以上代码目标是clean,命令是rm *.o;

执行make clean命令,实现对象文件的删除;

3.2 前置条件prerequisites

前置条件通常是一组文件名,用空格隔开;
指定目标是否重新构建的判断标准——只要有一个前置条件不存在或有更新,则该目标需重新构建;

result.txt:source.txtcp source.txt result.txt

若当前路径下source.txt存在,make result.txt可正常执行,否则需再写一条规则,用于生成source.txt;

source.txt:echo "This is a source file." > source.txt

source.txt没有前置条件,与其他文件文官,只要该文件不存在,每次执行make source.txt命令都会生成该文件;

3.3 命令commands

命令表示如何更新目标文件,由一行或多行shell命令组成;

注:

shell命令一定是写在命令中,否则会被make忽略;

每行命令前必须有一个Tab键;

每行命令在一个独立的shell中执行,shell之间没有继承关系,因此上一行为的变量赋值,在下一行无效;

若前后两条命令有共享数据,可写在一行,用分号隔开;如:

var-kept:export foo=bar;echo "foo=[$$foo]"

4. makefile文件语法

1. 指令

指令 含义
# 注释
echoing 正常情况下,make打印每条命令,再执行该命令,称回声;在命令前加@,关闭回声,即只输出命令的执行结果,出错则停止执行
% make命令允许对文件名进行类似正则运算的匹配,主要用到%
$() 调用变量,将变量名放在$()中

2. 赋值运算符

指令 含义
= 递归展开赋值,默认赋值方式
:= 直接赋值,不会递归展开,若引用的变量不存在,则为空串
?= 若未初始化,则赋值
+= 将值追加到现有内容末尾

3. 自动变量

指令 含义
$@ 表示目标文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
$^ 表示所有的依赖文件
$% 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是“foo.a(bar.o)”,那么,“$%”就是“bar.o”,“$@”就是“foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。
$+ 这个变量很像“$^”,也是所有依赖目标的集合。只是它不去除重复的依赖目标。

make命令和Makefile语法相关推荐

  1. C语言:gcc编译过程及make命令、makefile语法规则

    gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...

  2. Makefile语法基础介绍

    在Linux下,make是一个命令工具,是一个解释Makefile中指令的命令工具.make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么样去编译和链接程序. make如何工作: ...

  3. 安卓makefile与linux,分析linux make命令与Makefile的区别

    学习linux make命令时,你可能会遇到make和makefile的区别问题,这里将介绍make和makefile的区别的详细方法,在这里拿出来和大家分享一下. Make命令 在linux mak ...

  4. make命令及makefile

    make命令及makefile 转自:https://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20 ...

  5. Makefile语法总结

    Makefile语法总结 C语言编译过程 预处理:将.h和.c文件处理为.i文件 编译:将.i文件编译为.s文件(汇编文件) 汇编:将.s文件编译为.o文件(二进制文件) 链接:将.o文件链接为.ou ...

  6. 深入学习Make命令和Makefile(上)

    https://www.zybuluo.com/lishuhuakai/note/209302 深入学习Make命令和Makefile(上) make是Linux下的一款程序自动维护工具,配合make ...

  7. Makefile语法基础

    Makefile语法 1. 规则格式 Makefile的规则格式如下示 目标... : 依赖文件集合...命令1命令2...... 命令列表中的每条命令必须以TAB键开始 Makefile中使用&qu ...

  8. make命令和makefile文件

    一.多个源文件带来的问题 在编写小程序时,许多人都会在编辑完源文件后简单地重新编译所有文件以重建应用程序.但对大型程序来说, 使用这种简单到处理方式会带来很明显的问题.编辑-编译-测试这一循环的周期将 ...

  9. 安装LoadRunner 11时弹窗提示Micosoft Visual C++ 2005 SP1 可再发行组件包(X86):'命令行选项语法错误。键入命令 / ? 可获得帮助信息'。

    如果安装LoadRunner 11时弹窗提示"Micosoft Visual C++ 2005 SP1 可再发行组件包(X86):'命令行选项语法错误.键入命令 / ? 可获得帮助信息'&q ...

  10. Make命令与Makefile文件

    Make命令 使用Make命令只会在必要时重新编译所有受改动影响的源文件.而不会因为只改动了一个文件而重新编译整个项目. Make命令不仅仅用于编译程序,无论何时,当需要通过多个输入文件来生成输出文件 ...

最新文章

  1. DOS文件转换成UNIX文件格式详解
  2. 深度学习中的图像分割:方法和应用、特点
  3. jQuery基础:下(事件及动画效果)
  4. 计算机专业推荐表自我介绍,就业推荐表-自我介绍
  5. HH SaaS电商系统的销售订单毛利润设计
  6. 一、Pytho第一课——Python安装及配置路径方法(最详细小白教程,没有之一。如若不懂,不是还可以私信嘛!对吧?)
  7. AndroidStudio_android通过自定义来实现倒计时的AlertDialog---Android原生开发工作笔记245
  8. 使用xshell6连接linux提示 WARNING! The remote SSH server rejected X11 forwarding
  9. 【流媒體】live555—VS2010 下live555编译、使用及测试
  10. [转]Terraform 使用 - 从最简单例子开始
  11. HDU6278 Just h-index
  12. libcurl代码示例
  13. python BeautifulSoup对应关系
  14. 基于MDK编译器 STM32与12864液晶显示程序 和电路连接
  15. java opencv 人脸相似度_java+opencv实现人脸识别程序记录
  16. 医院防统方软件解决方案
  17. 串口转以太网使用方法
  18. 【架构师必知必会系列】系统架构设计需要知道的5大精要(5 System Design fundamentals)...
  19. GPU占用率过高致错failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  20. 农民丰收节交易会亮点-农业大健康·万祥军:谋定功能性农业

热门文章

  1. [C#][Xml][Error Recording]System.ArgumentException:““.”(十六进制值 0x00)是无效的字符。”
  2. 关于如何解决Tomcat闪退的问题
  3. qDebug()执行过程解析
  4. 理解:守护线程---理解
  5. ONNX权重类型转换 INT64 to INT32
  6. 第01篇 入门及环境搭建
  7. TensorFlow 二分类
  8. c++引用与指针的区别(着重理解)
  9. 软件建模工具(Visio 2013)
  10. AVS3中的patch(片)