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

使用变量

相关文章
|
5月前
|
安全 Linux Shell
四、Linux核心工具:Vim, 文件链接与SSH
要想在Linux世界里游刃有余,光会“走路”还不够,还得配上几样“高级装备”。首先是Vim编辑器,它像一把瑞士军刀,让你能在命令行里高效地修改文件。然后要懂“软硬链接”,软链接像个快捷方式,硬链接则是给文件起了个别名。最后,SSH是你的“传送门”,不仅能让你安全地远程登录服务器,还能用scp轻松传输文件,设置好密钥更能实现免-密登录,极大提升效率。
444 4
|
4月前
|
安全 Linux iOS开发
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
310 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
9月前
|
Linux 开发工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
|
5月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
474 16
|
5月前
|
安全 Linux iOS开发
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
279 0
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
|
7月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
207 1
Linux系统性能调优技巧和相关工具
|
7月前
|
Linux 数据安全/隐私保护 iOS开发
推荐Linux环境下效能优良的双向文件同步工具
综合上述条件,对于Linux环境下的双向文件同步需求,Unison 和 Syncthing 是两个非常出色的选择。它们都有良好的社区支持和文档资源,适用于不同规模的环境,从个人使用到商业部署。Unison 特别适合那些需要手动干预同步过程、需要处理文件冲突解决的场景。而 Syncthing 更加现代化,适合需要自动、实时的数据同步与备份的环境。对于选择哪一个,这将取决于个人的使用场景和具体需求。
815 16
|
6月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
9月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
478 41