使用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.pswp.cn/news/160202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160202.shtml
英文地址,請注明出處:http://en.pswp.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;并且…