使用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…

数据治理之考评环节

考评的流程(批处理) 周期调度,每天一次:采集hive, hdfs元数据存放到mysql中的dga库的metainfo表手动通过管理页面补充辅助信息指标考评 读取要考评的表的元数据及辅助信息读取要考评的指标对每张表的每个指标逐个进行考评保存考评…

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

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

mmdet全教程

官方给的文档一言难尽,网上的教程又没有从大纲到源码的完整解读,计划年后开个系列记录一下

依赖库:Ceres-solver-2.0.0安装

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

图像分类单张图片预测准确率达到百分之百

在图像分类任务中,针对单个图片得到100%的准确率是有可能但极其罕见的,并且不代表模型在整个测试集上也能达到100%的准确率。   针对单个图片获得100%准确率的情况可能包括以下几种情形: 图片本身特殊性: 如果测试集中的某张图片在训练集中…

【python基础(1)】变量和简单数据类型

文章目录 一. 变量的命名和使用二. 字符串1. 修改字符串的大小写2. 在字符串中使用变量3. 使用制表符或换行符来添加空白4. 删除空白 三. 数1. 整数2. 浮点数3. 整数和浮点数4. 数中的下划线5. 同时给多个变量赋值6. 常量 三. 注释四. Python之禅 一. 变量的命名和使用 变量规…

各种LLM数据集包括SFT数据集

各种LLM数据集包括SFT数据集 数集介绍和 hf上的名字对话数据生成方法交通领域数据集SFT 的解释数集介绍和 hf上的名字 通用预训练数据集 SFT datasets SFT 数据集 50万条中文ChatGPT指令Belle数据集:BelleGroup/train_0.5M_CN 100万条中文ChatGPT指令Belle数据集:BelleGrou…

C++学习 --stack

目录 1, 什么是stack 2, 创建stack 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作stack 3-1, 赋值 3-2, 插入元素(push) 3-3, 查询元素 3…

Linux的简单使用

Linux命令使用技巧 Tab键自动补全连续两次Tab键,给出操作提示使用上下箭头快速调出曾经使用过的命令使用clear命令或者Ctrll快捷键实现清屏Linux的常用命令 命令作用详细说明ls [-al] [dir]显示指定目录下的内容 -a 显示所有文件及目录 (. 开头的隐藏文件也会列出) …

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…

「go查漏补缺」命名规则以及 GROM 结构体的应用

概述: 在学习GORM过程中,总是在调用结构体和文件导入这里出错,所以整理了以下文档用于梳理变量/结构体命名规则和import导入的知识点 一、变量/结构体命名规则 变量/结构体都遵守同样的命名规则:可见性由首字母大小写决定 大写…

单一职责原则 (Single Responsibility Principle)

定义: 单一职责原则指一个类应该仅有一个引起它变化的原因。这个原则强调一个类应该只负责一个功能领域中的相应职责,或者可以理解为一个类应该只有一个改变的原因。 解决的问题: 降低类的复杂度,一个类只负责一项任务会更加清…

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;并且…