鸿蒙内核开发笔记之:编译过程

准备工作 确认目标 理想:在内核基础上增加自己的组件让它看起来像电脑操作系统 现实:尝试学习构建自己的硬件驱动 小目标 编译系统内核 启动内核和外壳,打出“hello huawei” 第一步,环境搭建

准备工作

确认目标

  • 理想:在内核基础上增加自己的组件让它看起来像电脑操作系统

  • 现实:尝试学习构建自己的硬件驱动

小目标

  • 编译系统内核

  • 启动内核和外壳,打出“hello huawei”

第一步,环境搭建

对于开发板来讲,Windows用户最好就是安装官方的 DevEco Device Tool VisualStudioCode

由于我的目标不是想在开发板上调试,而是想在虚拟机上调试,所以我们可以直接使用命令行工具来安装我们的环境,也可以使用Docker镜像来辅助我们编译内核。

安装VitrualBox7

之前用WSL2来做构建环境,各种未知问题出现,而且编译过程非常漫长,最终决定换VBOX7

Downloads – Oracle VirtualBox

安装x86架构的就行,安装方式参考官方文档First Steps

*注意:CPU选4个核心或以上,内存最少也是4096MB,建议安装好增强工具,这样可以配置轻松挂载共享目录,方便穿文件。

安装Ubuntu20.04LTS(建议)

Ubuntu 20.04.6 LTS (Focal Fossa)

虚拟磁盘最好留个128GB以上

#先把root密码改了,该设置的设置好
xxx@~$ su root
#把必要的内容安装了
root@~$ apt install python3 python3-pip ninja-build cmake git git-lfs

第二步,内核代码的部署

内核代码本身是需要但需下载的,但是这里由于我上面部署了自己的Docker环境嘛,于是我就取了个巧,在上面启动的Docker容器里面直接注册和下载内核代码。下载的代码实际上会存储在 D:\OpenHarmony 目录下。

首先在刚刚启动好的容器里面执行下载repo工具:

mkdir ~/bin
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo 
chmod a+x ~/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

整个过程很顺利的,因为安装用到的工具,华为那个Docker镜像里面都有预装了,就很爽~^_^

然后我们就继续定位到映射的代码目录/home/openharmony 执行各种操作来下载代码。

首先注册一个repo,命令行如下

#命令
cd /home/openharmony
git config --global user.name "xxx"
git config --global user.email "xxx@xxx.com"
git config --global credential.helper store
~/bin/repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
#输出
Your identity is: xxx <xxx@xxx.com>
If you want to change this, please re-run 'repo init' with --config-name

Testing colorized output (for 'repo diff', 'repo status'):
  black    red      green    yellow   blue     magenta   cyan     white
  bold     dim      ul       reverse
Enable color display in this user account (y/N)? y

repo has been initialized in /home/openharmony

开始下载~

#命令
~/bin/repo sync -c
~/bin/repo forall -c 'git lfs pull'
#输出
remote: xxxx done.
fetching: Receiving objects: 100% (13984/13984), 4.84 MiB | 717.00 KiB/s, done.
#整个过程比较久也比较耗费流量,因为所有代码可能有几十个GB

不管是用Docker还是自己用Ubuntu系统做编译,拿到源码之后最好就是先安装一下“hb”工具(可选操作,这个工具只是帮助你设置环境或者清理编译产生的垃圾):

python3 -m pip install --user build/hb
#安装成功之后,试一下这个命令看看有没有帮助信息
hb set -h
#提示这个代表安装完成
usage: hb set [option]

optional arguments:
  -h, --help            show this help message and exit
  -p PRODUCT_NAME, --product-name PRODUCT_NAME
                        Default:''. Help:build a specified product. You could use this option like this: 1.'hb set
                        --product-name rk3568@hihope' 2.'hb set --product-name rk3568' 3.'hb set'[graphical ui]
  --all [ALL]           Default:False. Help:Use a graphical interface to customize most compile-time parameters

最好检查和安装下面这些库,以免编译过程出现错误

#如果Linux编译环境使用的是Python3.8以上的版本,建议安装一下这些库
pip install genconfig
#编译用到的库
sudo apt install flex bison ruby

然后我们还是在docker的命令行里面,不要移开,用自带的build.sh来编译(建议,因为官方一些问题反馈和修复都在这个build.sh里面,它能自动检查各种环境和SDK的安装状况,自动执行一些脚本),比如我这里选择编译linux内核版本的系统,命令如下

./build.sh --product-name qemu-x86_64-linux-min --ccache

错误处理

1.遇到提示子系统名称错误

Reason:      subsystem name config incorrect in '/home/openharmony/device/qemu/x86_64_virt/linux/ohos.build', build file subsystem name is device_x86_64_virt,configured subsystem name is device_qemu-x86_64-linux.

这个错误表明在 OpenHarmony 的构建过程中,ohos.build 文件中配置的子系统名称与实际的构建文件子系统名称不匹配。具体来说,ohos.build 文件中配置的子系统名称是 device_qemu-x86_64-linux,而构建文件中定义的子系统名称是 device_x86_64_virt

以下是解决这个问题的步骤:

检查 ohos.build 文件

打开 /home/openharmony/device/qemu/x86_64_virt/linux/ohos.build 文件,找到其中定义的子系统名称。例如:

{
  "subsystem": "device_x86_64_virt",
  ...
}

改成对应提示的名称就行

{
  "subsystem": "device_qemu-x86_64-linux",
  ...
}

2.找不到jffs2文件系统的错误


Returned 127.

stderr:



/bin/sh: 1: pushd: not found



See //kernel/liteos_a/fs/BUILD.gn:36:5: which caused the file to be included.

    "jffs2",

    ^------

这个问题的主要原因是,当前运行脚本的工具是“dash”而不是“bash”,导致部分命令不支持

执行

$ sudo dpkg-reconfigure dash
#在弹出的界面选择“ No ”,他会自动设置bash作为默认

image-pVgG.png

3.不小心升级了pip工具之后,报出找不到main的问题

Traceback (most recent call last):
  File "/home/cody/.local/bin/genconfig", line 5, in <module>
    from genconfig import main
ImportError: cannot import name 'main' from 'genconfig' (/home/cody/.local/lib/python3.8/site-packages/genconfig/__init__.py)

网上很多人介绍是要改pip的代码,屁!我为了一点点错误改掉整个pip生态,有没有那么傻,只需要对应改genconfig的代码就行了

#从上面报的错误,得知问题在genconfig文件的第五行,
$ vim /home/cody/.local/bin/genconfig
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from genconfig import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

改出现了main的两行代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from genconfig import __main__ #这里改过
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(__main__.main()) #这里改过

(未完待续...)

Comment