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

使用变量

相关文章
|
2月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
40 8
|
2月前
|
持续交付 C# 敏捷开发
“敏捷之道:揭秘WPF项目中的快速迭代与持续交付——从需求管理到自动化测试,打造高效开发流程的全方位指南”
【8月更文挑战第31天】敏捷开发是一种注重快速迭代和持续交付的软件开发方法,通过短周期开发提高产品质量并快速响应变化。本文通过问题解答形式,探讨在Windows Presentation Foundation(WPF)项目中应用敏捷开发的最佳实践,涵盖需求管理、版本控制、自动化测试及持续集成等方面,并通过具体示例代码展示其实施过程,帮助团队提升代码质量和开发效率。
52 0
|
2月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
38 0
|
2月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
2月前
|
存储 关系型数据库 Linux
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
|
2月前
|
Linux C# C++
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
|
2月前
|
NoSQL Linux Shell
在Linux中,GNU项目的重要性是什么?
在Linux中,GNU项目的重要性是什么?
|
2月前
|
数据采集 SQL 前端开发
Java SpringBoot自动化网页爬虫项目
这是一个基于Java Spring Boot的自动化网页爬虫平台,采用图形化界面定义爬虫流程,无需编写代码。该平台高度灵活且可配置,支持Xpath、JsonPath、CSS选择器及正则表达式等多种提取方式,兼容JSON、XML和二进制格式,并支持通过代理服务器访问。它还具备自动管理Cookie、保存数据至数据库或文件、自定义函数和SQL脚本等功能,同时集成了任务监控和日志记录系统。此外,平台支持HTTP接口调用和动态网页抓取,可通过Selenium模拟真实浏览器行为。用户可通过直观的操作界面轻松完成复杂的数据抓取任务。
|
2天前
|
Linux
Linux常用命令包括
Linux常用命令包括
10 5
|
2天前
|
Linux
Linux命令
Linux命令
13 5
下一篇
无影云桌面