Linux自动化构建工具——make和Makefile使用详解

简介: Linux自动化构建工具——make和Makefile使用详解

一、初步认识make和Makefile

       我们首先需要知道的是,make是一个命令,Makefile是一个文件,Makefile中包含了依赖关系和依赖方法。

       从上面的文件以及指令中我们可以看到,我们可以在Makefile文件中写入依赖关系以及对应的依赖方法,Makefile文件保存退出后,在命令行中执行make,就可以自动帮我们执行依赖关系中的方法(如上所示,可以形成mybin可执行文件)。但需要注意的是,Makefile文件名不要写错。

       make和Makefile形成目标文件的时候,默认是执行第一条依赖方法,如果要执行第二或者第三条依赖方法,需要再make后加上依赖关系名。

二、补充:Linux中的三个时间

access:访问该文件的时间,access时间可能不是实时更新的

modify:最后一次修改该文件内容的时间

change:最后一次修改该文件属性的时间

三、 make和Makefile语法的认识

       .PHONY 目标文件:修饰目标文件,使之成为一个伪目标,其对应的依赖方法在每次调用时总是被执行,但该语法一般只推荐对清除的依赖方法使用,不推荐对一般的编译依赖方法使用。

       在Makefile中,可以用$@表示目标文件,$^表示源文件,效果和写成目标文件和源文件是一样的。

       这种替换方法其实可以引申到Makefile中一般的变量替换,这其实有点类似于C/C++中的宏替换。

四、基于make和Makefile的进度条代码的实现

//Makefile
processbar:processbar.c main.c
  gcc -o $@ $^
.PHONY:clean
clean:
  rm -f processbar
//processbar.h
#include <stdio.h>
#define NUM 103
#define Body '='
#define Head '>'
typedef void (*callback_t)(double);//回调函数
void process_flush(double rate);

 

//processbar.c
#include "processbar.h"
#include <string.h>
#include <unistd.h>
const char *lable="|/-\\";
char buffer[NUM] = {0};
void process_flush(double rate)
{
    static int cnt = 0;
    int n = strlen(lable);
    if(rate <= 1.0)
    {
        buffer[0] = Head;
    }
    printf("[%-100s][%.1f%%][%c]\r", buffer, rate, lable[cnt%n]);
    //buffer为进度条,rate为比率,lable为旋转光标
    fflush(stdout);//\r为回车,不会将缓冲区的内容自动刷新到屏幕上,需要用fflush刷新
    buffer[(int)rate] = Body;
    if((int)rate + 1 < 100)
    {
        buffer[(int)(rate+1)] = Head;
    }
    if(rate >= 100.0)
    {
        printf("\n");
    }
    cnt++;
    cnt %= n;
}

 

//main.c
#include "processbar.h"
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#define FILESIZE 1024*1024*1024
void download(callback_t cd) // 回调函数
{
    srand(time(NULL));
    int total = FILESIZE;
    while(total)
    {
        usleep(10000);//下载
        int one = rand() % (1024*1024*10);
        total -= one;
        if(total < 0)
        {
            total = 0;
        }
        //当前进度
        int download = FILESIZE - total;
        double rate = (download*1.0/(FILESIZE))*100.0;
        cd(rate);//调用回调函数打印
    }
}
int main()
{
    download(process_flush);
    return 0;
}

运行结果如下:

相关文章
|
8月前
|
安全 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 自动化安装程序
587 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
8月前
|
人工智能 监控 Kubernetes
77_自动化脚本:Makefile与Airflow
在当今AI大模型时代,高效的工作流管理对于模型训练、推理和部署至关重要。随着大模型规模的不断增长和复杂度的提升,传统的手动脚本管理方式已无法满足需求。自动化脚本和工作流调度系统成为构建健壮、可重复、可扩展的LLM Pipeline的关键工具。其中,Makefile作为经典的自动化构建工具,与Airflow作为现代工作流调度平台的结合,为LLM开发团队提供了强大的工作流管理能力。
238 0
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
604 0
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
1050 18
|
Web App开发 编解码 Linux
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
这篇文章介绍了使用Selenium自动化测试解决报告生成失败问题的方法,包括Linux环境下的部署指南和代码实现。
419 1
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
|
安全 Linux 测试技术
Kali Linux预装的自动化渗透测试工具
Kali Linux预装的自动化渗透测试工具
1308 2
|
Ubuntu Linux 持续交付
在Linux中,如何在Linux中使用Ansible进行自动化部署?
在Linux中,如何在Linux中使用Ansible进行自动化部署?
|
存储 Linux 测试技术
在Linux中,如何使用expect进行自动化交互式应用程序测试?
在Linux中,如何使用expect进行自动化交互式应用程序测试?
|
运维 Linux 持续交付
在Linux中,如何进行配置管理和自动化部署?
在Linux中,如何进行配置管理和自动化部署?
|
jenkins Linux 持续交付
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?
在Linux中,如何使用Jenkins和Ansible进行虚拟化环境的自动化和持续集成/持续部署(CI/CD)?