是什么是项目自动化构建工具?
项目自动化构建工具是用于自动化、简化和优化软件项目构建过程的工具。构建过程涉及从源代码到可执行文件或软件包的转换,包括编译、链接、测试、打包等操作。自动化构建工具帮助开发团队管理项目的复杂性,提高开发效率,并确保软件交付的质量和一致性。
简单来说呢,项目自动化工具其实就是将一些命令集打包在一个文件中,我们可以一键读取并执行这个文件的命令来完成项目的构建,这样一来我们就不需要每次构建项目都依次输入每条指令,大大提高了开发的效率。
在Linux中我们会常用到Make / Makefile自动化构建工具,其中make 是一个常用的构建工具,用于自动化编译和构建 C、C++ 等项目。Makefile 是 make 工具使用的配置文件,其中定义了目标、依赖关系和执行命令。
为什么要学习使用自动化构建工具?
背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
自动化构建工具的优点
- 提高效率:自动化构建工具可以自动执行编译、测试、打包等繁琐的任务,减少了手动操作的工作量,从而提高开发和构建的效率。
- 一致性和可重复性:构建工具能够确保构建过程在不同的开发环境和团队成员之间保持一致。通过脚本和配置文件定义构建流程,确保每个人都使用相同的构建步骤,减少了配置错误的可能性。
- 自动化测试:构建工具可以与自动化测试框架集成,使得自动化测试变得更加容易执行。这有助于提高软件质量,减少 bug 和错误的引入。
- 持续集成:自动化构建工具是持续集成(CI)的关键组成部分。通过集成构建工具和版本控制系统,可以在每次代码提交时自动执行构建和测试,及早发现问题。
- 简化部署:构建工具可以帮助自动化部署流程,确保在不同环境中的软件部署是一致和可靠的。这对于快速迭代和部署新功能非常重要。
- 管理依赖关系:构建工具可以帮助管理项目的依赖关系,自动下载和安装所需的库和工具。这简化了项目的配置和环境搭建过程。
- 跨平台支持:自动化构建工具通常提供跨平台的支持,可以在不同操作系统上运行,确保项目的可移植性。
- 可维护性:通过将构建过程定义在配置文件或脚本中,项目的构建逻辑更加透明和可维护。团队成员可以轻松理解和修改构建过程,而无需深入了解具体的构建步骤。
make/makefile使用规则
规则:依赖关系+依赖方法(依赖关系包含目标和依赖文件)
依赖关系
依赖关系描述了目标文件与其所依赖的文件之间的关系。当目标文件的依赖关系发生变化时,make
工具会检测到这种变化,并执行相应的构建命令。依赖关系通常在 Makefile
文件中定义。
依赖方法
执行相应构建的命令
基本语法
1. hello:hello.c 2. gcc hello.c -o hello
解释基本语法
hello:hello.c是依赖关系,gcc hello.c -o hello是依赖方法。其中依赖关系中的hello是目标文件,表示要生成的文件,hello.c是依赖文件,目标文件所依赖的文件或任务。
给出具体例子来帮助理解make/makefile
建立一个源文件hello.c
代码为:
#include <stdio.h> int main() { printf("hello Makefile!\n"); return 0; }
创建makefile文件并给出依赖关系
hello.exe:hello.c gcc hello.c -o hello.exe .PHONY:clear clear: rm -rf hello.exe
解释以上makefile文件的内容
hello.exe: hello.c gcc hello.c -o hello.exe
这个规则描述了如何生成目标文件 hello.exe。它说明 hello.exe 依赖于 hello.c 这个源文件。如果 hello.c 文件被修改,或者 hello.exe 不存在,make 将会执行下面的命令来重新生hello.exe,如果hello.exe已经存在且没有被修改那就不会执行下面的方法。
.PHONY: clean clean: rm -rf hello.exe
这个规则定义了一个伪目标(phony target) clear,用于清理生成的文件。 .PHONY是伪目标的标注符。.PHONY 告诉 make 工具,clear 不是一个真实的文件,而是一个伪目标,因此 make 不会尝试寻找或构建名为 clear 的文件,也就意味着,无论之前是否执行过clear下面的命令,make都会再次重新执行。
伪目标和实目标
实目标:
Makefile
中描述的真实文件或任务,其生成和更新是make
工具的主要目的。- 当
make
在构建过程中遇到实际目标时,它会检查该目标及其依赖关系的最新状态,并执行相应的构建命令。
伪目标:
- 伪目标是用来描述一些操作或任务的标签,它们并不对应真实的文件或任务。伪目标的目的是定义一些常用的操作,例如清理或生成文档。
- 当
make
遇到伪目标时,它并不会检查是否存在相应的文件,而是直接执行伪目标下定义的命令。
make如何确定文件是否被修改
make通过对比文件的修改时间来判断是否被修改。如果目标文件的修改时间早于依赖文件的修改时间,或者目标文件不存在,那么make就是认为这个目标文件需要重新构建
注意:
每条方法的命令前都需要留一个【tab】键的空格,可以有多个命令但是每行只能有一条命令。
linux演示
值得注意的是,如果用make执行依赖方法生成的目标文件本来就存在,那么将不会执行后面的命令。
make工作的原理
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找“hello.c”这个目标, 并把这个“hello.c”作为最终的目标文件。
3. 如果目标文件不存在,make就会执行后面的构建命令。如果存在,就需要对比这个存在的目标文件和依赖文件的修改时间,如果目标文件的最近修改时间比较早,说明目前版本的目标文件已经落后,则需要修改。
6. 递归构建。如果目标文件依赖于其他目标文件,make 将递归地执行相应的规则和构建过程,确保整个项目的一致性。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, make就不工作啦。
给出样例来帮助理解make的工作原理
给出makefile文件内容
上述makefile中有5条规则,对于前面4条规则,每个依赖关系中的依赖文件都是其它关系的目标文件。比如hello.exe:hello.o 要想生成hello.exe就必须要先生成hello.o文件,而要想生成hello.o文件又必须要生成hello.s文件等,这就是make的递归构建。
make的常见规则
自动化变量
- $@: 表示目标的名称。
- $<: 表示第一个依赖关系的名称。
- $^: 表示所有的依赖关系的列表。
用@屏蔽make执行命令过程
在命令前加@可以告诉make,该命令执行后不予显示
使用变量