使用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用于:

  1. 构建容器
  2. 运行容器

这可能已经足以让AI自由运行,但我倾向于对输出保留更多控制权。例如,我想把什么Make 配方与“构建”和“运行”关联呢?每个人都有自己的命名约定,但就这项练习而言,我想告诉AI创建以下配方:

  1. docker_image用来构建容器
  2. 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添加更多功能。用不了多久,我们将拥有一个完全现代化的构建系统,能够显著改善嵌入式软件开发方式。

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

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

相关文章

Unity 场景烘培 ——LensFlare镜头光晕(三)

提示:文章有错误的地方,还望诸位大神指出! 文章目录 前言一、镜头光晕 (Lens Flares)是什么?二、使用Lens Flares组件总结 前言 一般情况下都会忽略的东西,镜头光晕。理论上不加镜头光晕,也不会有什么影响…

vue3的两个提示[Vue warn]: 关于组件渲染和函数外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 这个消息是提示我们,需要将引入的方法作为一个变量使用。以vue-store为例,如果我们按照如下的方式使用: import UseUserStore from ../../store/module…

RabbitMQ快速入门(简单收发消息)

文章目录 前言一、数据隔离1.用户管理2.virtual host 二、控制台收发1.交换机2.队列3.绑定 三、编程式收发1.依赖和配置2.收发信息 总结 前言 1.了解数据隔离 2.RabbitMQ控制台收发信息 3.SpringBoot整合RabbitMQ收发信息 一、数据隔离 1.用户管理 点击Admin选项卡&#xff0…

依赖库:Ceres-solver-2.0.0安装

依赖库:Ceres-solver-2.0.0安装 前言安装ceres-solver-2.0.0验证 前言 Ceres Solver是谷歌开源的C非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中…

sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube,sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

“我,24岁,年薪20万”:选对了行业究竟多重要?

那些在职场上顺风顺水,按部就班拿到高薪的人都有什么特点? 今天的主人公Flee告诉我,是稳。 在她的故事里,我看到一个“别人家的姑娘”,是怎样在职场上稳步晋升,大学毕业仅2年,就拿到18.6K月薪&a…

2022年12月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 一个骰子,从3个不同角度看过去的点数如图所示,请问5的对面是什么点数?( ) A:1 B:3 C:4 D:6 答案:A 根据图三,用右手定则,大拇指朝上指向6所对的方向,其余四指握起来…

目标检测框存在内嵌情况分析与解决

这里写目录标题 问题描述原因分析与解决方法:后续及思考参考文档 问题描述 目标检测模型输出的检测框存在内嵌情况。 原因分析与解决方法: 根据经验,第一感觉是后处理nms部分出了问题。来看下对应的代码: static float CalcIou…

通过对比 入库申请->入库审核流程 与 直接入库 代码实现,解决前者误修改stock_info表is_in=1或2数据的bug

入库申请->入库审核流程&#xff1a; 提交按键定义位置&#xff1a;src\views\purchase\rurchase\RurchaseAdd.vue <a-button click"handleSubmit" type"primary" :loading"loading">确认物品已入库</a-button> <template&…

二、类与对象(二)

8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…

Python BDD之Behave测试报告

behave 本身的测试报告 behave 本身提供了四种报告格式&#xff1a; pretty&#xff1a;这是默认的报告格式&#xff0c;提供颜色化的文本输出&#xff0c;每个测试步骤的结果都会详细列出。plain&#xff1a;这也是一种文本格式的报告&#xff0c;但没有颜色&#xff0c;并且…

电动汽车充放电V2G模型MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主要内容&#xff1a; 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消纳供给商场基础负荷…

【办公常识】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

五大资源之Service(可以固定IP)

Service可以看作是一组同类Pod对外访问接口,借助Service应用可以方便的实现服务发现与负载均衡 创建集群内部可以访问Service #暴露Service(也创建在了namespace dev下) [root@master ~]# kubectl expose deployment(pod控制器) nginx --name=svc-nginx1 --type=Cluste…

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码

基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于原子轨道搜索算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于原子轨道搜索优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

Python入门教学——输入任意长度的int整型一维数组

使用python输入一个任意长度的整型一维数组&#xff1a; nums input("请输入整数数组&#xff0c;用空格分隔&#xff1a; ") nums [int(i) for i in nums.split( )] # 将每个数转换为整型后输出 运行结果&#xff1a; 【注】如果不强制转换类型&#xff0c;数字…

如何使用YOLOv8代码框架中的RT-DETR

1. RT-DETR RT-DETR是由由此&#xff0c;百度推出了——RT-DETR (Real-Time DEtection TRansformer) &#xff0c;一种基于 DETR 架构的实时端到端检测器&#xff0c;其在速度和精度上取得了 SOTA 性能。 RT-DETR开源的代码在百度自己的飞桨paddlepaddle上&#xff0c;因此非…

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

新手必看!!附源码!!STM32通用定时器输出PWM

一、什么是PWM? PWM&#xff08;脉冲宽度调制&#xff09;是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值

目录 背景问题问题分析问题解决 错误解决与定位技巧总结 背景 仍旧是学生信息管理系统的问题&#xff0c;当时做的时候没发现这么多问题呢&#xff0c;只能说明一件事&#xff0c;做的时候没有站在用户的角度考虑需求&#xff0c;设置了什么内容&#xff0c;就按照设置好的去测…