summaryrefslogtreecommitdiffstats
path: root/code/projects/ohos_compile.md
diff options
context:
space:
mode:
Diffstat (limited to 'code/projects/ohos_compile.md')
-rw-r--r--code/projects/ohos_compile.md194
1 files changed, 170 insertions, 24 deletions
diff --git a/code/projects/ohos_compile.md b/code/projects/ohos_compile.md
index 150ee25..4672027 100644
--- a/code/projects/ohos_compile.md
+++ b/code/projects/ohos_compile.md
@@ -1,7 +1,5 @@
1<!-- 鸿蒙开发环境搭建 --> 1<!-- 鸿蒙开发环境搭建 -->
2 2
3[toc]
4
5> 本次编译环境搭建参考了以下博客: 3> 本次编译环境搭建参考了以下博客:
6> 4>
7> - [HiHope_DAYU200/开发环境搭建编译指南](https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E7%BC%96%E8%AF%91%E6%8C%87%E5%8D%97.md) 5> - [HiHope_DAYU200/开发环境搭建编译指南](https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E7%BC%96%E8%AF%91%E6%8C%87%E5%8D%97.md)
@@ -103,49 +101,58 @@ ssh-keygen -t rsa -C "your-email-address"
103 101
104## 配置 repo 工具 102## 配置 repo 工具
105 103
106**注意:前两条命令需要以 root 身份执行!!!**
107
108```bash 104```bash
109# 以下两条命令需要以root身份执行 105curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/repo
110sudo -s 106chmod a+x ~/repo
111curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo 107sudo mv ~/repo /usr/local/bin/repo
112chmod a+x /usr/local/bin/repo 108sudo chown root:root /usr/local/bin/repo
113exit
114 109
115# 这条普通身份也可以
116pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests 110pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
117``` 111```
118 112
119之所以前两条命令需要以 root 身份而不能是 sudo,是因为`/usr/local/bin`是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 身份执行,但**重定向时候 sudo 用的也是当前用户身份**,权限不足,自然报错。(**如果是管道,那么 sudo 也是只对当前命令有效,而不是对后续的整个管道有效。**) 113需要注意的是,不能直接使用 sudo 搭配管道,这是因为`/usr/local/bin`是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 身份执行,但**重定向时候 sudo 用的也是当前用户身份**,权限不足,自然报错。(**如果是管道,那么 sudo 也是只对当前命令有效,而不是对后续的整个管道有效。**)
120 114
121## 获取源码 115## 获取源码
122 116
117这里需要注意的是,一般情况下最好使用带有 v 和 Release 的版本。不带 Release 不是发布版,会随时更新代码,容易编译出错;带 Release 的也有两种 tag,是带 v 和不带 v 的区别,如`OpenHarmony-v4.0-Release`和`OpenHarmony-4.0-Release`。二者的区别主要在于,不带 v 的是官方维护的稳定版,也会更新代码,厂商的补丁一般只针对带 v 的使用。
118
123通过 repo + https/ssh 下载: 119通过 repo + https/ssh 下载:
124 120
125```bash 121```bash
126# 通过http下载,这里需要注意你需要的ohos的版本
127repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
128# 如果需要的是特定分支,-b后边改成对应分支名 122# 如果需要的是特定分支,-b后边改成对应分支名
123# repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
129# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字, 124# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字,
130# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下: 125# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下:
131# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify 126# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify
132# 除使用https外,也可以通过ssh下载 127# 除使用https外,也可以通过ssh下载
133# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify 128# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
134 129repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v4.0-Release --no-repo-verify
135repo sync -c 130repo sync -c
136repo forall -c 'git lfs pull' 131repo forall -c 'git lfs pull'
137``` 132```
138 133
139## prebuilts 与编译 134## 补丁与编译
135
136首先,打上厂商的补丁。下载对应版本补丁后,将补丁文件放到源码根目录下,执行:
137
138```bash
139unzip purple_pi_oh_patch.zip
140cd purple_pi_oh_patch
141./ido_patch.sh
142```
143
144看到`patch complete`字样,说明补丁成功。接下来进行 prebuilts 和编译:
140 145
141```bash 146```bash
142# 先在源码根目录下执行脚本,安装编译器及二进制工具 147# 先在源码根目录下执行脚本,安装编译器及二进制工具
143bash build/prebuilts_download.sh 148bash build/prebuilts_download.sh
144# 再执行如下命令进行版本编译 149
150# 编译
145# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能 151# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能
146sudo ./build.sh --product-name rk3568 --ccache
147# 如果是64位cpu,需要加上--target-cpu=arm64 152# 如果是64位cpu,需要加上--target-cpu=arm64
148sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64 153# 编译rk3568时
154# sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64
155sudo ./build.sh --product-name purple_pi_oh --ccache --no-prebuilt-sdk --target-cpu=arm64
149``` 156```
150 157
151## 编译完成 158## 编译完成
@@ -195,6 +202,82 @@ sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell
195 202
196而后在 gparted 中点击`gparted->刷新设备`,即可进行分区扩展。 203而后在 gparted 中点击`gparted->刷新设备`,即可进行分区扩展。
197 204
205## Ninja 编译报错 `Code 4000`
206
207编译 rk3568 过程中可能会出现以下报错:
208
209```plaintext
210[OHOS ERROR] Code: 4000
211[OHOS ERROR] Reason: ninja phase failed
212```
213
214详细的报错信息已经丢失,将就着看吧。反正别的办法都不好使的时候试试这个。
215
216此时执行以下内容即可:
217
218```bash
219rm -rf out
220sed -i 's/CONFIG_DEBUG_INFO_BTF=y/# CONFIG_DEBUG_INFO_BTF=y/g' kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig
221```
222
223而后重新编译。
224
225## 另一个`Code 4000`
226
227编译时报错如下:
228
229```plaintext
230ninja: build stopped: subcommand failed.
231[OHOS ERROR] Traceback (most recent call last):
232[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 49, in _execute_ninja_cmd
233[OHOS ERROR] SystemUtil.exec_command(
234[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/util/system_util.py", line 63, in exec_command
235[OHOS ERROR] raise OHOSException(
236[OHOS ERROR] exceptions.ohos_exception.OHOSException: Please check build log in /home/player/Desktop/ohos/src/out/purple_pi_oh/build.log
237[OHOS ERROR]
238[OHOS ERROR] During handling of the above exception, another exception occurred:
239[OHOS ERROR]
240[OHOS ERROR] Traceback (most recent call last):
241[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/containers/status.py", line 47, in wrapper
242[OHOS ERROR] return func(*args, **kwargs)
243[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py", line 67, in run
244[OHOS ERROR] raise exception
245[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py", line 65, in run
246[OHOS ERROR] super().run()
247[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/modules/interface/build_module_interface.py", line 72, in run
248[OHOS ERROR] raise exception
249[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/modules/interface/build_module_interface.py", line 70, in run
250[OHOS ERROR] self._target_compilation()
251[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py", line 103, in _target_compilation
252[OHOS ERROR] self.target_compiler.run()
253[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 38, in run
254[OHOS ERROR] self._execute_ninja_cmd()
255[OHOS ERROR] File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 52, in _execute_ninja_cmd
256[OHOS ERROR] raise OHOSException('ninja phase failed', '4000')
257[OHOS ERROR] exceptions.ohos_exception.OHOSException: ninja phase failed
258[OHOS ERROR]
259[OHOS ERROR] Code: 4000
260[OHOS ERROR]
261[OHOS ERROR] Reason: ninja phase failed
262[OHOS ERROR]
263[OHOS ERROR] Solution: Please check the compile log at out/{compiling product}/build.log, If you could analyze build logs.
264[OHOS ERROR] Or you can try the following steps to solve this problem:
265[OHOS ERROR] 1. cd to OHOS root path
266[OHOS ERROR] 2. run 'hb clean --all' or 'rm -rf out build/resources/args/*.json'.
267[OHOS ERROR] 3. repo sync
268[OHOS ERROR] 4. repo forall -c 'git lfs pull'
269[OHOS ERROR] 5. bash build/prebuilts_download.sh
270[OHOS ERROR] 6. rebuild your product or component
271[OHOS ERROR]
272[OHOS ERROR] If you still cannot solve this problem, you could post this problem on:
273[OHOS ERROR] https://gitee.com/openharmony/build/issues
274[OHOS ERROR]
275```
276
277在报错信息之上,还有很多很多行,大致意思是正在对某些文件或仓库拉补丁,输出了补丁的 commit 信息。报错中最后提示的解决办法其实是无效的,我全量删除源码、甚至重装虚拟机,都还会遇到这个问题。
278
279仔细分析报错信息,发现报错的根本原因是在 python 中**处理一个 Exception 时,又抛出了另一个 Exception,导致程序异常终止**。上网搜索可知,这种问题的一般原因是 python 同时拉取或爬取大量网页内容,但都失败了,导致同时出现两个异常,程序崩溃。具体到我们这里,问题就是拉补丁失败了,我检查了一下我的网络环境,发现我挂着梯子,梯子质量不是那么好。尝试将梯子关掉后,再次编译,问题解决。
280
198## 一个奇怪的报错——`GN Failed` 281## 一个奇怪的报错——`GN Failed`
199 282
200这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。 283这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。
@@ -361,18 +444,18 @@ sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev
361 444
362注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK 还未我们提供编译所需的全套服务,如编译工具链配置文件`ohos.toolchain.cmake`、头文件、库文件等。快说,谢谢 ohos~ 445注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK 还未我们提供编译所需的全套服务,如编译工具链配置文件`ohos.toolchain.cmake`、头文件、库文件等。快说,谢谢 ohos~
363 446
364为了更方便地使用NDK,鄙人不才,写了两个脚本,分别用于cmake编译和单文件编译: 447为了更方便地使用 NDK,鄙人不才,写了两个脚本,分别用于 cmake 编译和单文件编译:
365 448
366```bash 449```bash
367#!/bin/bash 450#!/bin/bash
368 451
369########################################################################## 452#######################################################################
370# File Name : compile.sh 453# File Name : compile.sh
371# Encoding : utf-8 454# Encoding : utf-8
372# Author : We-unite 455# Author : We-unite
373# Email : weunite1848@gmail.com 456# Email : weunite1848@gmail.com
374# Created Time : 2024-02-29 15:19:15 457# Created Time : 2024-11-18 15:19:15
375########################################################################## 458#######################################################################
376 459
377set -e 460set -e
378 461
@@ -401,11 +484,74 @@ native_path=~/app/native
401export PATH=$native_path/build-tools/cmake/bin:$PATH 484export PATH=$native_path/build-tools/cmake/bin:$PATH
402 485
403# 使用cmake编译,编译生成的文件运行在rk3568上 486# 使用cmake编译,编译生成的文件运行在rk3568上
404cmake -B build -D OHOS_STL=c++_$link -D OHOS_ARCH=$arch -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=$(find $native_path -name ohos.toolchain.cmake) 487cmake -B build -D OHOS_STL=c++_$link -D OHOS_ARCH=$arch \
488 -D OHOS_PLATFORM=OHOS \
489 -D CMAKE_TOOLCHAIN_FILE=$(find $native_path -name ohos.toolchain.cmake)
405cmake --build build 490cmake --build build
406``` 491```
407 492
408```bash 493```bash
494#!/bin/bash
495
496#######################################################################
497# File Name : compile-tiny.sh
498# Encoding : utf-8
499# Author : We-unite
500# Email : weunite1848@gmail.com
501# Created Time : 2024-11-16 13:06:58
502#######################################################################
503
504set -e
505# 如果是root,报错
506if [ $(id -u) -eq 0 ]; then
507 echo "Do not run as root"
508 exit 1
509fi
510
511if [ $# -ne 2 ]; then
512 echo "Usage: $0 <src file> [armv8-a|armv7-a]"
513 exit 1
514fi
515
516native=~/app/native
517file=$1
518targetFile=${file%.*}
519arch=$2
520
521case $arch in
522 armv8-a)
523 compiler=$native/llvm/bin/aarch64-unknown-linux-ohos
524 targetPlatform=aarch64-linux-ohos
525 ;;
526 armv7-a)
527 compiler=$native/llvm/bin/armv7-unknown-linux-ohos
528 targetPlatform=arm-linux-ohos
529 ;;
530 *)
531 echo "Unsupported arch"
532 exit 1
533 ;;
534esac
535
536case ${file##*.} in
537 c)
538 compiler=$compiler-clang
539 ;;
540 cpp)
541 compiler=$compiler-clang++
542 ;;
543 *)
544 echo "Unsupported file type"
545 exit 1
546 ;;
547esac
548
549export CPATH=
550
551$compiler -o $targetFile $file -Wall \
552 --target=$targetPlatform \
553 --sysroot=$native/sysroot \
554 -march=$arch -mfloat-abi=softfp
409``` 555```
410 556
411# 完结撒花 557# 完结撒花
@@ -417,4 +563,4 @@ cmake --build build
417 - 内存 10G+ 563 - 内存 10G+
418 - 磁盘 160G+ 564 - 磁盘 160G+
419 565
420不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了…… \ No newline at end of file 566不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……