了解如何使用shell實(shí)用程序“direnv”在West工作區(qū)中工作時(shí)自動(dòng)激活Zephyr構(gòu)建環(huán)境
我最近為Nordic Thingy:91 X設(shè)置了一個(gè)nRF Connect SDK (NCS)命令行開發(fā)環(huán)境,其中包括下載和安裝工具鏈和SDK代碼。
當(dāng)我設(shè)置好一切后,我發(fā)現(xiàn)了如何使用shell實(shí)用工具來通過CLI在West工作區(qū)中工作時(shí)自動(dòng)激活Zephyr構(gòu)建環(huán)境。一旦配置了direnv,當(dāng)將目錄更改為工作空間時(shí),將在shell中自動(dòng)激活構(gòu)建環(huán)境。類似地,當(dāng)離開工作區(qū)目錄時(shí),構(gòu)建環(huán)境將自動(dòng)停用。
如果您像我一樣,并且您的大腦是篩子,那么這將使您不必記住并手動(dòng)鍵入命令來激活python虛擬環(huán)境,并獲取所需的腳本,以確保正確設(shè)置Zephyr環(huán)境變量。
在這個(gè)項(xiàng)目中,我將描述如何為Nordic的nRF Connect SDK (NCS)以及“vanilla”上游Zephyr RTOS West工作區(qū)設(shè)置這個(gè)shell自動(dòng)化。
在我們深入項(xiàng)目之前,請(qǐng)注意:不幸的是,direnv只能在類unix操作系統(tǒng)(macOS, Linux等)上工作,并且需要支持shell (bash, zsh, tcsh, fish, elvish, powershell, murex, nushell)。對(duì)不起,Windows的朋友們!
nRF Connect SDK (NCS)示例
在最新版本的nRF Connect SDK中,Nordic建議使用他們的nRF Util CLI工具來管理Nordic提供的工具鏈包的安裝。
nRF Util (nrfutil)被描述為“北歐產(chǎn)品的統(tǒng)一命令行實(shí)用工具”,通過一組可安裝和可升級(jí)的子命令提供了廣泛的功能。具體來說,toolchain-manager命令可用于搜索、安裝和卸載工具鏈。
除了管理工具鏈之外,toolchain-manager命令還提供env和launch子命令來激活shell中的特定工具鏈環(huán)境。
例如,您可以使用nrfutil toolchain-manager env命令來顯示配置工具鏈環(huán)境所需的環(huán)境變量:
在安裝nRF Connect SDK文檔中,Nordic建議使用以下命令在子shell中激活工具鏈:
不幸的是,當(dāng)啟動(dòng)這個(gè)子shell時(shí),任何shell配置文件(例如。bashrc)都會(huì)被跳過:
生成的shell由shell環(huán)境變量決定。嘗試在不運(yùn)行任何配置文件(例如。bashrc)的情況下生成shell,因?yàn)檫@些文件可能(潛在地)弄亂環(huán)境。
結(jié)果,如下圖所示,在啟動(dòng)新的子shell時(shí),我的自定義shell提示符和其他shell配置被忽略:
作為替代方案,nrfutil toolchain-manager env——As -script命令可以輸出一個(gè)腳本,該腳本設(shè)置與launch——shell子命令相同的環(huán)境:
通過在該命令的輸出上運(yùn)行eval,我們可以有效地激活當(dāng)前shell中的工具鏈構(gòu)建環(huán)境(無需啟動(dòng)新的子shell):
不幸的是,我永遠(yuǎn)也記不住這個(gè)命令……
用direnv自動(dòng)化它
如果工具鏈在我們進(jìn)入West工作區(qū)時(shí)自動(dòng)激活,在我們離開工作區(qū)時(shí)自動(dòng)停用,那就太好了。
對(duì)我們來說幸運(yùn)的是,direnv是一個(gè)通用的shell實(shí)用程序,旨在支持這種類型的行為。
在每個(gè)提示符之前,direnv檢查當(dāng)前目錄和父目錄中是否存在.envrc文件(也可以選擇存在.env文件)。如果該文件存在(并且經(jīng)過授權(quán)),則將其加載到bash子shell中,然后由direnv捕獲所有導(dǎo)出的變量,然后使其可用于當(dāng)前shell。
首先,我們需要安裝direnv shell實(shí)用程序。
接下來,在West工作區(qū)的根目錄下,我們需要添加一個(gè).envrc文件,包含以下行:
現(xiàn)在,當(dāng)我們進(jìn)入工作區(qū)目錄時(shí),direnv將自動(dòng)運(yùn)行上面的命令,并將生成的構(gòu)建環(huán)境變量導(dǎo)出到當(dāng)前shell中。您應(yīng)該看到如下消息:
我們可以檢查以驗(yàn)證環(huán)境變量是否設(shè)置正確。例如:
萬歲,成功了!
出于安全考慮,除非明確允許,否則direnv不會(huì)自動(dòng)從.envrc腳本加載更改。因此,您可能會(huì)在第一次進(jìn)入工作區(qū)時(shí)看到如下錯(cuò)誤:
你只需要運(yùn)行一次direnv allow來允許它運(yùn)行。
上游Zephyr示例
我們還可以使用direnv來自動(dòng)激活“vanilla”Zephyr RTOS工作區(qū)的構(gòu)建環(huán)境。
如果你通過命令行使用West工作區(qū),你可能習(xí)慣輸入這樣的東西來激活構(gòu)建環(huán)境:
和上面的NCS示例一樣,我們可以在West工作空間的根目錄下添加一個(gè).envrc文件,如下所示:
現(xiàn)在,只要您進(jìn)入Zephyr -workspace/目錄,python虛擬環(huán)境和Zephyr環(huán)境腳本就會(huì)自動(dòng)激活!
本文編譯自hackster.io