先看下面的Makefile代码:

# Makefile for boot
# Programs, flags, etc.
ASM        = nasm
ASMFLAGS    = -I include/
# This Program
TARGET        = boot.bin loader.bin
# All Phony Targets
.PHONY : everything clean all
# Default starting position
everything : $(TARGET)
clean :
    rm -f $(TARGET)
all : clean everything
boot.bin : boot.asm include/load.inc include/fat12hdr.inc
    $(ASM) $(ASMFLAGS) -o $@ $<
loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc
    $(ASM) $(ASMFLAGS) -o $@ $<

在上述代码中,以字符#开头的行是注释,=是用来定义变量的,这里ASM和ASMFLAGS就是2个变量,要注意的是:使用这些变量的时候要使用如下格式:
$(ASM)和$(ASMFLAGS),
其分别代表 nasm 和 -I include/ ,而不是直接使用他们的原型。
MakeFile语法:
target    :    prerequisites
                command
上述形式的格式代表两层含义:
1.    要想得到target,需要执行命令command。
2.    target依赖prerequisites,当prerequisites中至少有一个文件比target文件新时,command才被执行。
现在我们根据上述语法来翻译上述代码中的最后2行:
loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc
    $(ASM) $(ASMFLAGS) -o $@ $<
1.    要想得到loader.bin,需要执行“$(ASM) $(ASMFLAGS) -o $@ $<”。
2.    loader.bin依赖下述文件:
        loader.asm
        include/load.inc
        include/pm.inc
        include/fat12hdr.inc
    当它们中至少有一个比loader.bin新时,command命令被执行。
那么“$(ASM) $(ASMFLAGS) -o $@ $<“    又是什么呢?其中,
$@ 代表 target;
$< 代表prerequisites的第一个名字;
联系我们之前说的$(ASM)和 $(ASMFLAGS)的含义,我们知道:
$(ASM) $(ASMFLAGS) -o $@ $<
等价于:
nasm -I include/ -o loader.bin loader.asm
在上述Makefile文件中,我们注意到:不但boot.bin和loader.bin两个文件后面有冒号,everything/clean/all后面也有冒号,可是他们3个并不是3个文件,仅仅是动作名称而已。如果运行“make clean“,将会执行“rm -f $(TARGET)”,即rm -f boot.bin loader.bin
all后面紧跟的是clean和everything,这表示,如果执行“make all”,clean和everythiny所表示的动作都将分别被执行。
至此,我们已经分析完上述Makefile文件的全部代码!哦,对了,还有.PHONY没有分析,其实.PHONY关键字表示它后面的名字并不是文件,而仅仅是一种行为的标号。

当我们直接输入make命令是,make程序会从第一个名字所代表的动作开始执行。在本例中,第一个标号是everything,所以make 和 make everything是一样的。

Makefile文件的使用相关推荐

  1. makefile文件编写教程

    技术交流QQ群:1027579432,欢迎你的加入! 1.make介绍 gcc:编译器(gcc根据菜谱进行编译) make: linux自带的构建器(相当于一个菜谱) 构建的规则(菜谱)在makefi ...

  2. [转]C++ 使用Makefile文件

    //*********list class.h********** class tdate { private: int month; int day; int year; public: tdate ...

  3. 解析Makefile文件的构建规则

    2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...

  4. 例解 autoconf 和 automake 生成 Makefile 文件

    http://www.ibm.com/developerworks/cn/linux/l-makefile/ 生成 Makefile 的来龙去脉 首先进入 project 目录,在该目录下运行一系列命 ...

  5. Makefile文件应用——huge项目

    提高复用性 在build目录下,保存公用部分make.rule (1)绝对路径 用ROOT变量保存项目根目录 (2)增加控制变量 EXE/LIB/ (3)头文件查找目录 gcc 的-I(i的大写)选项 ...

  6. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  7. MakeFile 文件的作用

    makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefi ...

  8. VS.net下编写makefile文件--NMAKE用法

    1.程序源文件: 如有三个文件:主文件:hello.cpp,类NUM的说明和实现文件:Num.h和Num.cpp,内容如下: main.cpp: #include "iostream&quo ...

  9. makefile文件简要介绍

    到此为止,读者已经了解了如何在Linux下使用编辑器编写代码,如何使用Gcc把代码编译成可执行文件,还学习了如何使用Gdb来调试程序,那么,所有的工作看似已经完成了,为什么还需要Make这个工程管理器 ...

最新文章

  1. 手动生成token_手动设计简单的Token验证
  2. 028_SpringBoot整合Redis
  3. 运用ajax技术写联动的效果
  4. vue子组件获取父组件数据_在vue.js中父组件是如何向子组件传递数据的?
  5. 完全备份指的是对整个计算机系统,网络安全管理实践题库:在备份技术中,差分备份就是对整个系统所有文件进行完全备份,包括所有系统和数据。()...
  6. 第19讲:Pyppeteer 爬取实战
  7. ubuntu修改默认root密码
  8. 数据库系统概论(第五版) 王珊 第一章课后习题答案
  9. 中国近代史-蒋廷黻-笔记-第一章-剿夷与抚夷-第二节-英国人做鸦片买卖
  10. Redis【有与无】【Lettuce】L4.Redis Sentinel
  11. 设计模式——原形模式
  12. 计算机病毒 笑话,轻松一刻:因为男生的电脑容易中病毒
  13. uart口图片_串口(USART)框图的讲解
  14. Python 负载均衡,数据轮询 hash字符串 hashlib
  15. MyBatis-Plus DQL与其他知识点
  16. win10系统AMD显卡OBS录屏黑屏解决方法
  17. java SWT:MouseEvent,KeyEvent中stateMask字段的用法
  18. 判断一个人能否胜任团队leader,就看这一点,转载
  19. 人教版初中数学九年级上册“阅读与思考”《黄金分割》教学设计
  20. 【无标题】桥梁防撞预警系统

热门文章

  1. 【Android WebSocket】Android 端 WebSocket 基本用法 ( 添加依赖和权限 | 创建 WebSocketClient 客户端类 | 建立连接并发送消息 )
  2. 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
  3. 【鸿蒙 HarmonyOS】UI 组件 ( 拖动条 Slider 组件 )
  4. 【计算机网络】网络层 : ICMP 协议 ( ICMP 差错报文 | 差错报文分类 | ICMP 询问报文 | ICMP 应用 | Ping | Traceroute )
  5. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
  6. 【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法
  7. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)
  8. Mac上在终端上解压与压缩
  9. 02027_线程池练习:返回两个数相加的结果
  10. JavaScript HTML DOM - 改变 CSS