使用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添加更多功能。用不了多久,我們將擁有一個完全現代化的構建系統,能夠顯著改善嵌入式軟件開發方式。