使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始

使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统

Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标,还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工具则能够提升这个现代化过程的趣味性,因为现在这些工具可以提供反馈,在某些情况下甚至能为你开发构建系统。在这个系列中,我会使用 ChatGPT Docker 开始着手创建 Makefile 构建系统。

Makefile 构建系统需要什么

无论你有没有意识到,大多数嵌入式软件 IDE 背后都是基于 Makefile 的构建系统。此类构建系统可能直接使用 GNU Make,也可能使用 Cmake。就本文而言,使用什么工具我真不在乎。使用 AI 工具能轻松生成所需的代码,无论是用于 GNU Make 还是 Cmake 都不在话下。首先是规划构建系统大纲。在我的如何定义你的理想化嵌入式构建系统一文和如何定义你的理想化嵌入式 CI/CD 流水线一文中,我提到了如何定义理想化的连续集成/连续部署流水线和构建系统。我强烈建议你阅读这些文章,并妥善制定相应策略,然后再尝试使用 AI 工具来完成工作。

出于试验目的,我将按图 1 所示定义理想化的构建系统。

1 - 结合任何现代化嵌入式系统的必要构建配置和软件堆栈的理想构建系统。(来源:嵌入式软件设计;第 23 页)

至此,就可以开始使用 ChatGPT AI 工具逐步创建构建系统了。但如果你有兴趣了解可供嵌入式软件开发人员使用的其他 AI 工具,可以查看我写的“揭示嵌入式软件开发者可用的 5 大 AI 工具”一文。

我还发现,使用 Docker 来封装所有工具和依赖项对于创建构建系统也同样极为有用可能许多公司的 IT 部门对于 Docker 深恶痛绝,但是它可以显著简化更新共享,帮助开发人员快速上手。如果你使用 Visual Studio Code 之类的 IDE,那么还会发现可以通过终端使用 Docker 和构建系统,或者也可以自定义 Visual Studio Code 通过用户接口来执行命令使用 AI 创建构建系统之前,我们将使用它来创建一个 Dockerfile,使用 Docker Desktop 来执行它,这将创建一个容器用于构建软件。

ChatGPT 中输入第一个提示

我给 ChatGPT 的第一个提示是告诉它我想要做什么,然后列出我的要求。例如:

我想创建一个 Dockerfile,用于为 Cortex®-M4 架构处理器进行嵌入式软件开发。这个 Dockerfile 具有以下要求:

  • 使用最新版本的 Ubuntu
  • 安装基本 Linux 支持工具,如 updatecleanautoconfcurl
  • /home/dev 下设置一个工具目录
  • 安装 gcc-arm-none-eabi 工具链,附带针对 newlib C++ 支持
  • 安装 Clang 工具用于格式化和静态分析

你能生成满足上述要求的 Dockerfile ?

在提示符中输入这些要求后,ChatGPT 生成了一些解释性文本及以下 Dockerfile 输出:

Certainly! Here's a `Dockerfile` that meets your requirements:

