Linux项目自动化构建工具-make/Makefile

简介: Linux项目自动化构建工具-make/Makefile

是什么是项目自动化构建工具?

项目自动化构建工具是用于自动化、简化和优化软件项目构建过程的工具。构建过程涉及从源代码到可执行文件或软件包的转换,包括编译、链接、测试、打包等操作。自动化构建工具帮助开发团队管理项目的复杂性,提高开发效率,并确保软件交付的质量和一致性。

简单来说呢,项目自动化工具其实就是将一些命令集打包在一个文件中,我们可以一键读取并执行这个文件的命令来完成项目的构建,这样一来我们就不需要每次构建项目都依次输入每条指令,大大提高了开发的效率。

在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是一个文件,两个搭配使用,完成项目自动化构建。

自动化构建工具的优点

  1. 提高效率:自动化构建工具可以自动执行编译、测试、打包等繁琐的任务,减少了手动操作的工作量,从而提高开发和构建的效率。
  2. 一致性和可重复性:构建工具能够确保构建过程在不同的开发环境和团队成员之间保持一致。通过脚本和配置文件定义构建流程,确保每个人都使用相同的构建步骤,减少了配置错误的可能性。
  3. 自动化测试:构建工具可以与自动化测试框架集成,使得自动化测试变得更加容易执行。这有助于提高软件质量,减少 bug 和错误的引入。
  4. 持续集成:自动化构建工具是持续集成(CI)的关键组成部分。通过集成构建工具和版本控制系统,可以在每次代码提交时自动执行构建和测试,及早发现问题。
  5. 简化部署:构建工具可以帮助自动化部署流程,确保在不同环境中的软件部署是一致和可靠的。这对于快速迭代和部署新功能非常重要。
  6. 管理依赖关系:构建工具可以帮助管理项目的依赖关系,自动下载和安装所需的库和工具。这简化了项目的配置和环境搭建过程。
  7. 跨平台支持:自动化构建工具通常提供跨平台的支持,可以在不同操作系统上运行,确保项目的可移植性。
  8. 可维护性:通过将构建过程定义在配置文件或脚本中,项目的构建逻辑更加透明和可维护。团队成员可以轻松理解和修改构建过程,而无需深入了解具体的构建步骤。

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,该命令执行后不予显示

使用变量

相关文章
|
1天前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
35 20
|
13天前
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
47 18
|
2月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
3月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
338 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
3月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
634 3
|
3月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
750 3
|
3月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
67 2
|
3月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
97 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
3月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
127 0
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
161 8