Zeal8bit操作系统Build & Run In Emulator (基于macOS)

0. 前言
基于macOS build Zeal8bit操作系统 OS,并在Web Emulator上成功运行,依然踩了不少坑,给想动手尝试一下的同学们分享下~
书接上文:Zeal8bit操作系统Build & Run In Emulator (基于Ubuntu)
没想到这么快就来填坑了~
为什么已经在Ubuntu上成功build了Zeal8bit OS了还需要在macOS上再重复一遍呢?因为手头有一台MacBook作为个人学习的主力平台,Z80的各种资料都准备好了,不在macOS上把build flow建立起来说不过去吧?
Build flow已经成功在macOS跑通了,还是踩了不少坑。相比于Ubuntu上主要的坑集中在build z88dk-z80asm的bin文件上,在macOS的坑集中shell命令和Ubuntu的差异上。由于Zeal8bit大佬的Makefile是在Linux上构建和使用的,也许他压根没有想到会有人把这个flow运行在macOS上。
话不多说,开始咱们今天的build细节分享~
1. 环境及所需工具
macOS (本机版本: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默认会阻止不受信任的软件来源下载导致下载失败。因此下载前先修改下系统设置,让macOS能够接受来自非App Store的软件下载,做法如下:
首先在terminal中输入:sudo spctl --master-disable,输入密码点击Enter确认即可;

然后打开“系统偏好设置”,在弹出的界面上点击“安全性和隐私”,接着点击左下角的锁解锁后,就可以在本界面的“允许从以下位置下载的App”中选择“任何来源”了。

这样设置以后,系统就不会阻止不受信任的软件下载了。
我这边就默认放在Download目录下了, 使用unzip命令解压压缩包即可获得z88dk-z80asm的bin文件了,无需自己build(隔壁Ubuntu默默留下嫉妒的泪水,并点了个赞)

同时记得在z88dk目录下修改一下set_environment.sh的内容如下,防止z88dk/bin的目录重复设置到$PATH中:

最后source set_environment.sh把z88dk-z80asm编译工具的路径添加到系统变量$PATH中,方便后面的步骤直接使用z88dk-z80asm命令。

3. Image Build
老规矩,先从github上把OS代码先clone下来:git clone https://kgithub.com/Zeal8bit/Zeal-8-bit-OS.git,获得Zeal-8-bit-OS目录,进入该目录下。
Step 1. 下载安装menuconfig及Makefile预处理
根据之前在Ubuntu下的操作经验,先用pip3 install kconfiglib,然后找到menuconfig文件的目录,比如我的menuconfig目录就在python3的bin目录下:

如果像我一样在Python3 user base目录下没有安装menuconfig的话,那就这样修改Makefile目录下的menuconfig target下的内容:

根据已知的Makefile执行在macOS和Linux上的差异(实际是踩坑加测试总结出来的),在macOS下的Makefile中,define后面不能接“=”,否则define不生效。因此需要把Makefile中任何define行中的“=”去除掉(Makefile中有3处,记得都去除下),如下图所示:

Step 2. Execute ‘make menuconfig’
如Zeal8bit大佬视频中所说,直接默认参数保存即可。命令执行完成后,确保include目录下生成了osconfig.asm.

Step 3. Execute 'make'
执行make命令,不出意外,你会遇到如下错误:
Build Error 1:build/build/init_TEXT.bin: No such file or directory
在Ubuntu上build就遇到的老问题了,小case,将target/zeal8bit/romdisk/Makefile的第25行和第29行修改成如下的内容:

Pass,下一个~
Build Error 2:stat: illegal option -- c
macOS上遇到的新问题,上网搜索下,发现macOS并不支持stat -c命令。
首先解释下stat -c命令的含义:'stat -c [-option] file_name' 可以指定格式输出file的某些状态信息,比如本Makefile中使用的 'stat -c %s target//zeal8bit//romdisk/disk.img'就是以字节数获取disk.img的文件大小。
显然,macOS并不支持stat -c命令:

既然知道错误原因以及这个命令的目的就是获取文件的占用字节数,而且macOS看起来是支持stat -x选项的,那我们就可以用其他命令平替。
修改target/zeal8bit/unit.mk的第30行为:

Build Error 3:du: invalid option -- b
继续执行make,发现在执行到“post commands”的时候还有错。仔细看target/zeal8bit/unit.mk的POSTCMD我们可以发现,这边使用了du -b选项用来以字节数方式获取文件大小,而du -b选项在macOS中还是不支持:

不过仔细看POSTCMD,我们发现使用du命令只是为了打印文件大小信息,并没有其他用途,因此我们用-h或者-k选项大概表示一下文件大小就行了,修改target/zeal8bit/unit.mk第42, 44和48行,把-b选项修改为-h:

再次执行make,大功告成~

4. Run OS in Web Emulator
按照上篇文章中运行OS img的步骤,加载os_with_romdisk.img后运行结果:

5. 总结
在macOS上把build flow又试了一遍,遇到新坑,填新坑。
只有在不断地折腾中,才能让自己的知识不断丰富起来。
好了,从现在开始正式尝试学习Zeal8bit OS的代码了,等哪一天我把OS在我的RISC-V上运行起来了,兴许可以发个视频~