```Dockerfile

# Use the latest version of Ubuntu as the base image

FROM ubuntu:latest

# Set the maintainer label

LABEL maintainer="your-email@example.com"

# Set environment variables to non-interactive (this will prevent some prompts)

ENV DEBIAN_FRONTEND=non-interactive

# Install basic linux support tools

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends \

    autoconf \

    curl \

    build-essential \

    git \

    libtool \

    make \

    pkg-config && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Setup a tool directory in /home/dev

RUN mkdir -p /home/dev

WORKDIR /home/dev

# Install the gcc-arm-none-eabi toolchain with C++ support for newlib

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends software-properties-common && \

    apt-add-repository ppa:team-gcc-arm-embedded/ppa && \

    apt-get update -y && \

    apt-get install -y --no-install-recommends gcc-arm-embedded && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Install clang tools for formatting and static analysis

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends clang-format clang-tidy && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Set the default command to bash

CMD ["/bin/bash"]

请注意把 `your-email@example.com` 替换为你的实际电子邮件或者其他标识符。

构建和运行 Docker 容器:

  1. Dockerfile 保存到目录中。
  2. 在终端中导航到该目录。
  3. 构建 Docker 镜像:`docker build -t arm-dev-env.`
  4. 运行 Docker 容器:`docker run -it arm-dev-env`

这样会在 Docker 容器中为你提供一个 bash 提示,并且你指定的所有工具均已安装完成,并准备就绪可供使用。

近几年来,我编写了多个 Dockerfile,以供各种构建系统使用,我授课时会用到这些构建系统,也会把它们给客户。通过对比 ChatGPT 生成的内容,我发现有几处细微差异:

  • 我编写的 Dockerfile 中不包含维护人标签,因为我不会广泛发布我的构建系统。但是,我使用刷新标签来标识上次更新 Dockerfile 的时间。(其实有点浪费,因为其实我只要检查 Git 仓库就行了)。
  • ChatGPT 额外包含了 ENV DEBIAN_FRONTEND=non-interactive,这招不错。我通常只在安装单个封装包时才会包含这部分。ENV 变量在整个 Dockerfile 中全局包含了这部分。
  • ARM 编译器是使用 PPA 服务安装的,而不是通过直接下载或其他方法。
  • 默认命令设置为 bash。我从未显式包含此命令,但我觉得这个做法不错。

Dockerfile 看起来与我写的非常相似,但效率也不高。你只要仔细查看,就能看到其中多次运行更新,并且对文件进行了清理和移除操作。就首通 (first pass) 而言,也算不错了。

修复首通的问题

事实证明,如果用以下命令来运行 ChatGPT 生成的第一个 Dockerfile

  docker build -t beningo/cpp-dev

你会发现 Docker 镜像会失败! 事实证明,使用 PPA 可能会导致一些问题,而且可能与最新版本的 Ubuntu 不兼容。我使用以下提示将此错误输入 ChatGPT 后:

它就会识别这个问题并自动调整方法。这次它决定直接下载 ARM 编译器可执行文件并进行安装,如下 Dockerfile 所示:

# Install the gcc-arm-none-eabi toolchain with C++ support for newlib

RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \

    echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc

说到这里,你可能会很兴奋,但我可不是第一次肆无忌惮玩野了。通过检查 Dockerfile 可见,我以前就用过这种下载方式,并且遇到过 SSL 证书问题。不过既然要让 AI 驱动,我决定这次循规蹈矩,运行一下 Dockerfile。看到 SSL 错误后,我向 ChatGPT 发送了以下提示:

ChatGPT 能够获取错误代码并识别问题所在。它称:

The error youre seeing is due to curl not being able to verify the SSL certificate when trying to fetch the ARM toolchain from the website. This is because the Docker image doesnt have the necessary CA certificates installed by default. Heres the updated Dockerfile:

# Use the latest version of Ubuntu as the base image

FROM ubuntu:latest

# Set the maintainer label

LABEL maintainer="your-email@example.com"

# Set environment variables to non-interactive (this will prevent some prompts)

ENV DEBIAN_FRONTEND=non-interactive

# Install basic linux support tools and ca-certificates for SSL verification

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends \

    autoconf \

    curl \

    build-essential \

    git \

    libtool \

    make \

    pkg-config \

    ca-certificates && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Setup a tool directory in /home/dev

RUN mkdir -p /home/dev

WORKDIR /home/dev

# Install the gcc-arm-none-eabi toolchain with C++ support for newlib

RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \

    echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc

# Install clang tools for formatting and static analysis

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends clang-format clang-tidy && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Set the default command to bash

CMD ["/bin/bash"]

瞧!这回得到的 Dockerfile 能成功构建了!

测试 Docker 镜像

我启动 Docker 镜像时,很高兴地发现我的所有工具都安装好了,而且镜像也在正常运行。不过,我注意到了一个小问题。当我启动镜像时,总是会进入 /home/dev 文件夹中,而不是我的应用程序所在的 /home/app 文件夹。在我自己的 Dockerfiles 中,我在文件末尾添加了以下内容:

WORKDIR /home/app

ChatGPT 也会提供同样的解决方案吗?接下来,我输入了以下提示:

我得到的响应是:

# Use the latest version of Ubuntu as the base image

FROM ubuntu:latest

# Set the maintainer label

LABEL maintainer="your-email@example.com"

# Set environment variables to non-interactive (this will prevent some prompts)

ENV DEBIAN_FRONTEND=non-interactive

# Install basic linux support tools and ca-certificates for SSL verification

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends \

    autoconf \

    curl \

    build-essential \

    git \

    libtool \

    make \

    pkg-config \

    ca-certificates && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Setup a tool directory in /home/dev

RUN mkdir -p /home/dev

# Install the gcc-arm-none-eabi toolchain with C++ support for newlib in /home/dev

WORKDIR /home/dev

RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \

    echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc

# Install clang tools for formatting and static analysis

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends clang-format clang-tidy && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Create and set the working directory to /home/app

WORKDIR /home/app

# Set the default command to bash

CMD ["/bin/bash"]

成功!ChatGPT 得出了与我相同的解决方案和结论!

重构和清理 Dockerfile 

到目前为止,ChatGPT 工作非常出色!不过还有一个问题,就是 Dockerfile 的优化仍不及预期。我可以自己重来一遍,手动对它进行优化......或者让 AI 来做!回到 ChatGPT 中,我输入了以下内容作为下一项提示:

Dockerfile 效率不高,原因可能是多次安装和清理。可以改善吗?

得到的响应是:

修改后的 Dockerfile

# Use the latest version of Ubuntu as the base image

FROM ubuntu:latest

# Set the maintainer label

LABEL maintainer="your-email@example.com"

# Set environment variables to non-interactive (this will prevent some prompts)

ENV DEBIAN_FRONTEND=non-interactive

# Update package lists, install basic tools, toolchains, and clean up in one step

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends \

    autoconf \

    curl \

    build-essential \

    git \

    libtool \

    make \

    pkg-config \

    ca-certificates \

    software-properties-common \

    clang-format \

    clang-tidy && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Setup a tool directory in /home/dev and download the ARM toolchain

WORKDIR /home/dev

RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \

    echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc

# Create and set the working directory to /home/app

WORKDIR /home/app

# Set the default command to bash

CMD ["/bin/bash"]

我不知道你怎么想,但我很兴奋。最新的 dockerfile 看起来与我近几年来从头开始写的 Dockerfile 非常相似。我仍然使用不同的方法来安装 Arm 编译器,但目前我们 Dockerfile 中的方法并不太寒酸。(不过它已经被修复了,所以我们没法知道是否有新版本的 GNU Arm 编译器可用。奇怪的是,已经有大概两年没更新了。我不知道什么原因,但这个话题下次再讨论)。

添加测试工具

有时,即使面对如此精品,你也会忍不住对它“调教”一番。毕竟,只要弄不坏它,那就可以试试把它做得更好,对吧?眼下有一个 Dockerfile,其中包含为 Arm 微控制器编译代码所需的工具。但实际上,我们还应该在这个镜像中添加不少东西。比如指标分析,可能最重要的是,添加测试工具?我觉得在 Dockerfile 中添加 cpputest 会很有趣。毕竟,我自己的许多工程都会用 cpputest,而且我知道应该会生成怎样的 DockerfileChatGPT 能做到吗?让我们一探究竟。我回到提示符中,添加了以下内容:

ChatGPT 则提供了如下输出:

# Use the latest version of Ubuntu as the base image

FROM ubuntu:latest

# Set the maintainer label

LABEL maintainer="your-email@example.com"

# Set environment variables to non-interactive (this will prevent some prompts)

ENV DEBIAN_FRONTEND=non-interactive

# Update package lists, install basic tools, toolchains, and clean up in one step

RUN apt-get update -y && \

    apt-get install -y --no-install-recommends \

    autoconf \

    automake \

    curl \

    build-essential \

    git \

    libtool \

    make \

    pkg-config \

    ca-certificates \

    software-properties-common \

    clang-format \

    clang-tidy && \

    apt-get clean && \

    rm -rf /var/lib/apt/lists/*

# Setup a tool directory in /home/dev and download the ARM toolchain

WORKDIR /home/dev

RUN curl -L https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 | tar xj && \

    echo "export PATH=$PATH:/home/dev/gcc-arm-none-eabi-10-2020-q4-major/bin" >> ~/.bashrc

# Clone, build, and install CppUTest

WORKDIR /home

RUN git clone https://github.com/cpputest/cpputest.git && \

    cd cpputest && \

   ./autogen.sh && \

   ./configure && \

    make install

# Set the CPPUTEST_HOME environment variable

ENV CPPUTEST_HOME=/home/cpputest

# Create and set the working directory to /home/app

WORKDIR /home/app

# Set the default command to bash

CMD ["/bin/bash"]

没错。这基本上与我自己的 Dockerfile 中的内容差不多。哪天我不得不从头写个文件时,就可以用 ChatGPT 5 分钟内完成。

结论

ChatGPT 这样的 AI 工具可以用来编写和改进你的嵌入式构建系统。这篇文章探讨了如何使用 ChatGPT 写一个 Dockerfile,并且其中包括我在开发嵌入式软件时使用的一些工具。这个示例虽然有一定的局限性,但它展示了如何使用 AI 工具快速创建代码草稿,并对其进行快速迭代。我之所以能快速完成这些,是因为我已经为我使用的各种构建系统写了很多 Dockerfile。我拥有丰富的经验,知道 AI 给的输出究竟是有效的、需要改进的还是一文不值的。我相信,如果没有这些经验,你难免会发现自己深陷泥潭难以自拔。

下次,我们来聊聊如何使用 AI 从头生成一个构建系统,然后搭配 Dockerfile 一起使用。你觉得 AI 能做到吗?你很快就会知道了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析API接口测试工具的企业价值

随着企业软件开发的日益复杂和互联网应用的普及,API接口成为不同软件系统之间信息传递的桥梁。在这一背景下,API接口测试工具的应用变得愈加重要,对企业的发展和软件质量起到了关键性的作用。本文将深入探讨API接口测试工具在企业中的重要性&…

leetcode:2133. 检查是否每一行每一列都包含全部整数(python3解法)

难度:简单 对一个大小为 n x n 的矩阵而言,如果其每一行和每一列都包含从 1 到 n 的 全部 整数(含 1 和 n),则认为该矩阵是一个 有效 矩阵。 给你一个大小为 n x n 的整数矩阵 matrix ,请你判断矩阵是否为一…

matlab配置

matlab配置 windowslinux挂载安装MATLAB windows 按照这里一步步配置就行( 移动硬盘中软件备份中自取) linux linux配置步骤 挂载 sudo mount -t auto -o loop /media/oyk/Elements/ubuntu/MATLAB/R2017a_glnxa64_dvd1.iso ./matlab/安装MATLAB 挂载完成后,先…

SpringCloudAlibaba之Nacos的持久化和高可用——详细讲解

目录 一、Nacos持久化 1.持久化说明 2.安装mysql数据库5.6.5以上版本(略) 3.修改配置文件 二、nacos高可用 1.集群说明 2.nacos集群架构图 2.集群搭建注意事项 3.集群规划 4.搭建nacos集群 5.安装Nginx 6.配置nginx conf配置文件 7.启动nginx进行测试即可 一、Nacos持久…

laravel8中常用路由使用(笔记四)

目录 1、框架路由目录统一放该目录 2、基本路由,路由都调用Route方法 3、控制器使用路由 4、路由参数 5、路由组 6、命名路由 7、命令查看当前路由列表 8、路由缓存 在Laravel 8中,路由定义了应用程序中接受请求的方式。它们定义了URL和相应的控制器方法之间的…

13、LCD1602调试工具

LCD1602调试工具 使用LCD1602液晶屏作为调试窗口&#xff0c;提供类似Printf函数的功能&#xff0c;可实时观察单片机内部数据的变化情况&#xff0c;便于调试和演示。 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h"//存储…

【开源】基于JAVA的海南旅游景点推荐系统

项目编号&#xff1a; S 023 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S023&#xff0c;文末获取源码。} 项目编号&#xff1a;S023&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四…

前端开发学习 (三) 列表功能

一、列表功能 1、列表功能 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compa…

锂电行业废水及母液除铊解决方案,除铊树脂技术

锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;产业的发展会带来铊排放问题。除了锂电池生产过 程中存在的铊污染外&#xff0c;企业的生活污水或者初期雨水也含有铊&#xff0c;因为铊是一种广泛存在于自然环境中的 元素&#xff0c;存在于饮用水、土壤和食物中…

高效视频剪辑:按指定时长批量分割视频,释放无尽创意

随着数字媒体技术的不断发展&#xff0c;视频剪辑已经成为日常生活中不可或缺的一部分。无论是制作电影、电视剧&#xff0c;还是创意生活短视频&#xff0c;视频剪辑都扮演着重要的角色。然而&#xff0c;对于许多非专业人士来说&#xff0c;视频剪辑可能是一项复杂而耗时的任…

27.0/多态/对象向上转型/向下转型/抽象类/抽象方法。

目录 27.1为什么使用多态? 27.1.2什么是多态 27.1.3对象多态 27.1.4多态的使用前提 27.2 向上转型 27.3向下转型 (面试题) 27.4抽象类和抽象方法 特点(面试题): 27.1为什么使用多态? 需求1&#xff1a;动物园让我们实现一个功能&#xff1a; 创建一个狗类 &#xff0c;狗…

Leetcode—739.每日温度【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—739.每日温度 单调栈实现思想 从右到左实现代码 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();stack<int> st;vector<i…

ensp 启动设备时报40错误,然后一直没有去管,再次进去就好了,我知道是配置虚拟机的时候修改了一些设置:

第一个阶段&#xff1a; 那时我是重置电脑之后就安装了ensp所以没有出现什么问题&#xff0c;&#xff08;那时没有导入ce6800和12800还有防火墙6000&#xff09; 第二个阶段&#xff1a; 因为有华为相关的实验要做&#xff0c;所以心血来潮打开了ensp&#xff08;路由器之前…

Digicert OV 代码签名介绍

Digicert OV 代码签名证书是一种数字证书&#xff0c;用于对软件代码进行数字签名。数字签名是一种验证软件来源和完整性的技术&#xff0c;通过使用私有密钥对代码进行签名&#xff0c;并在签名后使用公共密钥验证签名。 可基于更多平台&#xff0c;最大限度地提高分发量和收…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;2&#xff09; 工程下载&#xff1a;K-means聚类实现步骤与基于K-means聚类的图像压缩 其他&#xff1a; 03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; 03、K-means聚类实现…

Linux 命令ln

1什么是链接 ln在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接&#xff0c;当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0…

SpringBoot监控Redis事件通知

Redis的事件通知 Redis事件通过 Redis 的订阅与发布功能&#xff08;pub/sub&#xff09;来进行分发&#xff0c; 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下&#xff0c; 使用键空间通知功能。 因为 Redis 目前的订阅与发布功能采取的是发送即忘&am…

Python爬虫入门课: 如何实现数据抓取 <文字 图片 音频 视频 文档..>

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 解释器 Pycharm 编辑器 模块使用: requests re csv pandas 爬虫实现第一步: 一. 抓包分析 找到对应数据链接地址 套用代码: 修改…

Mybatis 源码搭建

文章目录 源码下载测试模块搭建学习博客 源码下载 首先下载mybatis-parent的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-parent.git 然后下载mybatis的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-src.git 带中文…

无人机遥控器方案定制_MTK平台无人设备手持遥控终端PCB板开发

随着科技的不断发展和无人机技术的逐步成熟&#xff0c;无人机越来越受到人们的关注。作为一种高新技术&#xff0c;无人机的应用范围不断拓展&#xff0c;包括农业、环境监测、城市规划、运输物流等领域。同时&#xff0c;无人机的飞行控制技术也得到了不断的优化和提升。 早…