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

news2024/12/24 20:15:50

使用 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.coloradmin.cn/o/1260993.html

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

相关文章

vatee万腾的科技征途:Vatee数字化力量的新视野

在科技的浪潮中,Vatee万腾正展开一场引人注目的科技征途,以其独特的数字化力量描绘出一片新的视野。这不仅是一次技术的升级,更是一场对未来的全新探索,为我们带来了前所未有的数字化时代。 Vatee万腾以其卓越的技术实力和前瞻性的…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言: 随着科技的飞速发展,虚拟现实(VR)技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用,以其沉浸式、交互式的特点,正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

智控openwrt调试

1、移植openwrt 如何加入需要编译的内核。 由于内核与openwrt版本不对需要集成, 在/lib/modules/* 加载模块的目录搞错了。 2、从页面如何垂直调用 2.1页面 使用LUCI,LUCIUCILUA UCI 是 Openwrt 中为实现所有系统配置的一个统一接口,英…

vr红色教育虚拟展馆全景制作提升单位品牌形象

720全景展馆编辑平台以其独特的优势,为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案,进一步提升了展览行业的水平和影响力。 一、提升展示效果,增强品牌形象 720全景展馆编辑平台通过…

AIGC系列之:Vision Transformer原理及论文解读

目录 相关资料 模型概述 Patch to Token Embedding Token Embedding Position Embedding ViT总结 相关资料 论文链接:https://arxiv.org/pdf/2010.11929.pdf 论文源码:https://github.com/google-research/vision_transformer PyTorch实现代码…

线上异步任务突然不能回写100%

项目场景: 需求是一个作业,需要运行一组sql,所有sql运行完成,更新作业进度为100%,状态为完成。sql需要是在大数据平台,通过yarn调度,异步执行。 kafka监听每个sql的执行状态,所有sql…

设计问卷调查问题的技巧二:确定问题的结构与顺序

上篇文章中,我们了解到设计问卷调查问卷的技巧有保持问题中立、少用开放式问题、保持全名平衡的答案集、谨慎设置单一回答。在这篇文章中,我们将继续深入探讨设计问卷调查问题的剩余5大技巧! Tip5:注意问题的顺序 虽然您可以任意…

蓝桥杯刷题day01——字符串中的单词反转

题目描述 你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息 message 转换为正常语序。 注意:输入字符串 message 中可能会存在前导空…

机器学习中的概率与统计知识点汇总

引言 在学习高级知识时,理解基本概念至关重要。为什么?因为基础知识是您构建高级知识的基础。如果你把更多的东西放在薄弱的基础之上,它最终可能会分裂,这意味着你最终无法完全理解你所学的任何知识。因此,让我们尝试…

探索编程在现代社会的无限价值

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

有一种浪漫,叫接触Linux

大家好,我是五月。 嵌入式开发 嵌入式开发产品必须依赖硬件和软件。 硬件一般使用51单片机,STM32、ARM,做成的产品以平板,手机,智能机器人,智能小车居多。 软件用的当然是以linux系统为蓝本&#xff0c…

element table滚动条失效

问题描述:给el-table限制高度之后滚动条没了 给看看咋设置的&#xff1a; <el-table:data"tableData"style"width: 100%;"ref"table"max-height"400"sort-change"changeSort">对比了老半天找不出问题&#xff0c;最后…

时间序列预测 — LSTM实现多变量多步负荷预测(Keras)

目录 1 数据处理 1.1 数据集简介 1.2 数据集处理 2 模型训练与预测 2.1 模型训练 2.2 模型多步预测 2.3 结果可视化 1 数据处理 1.1 数据集简介 实验数据集采用数据集6&#xff1a;澳大利亚电力负荷与价格预测数据&#xff08;下载链接&#xff09;&#xff0c;包括数…

国内某知名半导体公司:实现虚拟化环境下的文件跨网安全交换

立足特定应用领域的创新型企业 上海某半导体公司是中国10大集成电路设计公司之一的子公司。该半导体公司是一家特色工艺集成电路芯片制造企业&#xff0c;专注模拟电路、功率器件所需的特色生产工艺研发与制造&#xff0c;。 该半导体公司不断追求创新&#xff0c;提高自身产…

Leetcode—907.子数组的最小值之和【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—907.子数组的最小值之和 算法思想 参考自y神思想 实现代码 class Solution { public:int sumSubarrayMins(vector<int>& arr) {long long ans 0;const int mod 1e97;int n arr.size();stack<int>…

万字详解,和你用RAG+LangChain实现chatpdf

像chatgpt这样的大语言模型(LLM)可以回答很多类型的问题,但是,如果只依赖LLM,它只知道训练过的内容,不知道你的私有数据:如公司内部没有联网的企业文档,或者在LLM训练完成后新产生的数据。(即使是最新的GPT-4 Turbo,训练的数据集也只更新到2023年4月)所以,如果我们…

在龙蜥 anolis os 23 上 源码安装 PostgreSQL 16.1

在龙蜥 OS 23上&#xff0c;本来想使用二进制安装&#xff0c;结果发现没有针对龙蜥的列表&#xff1a; 于是想到了源码安装&#xff0c;下面我们列出了PG源码安装的步骤&#xff1a; 1.安装准备 1.1.创建操作系统组及用户 groupadd postgres useradd -g postgres -m postgr…

深度学习回顾:七种网络

一、说明 本文 揭开CNN、Seq2Seq、Faster R-CNN 和 PPO &#xff0c;以及transformer和humg-face— 编码和创新之路。对于此类编程的短小示例&#xff0c;用于对照观察&#xff0c;或做学习实验。 二、CNN网络示例 2.1 CNN用mnist数据集 CNN 专为图像处理而设计&#xff0c;包…

基于SpringBoot与Vue的增城高校二手物品交易系统

基于SpringBoot 与 Vue 的增城高校二手物品交易系统的设计与实现 摘要&#xff1a;随着生活水平和在校大学生消费能力的提高&#xff0c;学生用品的迭代速度越来越快&#xff0c;导致大量的闲置物品无法及时完成处理&#xff0c;而传统的线下摆摊等方式处理不仅效率低&#xf…

ChatGPT等模型:到2026年,将消耗尽高质量训练数据

《麻省理工技术评论》曾在官网发表文章表示&#xff0c;随着ChatGPT等大模型的持续火热&#xff0c;对训练数据的需求越来越大。大模型就像是一个“网络黑洞”不断地吸收&#xff0c;最终会导致没有足够的数据进行训练。 而知名AI研究机构Epochai直接针对数据训练问题发表了一…