Zeal8bit操作系統(tǒng)Build & Run In Emulator (基于macOS)

0. 前言
基于macOS?build Zeal8bit操作系統(tǒng) OS,并在Web Emulator上成功運(yùn)行,依然踩了不少坑,給想動(dòng)手嘗試一下的同學(xué)們分享下~?
書接上文:Zeal8bit操作系統(tǒng)Build & Run In Emulator (基于Ubuntu)
沒想到這么快就來(lái)填坑了~
為什么已經(jīng)在Ubuntu上成功build了Zeal8bit OS了還需要在macOS上再重復(fù)一遍呢?因?yàn)槭诸^有一臺(tái)MacBook作為個(gè)人學(xué)習(xí)的主力平臺(tái),Z80的各種資料都準(zhǔn)備好了,不在macOS上把build flow建立起來(lái)說(shuō)不過(guò)去吧?
Build flow已經(jīng)成功在macOS跑通了,還是踩了不少坑。相比于Ubuntu上主要的坑集中在build z88dk-z80asm的bin文件上,在macOS的坑集中shell命令和Ubuntu的差異上。由于Zeal8bit大佬的Makefile是在Linux上構(gòu)建和使用的,也許他壓根沒有想到會(huì)有人把這個(gè)flow運(yùn)行在macOS上。
話不多說(shuō),開始咱們今天的build細(xì)節(jié)分享~
1. 環(huán)境及所需工具
macOS (本機(jī)版本:Monterery 版本12.6.6);
Python 3及PIP3 Mac版
z88dk-osx-2.2.zip
2. 工具安裝
Python3及pip3安裝
MacOS下安裝python3和pip3的教程比較普遍,我這邊也不再贅述。安裝成功后,在terminal中用which命令展示的效果:

z88dk-asm安裝
從https://kgithub.com//z88dk/z88dk/releases目錄下載z88dk-osx-2.2.zip壓縮包:

需要注意的是,macOS默認(rèn)會(huì)阻止不受信任的軟件來(lái)源下載導(dǎo)致下載失敗。因此下載前先修改下系統(tǒng)設(shè)置,讓macOS能夠接受來(lái)自非App Store的軟件下載,做法如下:
首先在terminal中輸入:sudo spctl --master-disable,輸入密碼點(diǎn)擊Enter確認(rèn)即可;

然后打開“系統(tǒng)偏好設(shè)置”,在彈出的界面上點(diǎn)擊“安全性和隱私”,接著點(diǎn)擊左下角的鎖解鎖后,就可以在本界面的“允許從以下位置下載的App”中選擇“任何來(lái)源”了。

這樣設(shè)置以后,系統(tǒng)就不會(huì)阻止不受信任的軟件下載了。
我這邊就默認(rèn)放在Download目錄下了, 使用unzip命令解壓壓縮包即可獲得z88dk-z80asm的bin文件了,無(wú)需自己build(隔壁Ubuntu默默留下嫉妒的淚水,并點(diǎn)了個(gè)贊)

同時(shí)記得在z88dk目錄下修改一下set_environment.sh的內(nèi)容如下,防止z88dk/bin的目錄重復(fù)設(shè)置到$PATH中:

最后source set_environment.sh把z88dk-z80asm編譯工具的路徑添加到系統(tǒng)變量$PATH中,方便后面的步驟直接使用z88dk-z80asm命令。

3. Image Build
老規(guī)矩,先從github上把OS代碼先clone下來(lái):git clone?https://kgithub.com/Zeal8bit/Zeal-8-bit-OS.git,獲得Zeal-8-bit-OS目錄,進(jìn)入該目錄下。
Step 1. 下載安裝menuconfig及Makefile預(yù)處理
根據(jù)之前在Ubuntu下的操作經(jīng)驗(yàn),先用pip3 install kconfiglib,然后找到menuconfig文件的目錄,比如我的menuconfig目錄就在python3的bin目錄下:

如果像我一樣在Python3 user base目錄下沒有安裝menuconfig的話,那就這樣修改Makefile目錄下的menuconfig target下的內(nèi)容:

根據(jù)已知的Makefile執(zhí)行在macOS和Linux上的差異(實(shí)際是踩坑加測(cè)試總結(jié)出來(lái)的),在macOS下的Makefile中,define后面不能接“=”,否則define不生效。因此需要把Makefile中任何define行中的“=”去除掉(Makefile中有3處,記得都去除下),如下圖所示:

Step 2. Execute ‘make menuconfig’
如Zeal8bit大佬視頻中所說(shuō),直接默認(rèn)參數(shù)保存即可。命令執(zhí)行完成后,確保include目錄下生成了osconfig.asm.

Step 3. Execute?'make'
執(zhí)行make命令,不出意外,你會(huì)遇到如下錯(cuò)誤:
Build Error 1:build/build/init_TEXT.bin: No such file or directory
在Ubuntu上build就遇到的老問(wèn)題了,小case,將target/zeal8bit/romdisk/Makefile的第25行和第29行修改成如下的內(nèi)容:

Pass,下一個(gè)~
Build Error 2:stat: illegal option -- c
macOS上遇到的新問(wèn)題,上網(wǎng)搜索下,發(fā)現(xiàn)macOS并不支持stat -c命令。
首先解釋下stat -c命令的含義:'stat -c [-option] file_name' 可以指定格式輸出file的某些狀態(tài)信息,比如本Makefile中使用的 'stat -c %s target//zeal8bit//romdisk/disk.img'就是以字節(jié)數(shù)獲取disk.img的文件大小。
顯然,macOS并不支持stat -c命令:

既然知道錯(cuò)誤原因以及這個(gè)命令的目的就是獲取文件的占用字節(jié)數(shù),而且macOS看起來(lái)是支持stat -x選項(xiàng)的,那我們就可以用其他命令平替。
修改target/zeal8bit/unit.mk的第30行為:

Build Error 3:du: invalid option -- b
繼續(xù)執(zhí)行make,發(fā)現(xiàn)在執(zhí)行到“post commands”的時(shí)候還有錯(cuò)。仔細(xì)看target/zeal8bit/unit.mk的POSTCMD我們可以發(fā)現(xiàn),這邊使用了du -b選項(xiàng)用來(lái)以字節(jié)數(shù)方式獲取文件大小,而du -b選項(xiàng)在macOS中還是不支持:

不過(guò)仔細(xì)看POSTCMD,我們發(fā)現(xiàn)使用du命令只是為了打印文件大小信息,并沒有其他用途,因此我們用-h或者-k選項(xiàng)大概表示一下文件大小就行了,修改target/zeal8bit/unit.mk第42, 44和48行,把-b選項(xiàng)修改為-h:

再次執(zhí)行make,大功告成~

4. Run OS in Web Emulator
按照上篇文章中運(yùn)行OS img的步驟,加載os_with_romdisk.img后運(yùn)行結(jié)果:

5. 總結(jié)
在macOS上把build flow又試了一遍,遇到新坑,填新坑。
只有在不斷地折騰中,才能讓自己的知識(shí)不斷豐富起來(lái)。
好了,從現(xiàn)在開始正式嘗試學(xué)習(xí)Zeal8bit OS的代碼了,等哪一天我把OS在我的RISC-V上運(yùn)行起來(lái)了,興許可以發(fā)個(gè)視頻~
