使用ChatGPT创建Makefile构建系统:使用Make运行Docker
使用ChatGPT创建Makefile构建系统:使用Make运行Docker
芯语芯愿(知乎/纷传/CSDN/);小石头的芯语芯愿(微信公众号)
开发高效现代的构建系统对于满足开发周期需求至关重要。原先,嵌入式开发者一贯依靠集成构建系统,这些系统使用的是供应商提供的集成开发环境(如Eclipse)。遗憾的是,这些工具隐藏了许多重要细节,一旦与Docker和CI/CD解决方案这样的现代流程集成,就难免捉襟见肘。
在上一篇《使用ChatGPT创建Makefile构建系统:使用Docker开始入门》中,我们开发了一个自定义的构建系统,创建了一个Docker容器。我们没有按照传统方式来创建Dockerfile。而是改用人工智能工具ChatGPT来替我们做了这个系统!
在本文中,我们将继续此工作,使用ChatGPT创建一个初级Makefile,它可以让我们构建和加载Docker容器。
定义初始需求
在直接输入ChatGPT提示之前,你应该停下来思考一下究竟想要这个工具做什么。眼下,你已经有了上一篇文章中的Dockerfile,但你想要创建一个Makefile用于:
- 构建容器
- 运行容器
这可能已经足以让AI自由运行,但我倾向于对输出保留更多控制权。例如,我想把什么Make 配方与“构建”和“运行”关联呢?每个人都有自己的命名约定,但就这项练习而言,我想告诉AI创建以下配方:
- docker_image用来构建容器
- docker_run用来运行容器
只要你对Docker有所了解,就知道还必须给镜像和容器提供名称。我使用的名称是beningo/cpp-dev。(啊!CPP当然代表C++咯,但我们可是嵌入式开发者!诶错,我们搭建的镜像将允许我们为C/C++编译嵌入式代码!)
生成Makefile,动手!
有了基本要求,现在该给 Makefile 初步构思一个提示了。我喜欢先给工具提供一些上下文。所以,我第一个提示只是一个简单的句子:
“这是我为构建嵌入式软件而创建的Dockerfile,暂时不要对此采取任何行动:”
除了这句提示,我还会粘贴从上一篇文章生成的Dockerfile。我删除了文本,保持可读性,也便于管理。
只要你按部就班跟着做,就会发现ChatGPT不可控制地分析这个Dockerfile。你可以忽略它。想想看这类工具是收费的,而且是按照生成文本量(令牌数)来收费的,所以它会提供如此详细的响应。
上下文设置好后,我们现在就可以要求它按照我们的要求进行操作了:
现在让我们尝试运行这个Makefile并看看会发生什么。

ChatGPT 生成的响应如下:

还不赖!我们来试试运行这个makefile,看看会发生什么。
使用Make构建Docker镜像
如果你熟悉运行Makefile,就会知道运行这些命令非常简单。但你需要先构建镜像,然后才能运行镜像。所以,在终端中运行以下命令:
make docker_image
你会看到这样就会运行Docker,并使用你的Dockerfile来创建容器。我假设你已经把Dockerfile和Makefile放置在同一个目录下。如果没有,那么你可能会遇到一些make错误。没关系,只要把它们放在同一个目录里再试一次即可。(注意:我也假设你如果是尝试跟着我进行操作的话,那么你应该已经安装了Docker Desktop!)
你会看到Docker会运行并开始构建容器。输出可能会很详细,所以我不会在这里展示。但是,我会展示在已经构建好的镜像上运行此命令的结果。如下所示:

如你所见,下载工具和配置镜像总共用了约11个步骤。仔细看,你会发现它构建速度真快!因为我之前运行过这条命令,docker_image什么也不用做。而在你的机器上,可能需要5-10分钟才能完全运行这条命令。
使用Make运行Docker镜像
现在你有了一个镜像,可以通过输入以下命令运行这个镜像:
make docker_run
执行此操作时,你可能会看到如下提示:

