当前位置: 首页 > news >正文

Linux make 检查依赖文件更新的原理

1. 文件的时间戳

make 主要依靠文件的时间戳来判断依赖文件是否有更新。每个文件在文件系统中都有一个时间戳,记录了文件的三种重要时间:

  • ​访问时间(Accesstime)​​:文件最后一次被访问的时间。
  • ​修改时间(Modifytime)​​:文件内容最后一次被修改的时间。
  • ​状态改变时间(Changetime)​​:文件的状态(如权限、所有者等)最后一次被修改的时间。

make 主要关注的是文件的修改时间(mtime)。

2. 比较时间戳的过程

当 make 读取 makefile 中的规则时,会按照以下步骤检查依赖文件是否有更新:

步骤一:确定目标和依赖文件

假设 makefile 中有这样一个规则:

main: main.o add.o sub.o
    gcc main.o add.o sub.o -o main

这里 main 是目标文件,main.oadd.o 和 sub.o 是依赖文件。

步骤二:检查目标文件是否存在
  • 如果目标文件 main 不存在,那么 make 会认为目标文件是最新的(因为还没有生成),需要执行规则中的命令来生成目标文件。
  • 如果目标文件 main 存在,继续下一步。
步骤三:比较目标文件和依赖文件的修改时间
  • make 会获取目标文件 main 的修改时间(mtime)。
  • 然后依次获取每个依赖文件(main.oadd.o 和 sub.o)的修改时间。
步骤四:判断是否需要重新生成目标文件
  • 如果任何一个依赖文件的修改时间比目标文件的修改时间新,说明依赖文件有更新,make 会执行规则中的命令来重新生成目标文件。
  • 如果所有依赖文件的修改时间都不比目标文件的修改时间新,说明目标文件已经是最新的,make 不会执行任何命令。
3. 示例说明

假设当前目录下有以下文件及其修改时间:

  • main:2025-04-04 10:00:00
  • main.o:2025-04-04 09:00:00
  • add.o:2025-04-04 9:30:00
  • sub.o:2025-04-04 10:30:00

当运行 make 时:

  • make 发现目标文件 main 存在。
  • 获取 main 的修改时间为 2025-04-04 10:00:00。
  • 检查依赖文件:
    • main.o 的修改时间为 2025-04-04 09:00:00,比 main 的修改时间旧。
    • add.o 的修改时间为 2025-04-04 09:30:00,比 main 的修改时间旧。
    • sub.o 的修改时间为 2025-04-04 10:30:00,比 main 的修改时间新。

由于 sub.o 的修改时间比 main 的修改时间新,make 会认为 main 需要重新生成,因此会执行规则中的命令:

gcc main.o add.o sub.o -o main
4. 特殊情况处理
  • ​依赖文件不存在​​:如果规则中的某个依赖文件不存在,make 会认为这个依赖文件需要生成,从而执行相应的命令来生成这个依赖文件,然后再重新检查目标文件是否需要更新。
  • ​手动修改时间戳​​:如果手动修改了文件的时间戳,但没有实际修改文件内容,make 可能会错误地认为该文件已经更新,从而重新生成依赖它的目标文件。为了避免这种情况,可以使用 touch 命令来正确更新文件的时间戳。

总结

  • ​时间戳机制​​:make 主要依靠文件的时间戳(特别是修改时间 mtime)来判断依赖文件是否有更新。
  • ​比较过程​​:make 会获取目标文件和依赖文件的修改时间,并比较它们的大小。如果任何一个依赖文件的修改时间比目标文件的修改时间新,make 会执行规则中的命令来重新生成目标文件。

文章转载自:
http://banshie.isnyv.cn
http://albumin.isnyv.cn
http://aureus.isnyv.cn
http://aphelion.isnyv.cn
http://antiemetic.isnyv.cn
http://annihilation.isnyv.cn
http://baddie.isnyv.cn
http://california.isnyv.cn
http://chaulmoogra.isnyv.cn
http://anhydride.isnyv.cn
http://camping.isnyv.cn
http://charterer.isnyv.cn
http://buddhism.isnyv.cn
http://antimonic.isnyv.cn
http://archdeaconry.isnyv.cn
http://chela.isnyv.cn
http://alertness.isnyv.cn
http://agarose.isnyv.cn
http://assuan.isnyv.cn
http://archesporium.isnyv.cn
http://cheerioh.isnyv.cn
http://ameboid.isnyv.cn
http://birdlime.isnyv.cn
http://amendatory.isnyv.cn
http://bettor.isnyv.cn
http://chaldee.isnyv.cn
http://ablutionary.isnyv.cn
http://absinthism.isnyv.cn
http://amygdale.isnyv.cn
http://bearbaiter.isnyv.cn
http://www.dtcms.com/a/111431.html

相关文章:

  • PyTorch张量
  • Opencv计算机视觉编程攻略-第九节 检测兴趣点
  • Linux systemd 服务全面详解
  • SQL语句(三)—— DQL
  • 详解AI采集框架Crawl4AI,打造智能网络爬虫
  • poetry安装
  • Transformer+BO-SVM时间序列预测(Matlab)
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组
  • 系统分析师-前6章总结
  • STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟
  • PGSQL 对象创建函数生成工具
  • RSA和ECC在密钥长度相同的情况下哪个更安全?
  • 深度学习中的 Batch 机制:从理论到实践的全方位解析
  • AcWing 6118. 蛋糕游戏
  • Ubuntu安装Podman教程
  • Spring 核心技术解析【纯干货版】- XXI:Spring 第三方工具整合模块 Spring-Context-Suppor 模块精讲
  • 《古龙群侠传》游戏秘籍
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的监控:使用 Actuator 实现健康检查
  • 【spring cloud Netflix】Eureka注册中心
  • 关于uint8_t、uint16_t、uint32_t、uint64_t的区别与分析
  • Linux(2025.3.15)
  • 安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤
  • 前后端通信指南
  • C# Winform 入门(7)之简单的抽奖系统邮件
  • #管理Node.js的多个版本
  • 虚拟现实 UI 设计:打造沉浸式用户体验
  • MINIQMT学习课程Day10
  • 欧几里得算法求最大公约数、最小公倍数
  • chromium魔改——CDP(Chrome DevTools Protocol)检测01
  • CCF GESP C++编程 八级认证真题 2025年3月