Makefile Tutorial By Examples
date
Jul 9, 2024
slug
makefile-tutorials-examples
status
Published
tags
System
summary
type
Post
本文内容总结自如下教程:https://makefiletutorial.com/
Introduction
Why do Makefile exists?
一个稍具规模的软件系统常常包含若干子模块,这些子模块之间可能存在复杂的依赖关系,当某个子模块被修改重新编译之后,传递依赖于它的其他模块也需要被重新编译,Makefile 的主要作用就是帮助管理这一过程。
更一般地来说,Makefile 适用于很多文件之间存在依赖关系,某些文件发生改动之后需要执行一系列特定的操作的场景。
如果以文件为图上的节点,当文件 A 依赖文件 B 则有一条有向边 (A, B),则文件的依赖关系构成一张有向图(通常来说也应该是无环的)。
Makefile Syntax
Makefile 由若干 rule 构成,其中每条 rule 的构成如上所示,包含:
- target: 是一个文件名
- command: 一系列要执行的操作
- prerequisites: 一系列文件名,由空格分割,这些文件需要在执行第一条 command 之前存在
The essence of Make
当我们执行 make 命令时,到底发生了什么:
- 某个 target 被选中,在没有指定的情况下默认选择第一个 target
- 根据如下条件决定是否要执行 target 所关联的指令,只有满足如下两个条件才执行之一
- target 文件不存在
- prerequisites 中的文件有比 target 文件更新的(通过文件的系统时间戳比较)
- 如果 prerequisites 中有文件不存在,则先执行其对应的 target
实际上 Make 的过程可以认为是为了保持一个不变式,即:
对于依赖图上的每个节点都成立。
Variable
Makefile 中的变量通过 := 来赋值或创建,通过 $() 来取值。