恭喜!你现在正在运行自己的Docker容器,您还可以构建代码,并使用镜像构建中包含的工具。但可能你还没注意到,这里有一个问题!
如果你将main.c文件放入项目目录中,并在终端中输入ls,你会发现看不到自己的代码!代码都看不到,该怎么使用Docker容器构建代码呢?你需要对docker_run 配方做些修改!
返回ChatGPT进行修复
是时候编一条新的提示来修复的问题了。我已经知道问题与docker_run不含-v privilege选项有关。在我自己的Makefile中,我使用的方法如下:
docker_run:
@docker run --rm -it --privileged -v "$(PWD):/home/app" beningo/cpp-dev:latest bash
来看看ChatGPT根据新的提示是否能给出类似的解决方案:

结果类似但有些不同:

尽管相似,但有些许差异。首先,我使用了$(PWD),不是$(shell pwd)。两者有什么区别呢?我询问ChatGPT时,得到以下回复:

嗯。我说实话。我更喜欢使用shell,这种方法更明确。虽然$(PWD)有效,我以前用的时候也从未遇到过问题,但使用shell能避免路径变量问题,所以这种方法更理想。(我也不会无条件地接受此结论,而是通过另一个信息来源进行核对)。
我的bash和ChatGPT的/bin/bash之间的差异也类似。只是我的方法更明确,出问题的可能性更低。
通过这些调整后,如果你现在运行:
make docker_run
然后执行ls命令,就会发现,你能访问本地源码了。注意:我们现在把容器的访问权限交给了本地内核。这样做会带来安全性问题。这对于Web或云开发者可能不是个好办法。对于我们这些嵌入式开发人员,仅用来构建代码可能没有问题,但你该仔细考量其中风险。
结论
你现在有机会能看到ChatGPT生成Dockerfile,并生成一个简单的makefile用来运行它。这个工具产生的输出并不完美,但通过谨慎审查和测试,并提供一些反馈,就可以获得令人激动的结果。我希望你能明白,你不能简单地对AI工具视而不见,这些工具在嵌入式软件开发中已经有了一席之地。
下次,我们将在目录中放置一些源代码示例,使用ChatGPT给makefile添加更多功能。用不了多久,我们将拥有一个完全现代化的构建系统,能够显著改善嵌入式软件开发方式。
相关文章:
使用ChatGPT创建Makefile构建系统:使用Make运行Docker
使用ChatGPT创建Makefile构建系统:使用Make运行Docker 芯语芯愿(知乎/纷传/CSDN/);小石头的芯语芯愿(微信公众号) 开发高效现代的构建系统对于满足开发周期需求至关重要。原先,嵌入式开发者一…...
算法设计与分析复习--分支界限法
文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法(二) 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间: 子集树排列树 …...
Https攻击怎么防御
随着互联网技术的发展,网站所遭受的网络攻击频率也在不断上升。某种程度上,我们可以说互联网上的每个网站都容易遭受安全攻击。因为网络攻击者最主要的动机是求财。无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的风险就在那里…...
网络知识学习(笔记二)
ios模型规定的网络模型一共有7层,但是实际使用过程中,4层的TCP/IP模型是经常使用的,网络知识学习笔记里面也是基于4层TCP/IP模型进行分析的,前面已经讲了:(1)物理层,(2&a…...
万字解析设计模式之组合模式、亨元模式
一、组合模式 1.1概述 组合模式是一种结构型设计模式,它允许将对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以一致地对待单个对象和对象组合,从而将复杂的层次结构展现为一个统一的树形结构。 在组合模式中&…...
HTTP之常见问答
1:HTTP/1.1 如何优化? :尽量避免发送 HTTP 请求;通过缓存技术,使用请求的 Etag 参数来处理判断缓存过期等问题,类似304状态码就是告诉客户端,缓存有效还能继续使用 :在需要发送 HTTP…...
java伪共享问题
参考文章 https://blog.csdn.net/qq_45443475/article/details/131417090 产生原因 cpu 与内核数据交换的单位是 cache 行,多核 cpu 的高速缓存在对同一个变量进行修改时由于缓存一致性协议导致对应的缓存失效。 缓存行的大小 cpu 架构有关系,如果是 …...
【Ubuntu】Ubuntu arm64 部署 Blazor Server 应用
部署步骤 发布安装运行环境:dotnet-sdk(必装)、aspnetcore-runtime、dotnet-runtime安装证书设置环境变量:临时变量、当前用户永久变量、所有用户的永久变量运行:终端运行、后台运行 基本情况 开发系统环境 系统&am…...
Android加固为何重要?很多人不学
为什么要加固? APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换,包括不限于隐藏,混淆,加密等操作,进一步保护软件的利益不受损坏。总结主要有以下三方面预期效果: 1.防篡改&#x…...
【C/PTA】函数专项练习(一)
本文结合PTA专项练习带领读者掌握函数,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 目录 6-1 输出星期名6-2 三整数最大值6-3 数据排序6-4 多项式求值 6-1 输出星期名 请编写函数,根据星期数输出对应的星期名。 函数原…...
SUDS: Scalable Urban Dynamic Scenes
SUDS: Scalable Urban Dynamic Scenes:可扩展的城市动态场景 创新点 1.将场景分解为三个单独的哈希表数据结构,以高效地编码静态、动态和远场辐射场 2.利用无标签的目标信号,包括RGB图像、稀疏LiDAR、现成的自监督2D描述符,以及…...
蓝桥杯算法双周赛心得——迷宫逃脱(记忆化搜索)
大家好,我是晴天学长,非常经典实用的记忆化搜索题,当然也可以用dp做,我也会发dp的题解,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .迷宫逃脱 迷官逃脱…...
nodejs+vue线上生活超市购物商城系统w2c42
超市管理系统的开发流程包括对超市管理系统的需求分析,软件的设计建模以及编写程序实现系统所需功能这三个阶段。对超市管理系统的需求分析。在这个阶段,通过查阅书籍,走访商场搜集相关资料,了解经营者对软件功能的具体所需和建议…...
飞翔的小鸟
运行游戏如下: 碰到柱子就结束游戏 App GameApp类 package App;import main.GameFrame;public class GameApp {public static void main(String[] args) {//游戏的入口new GameFrame();} } main Barrier 类 package main;import util.Constant; import util.Ga…...
浅析OKR的敏捷性
前言 OKR对于工作的提升有着一定的不可替代的作用。特别在敏捷方面。 OKR的敏捷性 OKR(Objectives and Key Results)是一种目标设定框架,它的敏捷性主要体现在以下几个方面: 公开透明 OKR要求完全公开透明,让每个员…...
Linux+qt:创建动态库so,以及如何使用(详细步骤)
目录 1、根据安装Qt Creator的向导进行创建 2、开发动态库注意的一些细节 3、给动态库添加一个对外开放的接口文件 4、了解下Qt的 .pri文件(非常实用) 5、如何调用动态库.so 1、根据安装Qt Creator的向导进行创建 (1)选择“…...
如何将Docker的构建时间减少40%
与许多公司类似,我们为产品中使用的所有组件构建docker映像。随着时间的推移,其中一些映像变得越来越大,我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间…...
二分查找——经典题目合集
文章目录 🦜69. x 的平方根🌼题目🌻算法原理🌷代码实现 🐳35. 搜索插入位置🌼题目🌻算法原理🌷代码实现 🦭852. 山脉数组的峰顶索引🌼题目🌻算法原…...
在Jupyter Lab中使用多个环境,及魔法命令简介
一、Jupyter Lab使用conda虚拟环境 1、给虚拟环境添加 ipykernel 方法一: 创建环境时直接添加ipykernel 方法:conda create -n 【虚拟环境名称】python3.8 ipykernel实例如下: conda create -n tensorflow_cpu python3.8 ipykernel 方法二ÿ…...
知虾数据软件:电商人必备知虾数据软件,轻松掌握市场趋势
在当今数字化时代,数据已经成为了企业决策的重要依据。对于电商行业来说,数据更是至关重要。如果你想在电商领域中脱颖而出,那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…...
如何在Mac上免费解密QQ音乐加密文件:QMCDecode完整使用指南
如何在Mac上免费解密QQ音乐加密文件:QMCDecode完整使用指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,…...
利用快马ai快速原型设计,一键生成微pe环境下的系统自动化部署脚本
今天想和大家分享一个特别实用的技术实践——如何用InsCode(快马)平台快速生成Windows PE环境下的系统自动化部署脚本。这个需求源于我最近频繁帮朋友重装系统,每次手动操作太耗时,于是尝试用AI生成脚本实现一键部署。 需求场景分析 微PE作为轻量级Windo…...
Arm Cortex-R82分支预测机制与实时系统优化
1. Cortex-R82分支预测机制深度解析在嵌入式实时系统中,处理器性能的发挥很大程度上依赖于分支预测的准确性。Arm Cortex-R82作为面向实时控制场景的高性能处理器,其分支预测机制的设计兼顾了效率与确定性需求。与通用处理器不同,R82的分支预…...
Cortex-R82调试架构与CoreSight实践指南
1. Cortex-R82调试架构概述在嵌入式实时系统中,调试接口的设计直接影响开发效率。Cortex-R82作为Armv8-R架构的高性能实时处理器,其调试子系统采用CoreSight架构实现,通过标准化的调试组件和访问机制,为开发者提供全面的系统可见性…...
智慧工业粉碎沙石机图像识别 取料机物料状态监测 智慧工业车辆图像识别 voc+yolo+voc数据集第10685期
车辆与工程机械检测数据集 ) 本数据集专注于工业与建筑场景下的重型设备识别,旨在为自动驾驶巡检、智慧工地管理及物流调度提供高质量的视觉训练底座。1. 数据集概述 通过对复杂作业环境下的视觉特征进行深度提取,本数据集涵盖了核心的运输与施工车辆目标…...
RISC-V生态资源导航:从Awesome列表到实战开发环境搭建
1. 项目概述:为什么RISC-V值得拥有一个“Awesome”列表?如果你最近几年在处理器架构、嵌入式系统或者开源硬件领域有所涉猎,那么“RISC-V”这个词对你来说一定不陌生。它不再是一个仅限于学术论文或小众极客圈子的概念,而是正在实…...
手把手教你用STM32CubeMX配置TIM主从模式,精准控制TB6600驱动步进电机
STM32CubeMX实战:TIM主从模式驱动TB6600步进电机全解析 在工业控制和自动化设备开发中,步进电机的精准控制一直是工程师面临的经典挑战。传统寄存器级编程虽然灵活,但对于追求开发效率的现代工程师而言,图形化配置工具正成为更优选…...
别再手动调参了!用STM32F407+OpenMV实现PID自动追踪色块,附完整代码和避坑指南
STM32F407与OpenMV联动的PID色块追踪实战:从参数自整定到系统优化 在嵌入式视觉控制领域,色块追踪系统一直是验证算法有效性的经典案例。当STM32F407遇到OpenMV,再结合PID控制算法,我们能构建出响应迅速、稳定性高的智能追踪装置。…...
相机标定入门:DLT、对极几何和PnP到底啥关系?一张图讲清楚
相机标定三剑客:DLT、对极几何与PnP的实战关系图谱 刚接触计算机视觉时,我总被各种标定算法绕得晕头转向——为什么论文里DLT和对极几何总是一起出现?PnP算法又为什么要用DLT做初始化?直到亲手实现了一个AR标记检测系统后…...
3分钟快速掌握CAJ转PDF终极方案:告别格式限制,释放学术自由
3分钟快速掌握CAJ转PDF终极方案:告别格式限制,释放学术自由 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https:…...
