Makefile(1)入门

简介: Makefile(1)入门

初识makefile

想要掌握makefile,首先需要了解两个概念,⼀个是⽬标(target),另⼀个就是依赖(dependency)。⽬标就是指要⼲什么,或说运⾏ make 后⽣成什么,⽽依赖是告诉 make 如何去做以实现⽬标。在 Makefile 中,⽬标和依赖是通过规则(rule)来表达的。

(一)、目标

首次编写makefile

all:
    echo "Hello world"

上面Makefile 中的 all 就是我们 的⽬标,⽬标放在‘:’的前⾯,其名字可以是由字⺟和下划线‘_’组成 。echo “Hello World”就是⽣成⽬标的命令,这些命令可以是任何你可以在你的环境中运⾏的命令以及 make 所定义的函数等等。all ⽬标的定义,其实是定义了如何⽣成 all ⽬标,这我们也称之为规则.

makefile定义多个目标

all:
    echo "Hello world"
test:
    echo "test game"

下面是运行的结果

由此可见,⼀个 Makefile 中可以定义多个⽬标。调⽤ make 命令时,我们得告诉它我们的⽬标是什么,即要它⼲什么。当没有指明具体的⽬标是什么 时,那么 make 以 Makefile ⽂件中定义的第⼀个⽬标作为这次运⾏的⽬标。这“第⼀个”⽬标也称之 为默认⽬标(和是不是all没有关系)。当 make 得到⽬标后,先找到定义⽬标的规则,然后运⾏规则中的命令来达到构建⽬标的⽬的。

makefile中取消多余的命令行显示

在上面的指令中,多了很多的echo "......"的内容,这部分不是我们所期望的,如果要去掉,需要对上面的makefile进行一个改动,也就是在命令前加上一个@,这个符号就是告诉make,在运行的时候这一行命令不显示出来。

all:
    @echo "Hello world"
test:
    @echo "test game"

运行结果:

紧接着对makefile进行如下的改动,在all的后面加上test

all: test
    @echo "Hello world"
test:
    @echo "test game"

运行结果如下:

(二)、依赖

如上面的makefile,all ⽬标后⾯的 test 是告诉 make,all ⽬标依赖 test ⽬标,这⼀依赖⽬标在 Makefile 中⼜被称之为先决条件。出现这种⽬标依赖关系时,make⼯具会按 从左到右的先后顺序先构建规则中所依赖的每⼀个⽬标。如果希望构建 all ⽬标,那么make 会在构建它之 前得先构建 test ⽬标,这就是为什么我们称之为先决条件的原因。

(三)、规则

⼀个规则是由⽬标(targets)、先决条件(prerequisites)以及命令(commands)所组成的。

需要指出的是,⽬标和先决条件之间表达的就是依赖关系(dependency),这种依赖关系指明在构建⽬标之前,必须保证先决条件先满⾜(或构建)。⽽先决条件可以是其它的⽬标,当先决条件是⽬标时,其必须先被构建出来。还有就是⼀个规则中⽬标可以有多个,当存在多个⽬标,且这⼀规则是 Makefile 中的第⼀个规则时,如果我们运⾏ make 命令不带任何⽬标,那么规则中的第⼀个⽬标将被视为是缺省⽬ 标。

规则的功能就是指明 make 什么时候以及如何来为我们重新创建⽬标,

在 Hello World 例⼦中,不论我们 在什么时候运⾏ make 命令(带⽬标或是不带⽬标),其都会在终端上打印出信息来,和我们采⽤ make 进⾏代码编译时的表现好象有些不同。当采⽤ Makefile 来编译程序时,如果两次编译之间没有任何代码 的改动,理论上说来,我们是不希望看到 make 会有什么动作的,只需说“⽬标是最新的”,⽽我们的最终 ⽬标也是希望构建出⼀个“聪明的” Makefile 的。与 Hello World 相⽐不同的是,采⽤ Makefile 来进⾏ 代码编译时,Makefile 中所存在的先决条件都是具体的程序⽂件,后⾯我们会看到。

规则语法:

targets : prerequisites

command

...

如上, all 是⽬标,test 是 all ⽬标的依赖⽬标,⽽@echo “Hello World”则是⽤于⽣成 all ⽬标的命令。


相关文章
|
6月前
|
编译器 Shell Linux
Makefile(3)进阶
Makefile(3)进阶
51 0
|
6月前
|
Shell Linux C++
Makefile编译实战
Makefile编译实战
83 0
|
Java 编译器 Linux
Makefile教程(入门介绍)
Makefile教程(入门介绍)
114 0
|
C语言
Makefile教程(Makefile的结构)
Makefile教程(Makefile的结构)
102 0
|
3月前
|
编译器 Linux C语言
Makefile实战论(一)
Makefile实战论(一)
|
6月前
|
存储 编译器 Shell
Makefile语法基础
Makefile语法基础
26 0
|
6月前
|
编译器 Shell C语言
Makefile快速入门
Makefile快速入门
47 0
|
11月前
|
Shell
Makefile学习2
Makefile学习2
|
IDE 编译器 程序员
Makefile零基础教学(一)初识makefile
Makefile零基础教学(一)初识makefile
168 1
Makefile零基础教学(一)初识makefile
|
11月前
|
编译器 Shell Linux
Makefile学习1
Makefile学习1