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

使用变量

相关文章
|
9天前
|
存储 Linux Android开发
Volatility3内存取证工具安装及入门在Linux下的安装教程
Volatility 是一个完全开源的工具,用于从内存 (RAM) 样本中提取数字工件。支持Windows,Linux,MaC,Android等多类型操作系统系统的内存取证。针对竞赛这块(CTF、技能大赛等)基本上都是用在Misc方向的取证题上面,很多没有听说过或者不会用这款工具的同学在打比赛的时候就很难受。以前很多赛项都是使用vol2.6都可以完成,但是由于操作系统更新,部分系统2.6已经不支持了,如:Win10 等镜像,而Volatility3是支持这些新版本操作系统的。
|
3天前
|
监控 算法 Linux
探索Linux中的lz4命令:高效的数据压缩工具
**探索Linux中的LZ4工具:快速数据压缩。LZ4算法提供高速压缩与解压缩,适合实时数据处理。命令行工具如`lz4c`用于文件压缩(`lz4c file.txt compressed.lz4`)和解压缩(`lz4c -d compressed.lz4 decompressed.txt`)。特点是速度快、低内存占用,可选压缩级别。注意命令的实际形式取决于安装的实现,使用前应查阅文档。**
|
3天前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
|
5天前
|
Linux 数据处理
Linux命令`install`详解:不仅仅是安装工具
`install`命令在Linux中并非仅用于安装软件,而是用于精确复制文件和目录,设置权限及所有权。它能创建目标目录、处理符号链接并保留时间戳。例如,`install -m 644 source.txt /dest`用于复制文件并设置权限,`install -d -m 755 /dest/dir`创建目录。使用时要注意权限设置,避免误操作,并记录命令以备恢复。
|
6天前
|
Linux Shell 数据处理
探索Linux的`infokey`命令:终端键绑定的查询工具
探索Linux的`infokey`命令用于查询终端键绑定。它显示按键如何映射到命令,帮助用户理解终端行为。`infokey`与`ncurses`库配合,提供查询、清除和定制输出的功能。例如,`infokey -d`显示所有键绑定,`infokey -k &quot;\e[11~&quot;`检查F1键绑定。使用前确保安装了`ncurses`库,注意终端兼容性和权限问题。定期检查键绑定,备份配置,阅读文档以优化终端体验。
|
10天前
|
Linux 测试技术 开发者
【Docker项目实战】使用Docker部署instantbox临时Linux系统环境搭建工具
【6月更文挑战第13天】使用Docker部署instantbox临时Linux系统环境搭建工具
19 3
|
14天前
|
Linux Shell API
深入探索 `dbus-run-session`:Linux下的D-Bus会话管理工具
`dbus-run-session`是Linux下管理D-Bus会话的工具,它确保桌面环境和应用间的通信。当登录图形桌面时,D-Bus会话自动创建,支持应用和服务间的消息传递。通常不需要直接使用,但在特定情况下,可以通过`dbus-run-session bash`启动shell会话运行D-Bus相关命令。注意避免重复启动会话,勿以root运行,确保环境变量正确,可使用`--verbose`选项进行调试。了解其工作原理有助于解决D-Bus相关问题。
|
11天前
|
算法 数据挖掘 Linux
探索Linux中的awk命令:强大的文本分析工具
探索Linux中的`awk`命令,一个强大的文本分析工具,用于模式扫描、数据提取与报告生成。本文介绍`awk`的用途、工作原理、特点及应用示例。`awk`基于&quot;模式-动作&quot;框架,从输入数据中匹配模式并执行相应操作。其特点包括:强大的文本处理能力、灵活的I/O及简洁的语法。示例涵盖了打印特定行、处理字段、计算统计值等场景。使用`awk`时要注意理解输入数据、测试脚本、优化性能和添加注释。深入学习以提升数据处理技能。
|
14天前
|
Linux
dbus-cleanup-sockets`:Linux 中的 D-Bus 套接字清理工具
`dbus-cleanup-sockets` 是一个用于清理 Linux 中未正常关闭的 D-Bus 套接字文件的工具,旨在解决资源占用和潜在通信问题。通常在系统启动、关闭或检测到残留套接字时自动运行。用户可手动以 root 权限执行 `/usr/bin/dbus-cleanup-sockets` 进行清理。该工具对于处理系统崩溃或守护进程异常终止导致的残留文件十分有用。
|
14天前
|
SQL Oracle 关系型数据库
探索 Linux 命令 `db_archive`:Oracle 数据库归档日志的工具
探索 Linux 中的 `db_archive`,实际与 Oracle 数据库归档日志管理相关。在 Oracle 中,归档日志用于恢复,当在线重做日志满时自动归档。管理员可使用 SQL*Plus 查看归档模式,通过 `RMAN` 进行备份和恢复操作。管理归档日志需谨慎,避免数据丢失。了解归档管理对 Oracle 管理员至关重要,确保故障时能快速恢复数据库。