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

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



一、概念

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一条命令,是一个解释makefile中指令的命令工具,makefile是一个文件,两个搭配使用,完成项目自动化构建。


二、使用实例

首先,我们创建两个文件:Makefile和test.c。

我们先在源文件test.c中简单写一段代码。

然后我们再编写Makefile:第二行和第六行必须以tab开头。

接着我们使用make命令,发现生成了可执行程序。

最后我们运行可执行程序:

我们发现程序成功执行了。以上就是make/makefile(m可以大写)的简单使用。


三、原理

要想弄清楚原理,首先我们必须要知道两个概念:依赖关系和依赖方法。

如何编写makefile:

1、建立依赖关系,谁依赖于谁(比如上面的例子,mytest依赖于test.c,因为test.c是我们自己创建出来的,mytest是通过test.c编译出来的)。

2、新起一行,必须以tab键开头,建立依赖方法,即两者的依赖关系是通过什么方法建立起来的(比如上面的例子,mytest依赖于test.c的关系是通过tes.c编译而形成的)。

3、清理:清理文件/临时数据

使用make clean后,可执行程序就会被清理掉,需要重新make。相当于vs中的重新生成解决方案。

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

基本原理:

1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

2、如果找到,它会从上到下按顺序找文件中的第一个目标文件,在上面的例子中,他会找到“mytest”这个文件,并把这个文件作为最终的目标文件。

3、如果mytest文件不存在,或是mytes所依赖的后面的test.c文件的文件修改时间要比mytest这个文件新,那么,他就会执行后面所定义的命令来生成mytest这个文件。

4、如果mytest所依赖的test.c文件不存在,那么make会在当前文件中找目标为test.c文件的依赖性,如果找到则再根据那一个规则生成test.c文件。

5、make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

注:在make推导的时候会根据依赖关系而推导,从上到下,当依赖文件列表不存在会继续根据依赖文件列表所对应的项而继续。

4、伪目标

这里的.PHONY:被该关键字修饰的对象是一个伪目标。伪目标表示该目标总是被执行的。比如:上面的clean,只要你一直输入命令,它就会一直执行。

而非伪目标,并不能总是执行成功,比如:上面的例子,一旦你make好了,即生成了mytest后,除非你修改了test.c,不然你是无法再重新make的。


四、进度条程序

接下来,我们就用上面学到的内容来写一个简单的进度条程序。

1、缓冲区问题

1、概念

首先,我们来看一看下面的代码:

运行结果就是先输出字符串hello world然后休眠3秒之后结束运行。那么对于以下代码呢?

上述代码的结果就是:我们看到程序先休眠了3秒,然后打印字符串hello之后结束运行。

这是为什么呢?上面的两个代码,唯一的区别就是一个有 “\n”,一个没有。而且,我们知道,程序一定是从上到下依次执行的,那为什么第二个代码我们看到的是先休眠呢?这就和缓冲区有关了。

其实,第六行的代码早就执行完了,只是信息没有被立马显示出来。

理由是:显示器对应的是行刷新,即当缓冲区当中遇到“\n”或是缓冲区被写满才会被打印出来,而在第二份代码当中并没有“\n”,所以字符串hello先被写到缓冲区当中去了,然后休眠3秒,直到程序运行结束时才将hello打印到显示器当中。

那如果我们不加\n,有没有什么方法能够帮助我们解决这个问题呢?这里我们可以使用fflush函数,该函数可以刷新缓冲区,即将缓冲区当中的数据刷新当显示器当中。

这下我们看到的结果就是先打印hello,再休眠了。

2、\r和\n

\r: 回车,使光标回到本行的起始位置。

\n: 换行,使光标移动到当前位置的正下方的位置。

注:我们键盘中的回车按键相当于两者的结合。而在语法中,\n就是两者的结合。

2、代码编写

* 倒计时程序

有了上面 \r 回车的概念,那么如果我们向显示器上写了一个数之后再让光标回到本行的起始位置,然后再写一个数,不就相当于将前面一个数字覆盖了吗?然后我们使用循环,不就可以实现连续覆盖了吗,这就相当于一个倒计时程序。如下:

运行结果:

有了倒计时代码,我们就可以写进度条代码:

运行结果如下:

注:%-100s:表示预留100的空间,-表示从左到右进行打印。如果不加-,将会从右向左打印。%%表示百分号。

目录
相关文章
|
1月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
181 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
5月前
|
jenkins Java 持续交付
运用Jenkins实现Java项目的持续集成与自动化部署
在新建的Jenkins Job中,我们需要配置源码管理,通常选择Git、SVN等版本控制系统,并填入仓库地址和凭据。接着,设置构建触发器,如定时构建、轮询SCM变更、GitHub Webhook等方式,以便在代码提交后自动触发构建过程。
231 2
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
27 2
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
63 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
3月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
51 8
|
3月前
|
持续交付 C# 敏捷开发
“敏捷之道:揭秘WPF项目中的快速迭代与持续交付——从需求管理到自动化测试,打造高效开发流程的全方位指南”
【8月更文挑战第31天】敏捷开发是一种注重快速迭代和持续交付的软件开发方法,通过短周期开发提高产品质量并快速响应变化。本文通过问题解答形式,探讨在Windows Presentation Foundation(WPF)项目中应用敏捷开发的最佳实践,涵盖需求管理、版本控制、自动化测试及持续集成等方面,并通过具体示例代码展示其实施过程,帮助团队提升代码质量和开发效率。
72 0
|
3月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
51 0
|
3月前
|
数据采集 SQL 前端开发
Java SpringBoot自动化网页爬虫项目
这是一个基于Java Spring Boot的自动化网页爬虫平台,采用图形化界面定义爬虫流程,无需编写代码。该平台高度灵活且可配置,支持Xpath、JsonPath、CSS选择器及正则表达式等多种提取方式,兼容JSON、XML和二进制格式,并支持通过代理服务器访问。它还具备自动管理Cookie、保存数据至数据库或文件、自定义函数和SQL脚本等功能,同时集成了任务监控和日志记录系统。此外,平台支持HTTP接口调用和动态网页抓取,可通过Selenium模拟真实浏览器行为。用户可通过直观的操作界面轻松完成复杂的数据抓取任务。
|
4月前
|
运维 数据安全/隐私保护 Python
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
160 14
|
3月前
|
jenkins Java 持续交付
自动化魔法:用Jenkins打造Java项目的持续部署流水线
【8月更文挑战第13天】在软件开发中,自动化部署是提高效率与减少错误的关键。Jenkins作为一款强大的持续集成工具,支持Java项目的自动化构建、测试与部署。通过配置Jenkins及其丰富的插件生态(如Git和Maven插件),可实现从代码提交到上线的全自动化流程。此流程包括从GitHub自动拉取代码、使用Maven构建项目,并通过如`mvn clean install`命令执行构建,最后利用插件如“Publish Over SSH”将制品部署至远程服务器。此外,还可配置邮件通知等后处理动作确保发布的稳定可靠。借助Jenkins,开发者能显著加速软件交付周期,同时减少手动操作带来的风险。
153 0