summaryrefslogtreecommitdiffstats
path: root/code/projects/ohos_compile.html
blob: c9d240dd4d718e52e50aecd37766505e533a2012 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">

<head>
    <meta charset="utf-8" />
    <meta name="generator" content="pandoc" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
    <title>OHOS 全量编译记录</title>
    <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css">
    <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script>
</head>

<body>
    <div class="pandoc">
        <div class="main">
            <header id="title-block-header">
                <p class="title">OHOS 全量编译记录</p>
            </header>
            <!-- 鸿蒙开发环境搭建 -->
            <blockquote>
                <p>本次编译环境搭建参考了以下博客:</p>
                <ul>
                    <li><a
                            href="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">HiHope_DAYU200/开发环境搭建编译指南</a>
                    </li>
                    <li><a href="https://juejin.cn/post/7257553293889634363">基于 Ubuntu 20.04 配置 OpenHarmony 开发环境</a>
                    </li>
                    <li><a
                            href="https://blog.csdn.net/jwq1220/article/details/127303546?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127303546%22%2C%22source%22%3A%222401_82617925%22%7D&fromshare=blogdetail">OpenHarmony
                            源码编译步骤(基于 3.2 beta3)</a></li>
                    <li><a
                            href="https://unix.stackexchange.com/questions/616392/failed-load-btf-from-vmlinux-unknown-error-2make-makefile1162-vmlinu">FAILED:
                            load BTF from vmlinux: Unknown error -2</a></li>
                </ul>
            </blockquote>
            <h1 id="环境与依赖">环境与依赖</h1>
            <h2 id="硬件环境">硬件环境</h2>
            <p>编译过程使用的是
                <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code>
                均可用。</p>
            <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p>
            <ul>
                <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li>
                <li><strong>磁盘 160G 或以上</strong>
                    <ul>
                        <li>源码大小就 36G 左右了</li>
                        <li>大量的依赖会占据数十 G 的空间</li>
                        <li>我用的是 160G 磁盘,编译成功,但基本不剩什么空间了</li>
                    </ul>
                </li>
                <li>注意所需要的<strong>ohos 的版本、cpu 版本、位数等信息</strong></li>
            </ul>
            <p>这里我用的是 VMWare+Ubuntu22.04 虚拟机。</p>
            <h2 id="软件包依赖">软件包依赖</h2>
            <p>安装依赖在博客中都有讲,但<strong>少了一部分依赖项</strong>,我因而将所有必要的依赖项整理到一个脚本里了:</p>
            <pre><code class="language-bash">#!/bin/bash
set -e # 一旦出错立刻停止执行,不会执行后续指令

# 更新软件源
sudo apt update
sudo apt upgrade

# 官方博客说明的依赖项
sudo apt install binutils git git-lfs gnupg flex \
    bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib \
    libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \
    libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin \
    python3-pip ruby libtinfo-dev libtinfo5 \

# 官方博客未说明,但安装过程中报缺失的依赖项
sudo apt install openjdk-8-jdk libssl-dev libelf-dev default-jdk \
    genext2fs u-boot-tools mtd-utils scons gcc-arm-none-eabi \
    liblz4-tool

# 别的博客说明的依赖项
sudo apt install device-tree-compiler lib32stdc++6 lib32z1 libncurses5-dev lib32ncurses6

# 检查是否存在python3,如不存在则为之安装
if ! [ -x "$(command -v python3)" ]; then
    sudo apt install python3
fi
# 是否有python,如没有则建立软连接到python3的位置
if ! [ -x "$(command -v python)" ]; then
    sudo ln -s $(which python3) /usr/bin/python
fi</code></pre>
            <p>这里需要注意的是,<strong>如果安装过程中出现报错,在修改之后,必须重新执行整个脚本</strong>,因为在 apt 发现找不到某个软件包之后,后续的包与命令都不会执行。</p>
            <h1 id="配置-git">配置 git</h1>
            <h2 id="git-基础设置">git 基础设置</h2>
            <p>在上边我们已经下载了本次所需要的<code>git</code>与<code>git-lfs</code>,接下来我们需要对<code>git</code>进行基础设置。</p>
            <pre><code class="language-bash"># 设置用户名与密码,新用户必做
# 这里的用户名与密码只是一个写在git提交记录中的标识,可以与gitee/github账号无关
git config --global user.name "yourname"
git config --global user.email "your-email-address"
# git凭证缓存,必做
git config --global credential.helper store
# git默认的文本编辑器是nano,我一般喜欢改为vim,选做
git config --global core.editor vim</code></pre>
            <h2 id="gitee-帐户">gitee 帐户</h2>
            <p>由于 OpenHarmony 的源码托管在 gitee 上,所以我们需要在 gitee 上注册一个帐户。注册的方法在此不复赘述。</p>
            <p>本次编译过程中,我们并不需要提交代码,因而可以仅通过 http 方式从 gitee 下载源码——如果是这样的话,<strong>就不需要进行 git 与 gitee
                    关联</strong>;如果想要提交代码,那么需要将本地的 git 与 gitee 账号关联起来,具体操作如下:</p>
            <pre><code class="language-bash"># 在本地执行
ssh-keygen -t rsa -C "your-email-address"</code></pre>
            <p>命令执行后,每次需要输入都直接回车,<strong>连续有三个回车</strong>,执行就会结束,ssh
                密钥对的公钥和私钥分别保存在<code>~/.ssh/id_rsa.pub</code>和<code>~/.ssh/id_rsa</code>中。</p>
            <p>在 gitee 用户的设置界面,将公钥<code>id_rsa.pub</code>的内容复制到 gitee 的 SSH 公钥中,保存即可。</p>
            <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p>
            <h1 id="系统源码编译">系统源码编译</h1>
            <h2 id="配置-repo-工具">配置 repo 工具</h2>
            <pre><code class="language-bash">curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/repo
chmod a+x ~/repo
sudo mv ~/repo /usr/local/bin/repo
sudo chown root:root /usr/local/bin/repo

pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</code></pre>
            <p>需要注意的是,不能直接使用 sudo 搭配管道,这是因为<code>/usr/local/bin</code>是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root
                身份执行,但<strong>重定向时候 sudo 用的也是当前用户身份</strong>,权限不足,自然报错。(<strong>如果是管道,那么 sudo
                    也是只对当前命令有效,而不是对后续的整个管道有效。</strong>)</p>
            <h2 id="获取源码">获取源码</h2>
            <p>这里需要注意的是,一般情况下最好使用带有 v 和 Release 的版本。不带 Release 不是发布版,会随时更新代码,容易编译出错;带 Release 的也有两种 tag,是带 v 和不带 v
                的区别,如<code>OpenHarmony-v4.0-Release</code>和<code>OpenHarmony-4.0-Release</code>。二者的区别主要在于,不带 v
                的是官方维护的稳定版,也会更新代码,厂商的补丁一般只针对带 v 的使用。</p>
            <p>通过 repo + https/ssh 下载:</p>
            <pre><code class="language-bash"># 如果需要的是特定分支,-b后边改成对应分支名
# repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字,
# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下:
# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify
# 除使用https外,也可以通过ssh下载
# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v4.0-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'</code></pre>
            <h2 id="补丁与编译">补丁与编译</h2>
            <p>首先,打上厂商的补丁。下载对应版本补丁后,将补丁文件放到源码根目录下,执行:</p>
            <pre><code class="language-bash">unzip purple_pi_oh_patch.zip
cd purple_pi_oh_patch
./ido_patch.sh</code></pre>
            <p>看到<code>patch complete</code>字样,说明补丁成功。接下来进行 prebuilts 和编译:</p>
            <pre><code class="language-bash"># 先在源码根目录下执行脚本,安装编译器及二进制工具
bash build/prebuilts_download.sh

# 编译
# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能
# 如果是64位cpu,需要加上--target-cpu=arm64
# 编译rk3568时
# sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64
sudo ./build.sh --product-name purple_pi_oh --ccache --no-prebuilt-sdk --target-cpu=arm64</code></pre>
            <h2 id="编译完成">编译完成</h2>
            <p>编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的<code>out/rk3568/packages/phone/images</code>目录下。</p>
            <p>自此源码编译成功,即可进行镜像烧录。</p>
            <h1 id="编译报错解决记录">编译报错解决记录</h1>
            <p>以下记录编译过程中出现的一些出现过的报错、坑点和注意事项,以为后来者鉴。</p>
            <h2 id="ssh-下载源码报错">ssh 下载源码报错</h2>
            <p>在使用 ssh
                下载时,第一步<code>repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify</code>,报错:
            </p>
            <pre><code>Warning: Permanently added 'gitee.com,180.76.198.77' (ECDSA) to the list of known hosts.</code></pre>
            <p>经检查,发现 gitee 邮箱设置与公钥中邮箱存在差异,修改 gitee 邮箱设置后成功。</p>
            <h2 id="设备磁盘空间不足">设备磁盘空间不足</h2>
            <p>编译过程中异常终止,并显示“设备上没有空间”。</p>
            <p><strong>解决方法:</strong></p>
            <ul>
                <li>在<code>VMWare</code>中扩大磁盘空间
                    <ul>
                        <li><strong>关闭虚拟机</strong></li>
                        <li>在<code>VMWare</code>上方菜单栏中依次选择<code>虚拟机->设置->硬件->硬盘->扩展</code>,然后输入新的磁盘大小</li>
                        <li>点击确定后会提示,说需要在虚拟机中扩展分区,才能使用新的磁盘空间</li>
                    </ul>
                </li>
                <li>打开虚拟机,并扩展分区
                    <ul>
                        <li>在命令行中输入<code>sudo apt install gparted</code>,安装<code>gparted</code>分区工具</li>
                        <li>打开该工具,选择需要扩展的分区(一般为挂载到根目录<code>/</code>的那个分区),点击<code>Resize/Move</code>,然后拖动分区大小,点击<code>Resize/Move</code>,再点击<code>Apply</code>,等待分区扩展完成
                        </li>
                    </ul>
                </li>
            </ul>
            <p>如果在虚拟机里用 gparted 进行分区扩展时,弹窗说“分区被挂载为只读,无法调整大小”。此时我们需要:</p>
            <ul>
                <li>右键该分区,查看挂载到什么位置了。一般是挂载到<code>/</code>与<code>/var/snap/firefox/common/host-hunspell</code></li>
                <li>执行以下命令:</li>
            </ul>
            <pre><code class="language-bash"># 对于这个设备挂载到的每一个分区,都执行以下命令,以此类推
sudo mount -o remount -rw /
sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre>
            <p>而后在 gparted 中点击<code>gparted->刷新设备</code>,即可进行分区扩展。</p>
            <h2 id="ninja-编译报错-code-4000">Ninja 编译报错 <code>Code 4000</code></h2>
            <p>编译 rk3568 过程中可能会出现以下报错:</p>
            <pre><code class="language-plaintext">[OHOS ERROR] Code: 4000
[OHOS ERROR] Reason: ninja phase failed</code></pre>
            <p>详细的报错信息已经丢失,将就着看吧。反正别的办法都不好使的时候试试这个。</p>
            <p>此时执行以下内容即可:</p>
            <pre><code class="language-bash">rm -rf out
sed -i 's/CONFIG_DEBUG_INFO_BTF=y/# CONFIG_DEBUG_INFO_BTF=y/g' kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig</code></pre>
            <p>而后重新编译。</p>
            <h2 id="另一个code-4000">另一个<code>Code 4000</code></h2>
            <p>编译时报错如下:</p>
            <pre><code class="language-plaintext">ninja: build stopped: subcommand failed.
[OHOS ERROR] Traceback (most recent call last):
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 49, in _execute_ninja_cmd
[OHOS ERROR]     SystemUtil.exec_command(
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/util/system_util.py", line 63, in exec_command
[OHOS ERROR]     raise OHOSException(
[OHOS ERROR] exceptions.ohos_exception.OHOSException: Please check build log in /home/player/Desktop/ohos/src/out/purple_pi_oh/build.log
[OHOS ERROR]
[OHOS ERROR] During handling of the above exception, another exception occurred:
[OHOS ERROR]
[OHOS ERROR] Traceback (most recent call last):
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/containers/status.py", line 47, in wrapper
[OHOS ERROR]     return func(*args, **kwargs)
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py", line 67, in run
[OHOS ERROR]     raise exception
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py", line 65, in run
[OHOS ERROR]     super().run()
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/modules/interface/build_module_interface.py", line 72, in run
[OHOS ERROR]     raise exception
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/modules/interface/build_module_interface.py", line 70, in run
[OHOS ERROR]     self._target_compilation()
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/modules/ohos_build_module.py", line 103, in _target_compilation
[OHOS ERROR]     self.target_compiler.run()
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 38, in run
[OHOS ERROR]     self._execute_ninja_cmd()
[OHOS ERROR]   File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 52, in _execute_ninja_cmd
[OHOS ERROR]     raise OHOSException('ninja phase failed', '4000')
[OHOS ERROR] exceptions.ohos_exception.OHOSException: ninja phase failed
[OHOS ERROR]
[OHOS ERROR] Code:      4000
[OHOS ERROR]
[OHOS ERROR] Reason:    ninja phase failed
[OHOS ERROR]
[OHOS ERROR] Solution:  Please check the compile log at out/{compiling product}/build.log, If you could analyze build logs.
[OHOS ERROR]       Or you can try the following steps to solve this problem:
[OHOS ERROR]         1. cd to OHOS root path
[OHOS ERROR]         2. run 'hb clean --all' or 'rm -rf out build/resources/args/*.json'.
[OHOS ERROR]         3. repo sync
[OHOS ERROR]         4. repo forall -c 'git lfs pull'
[OHOS ERROR]         5. bash build/prebuilts_download.sh
[OHOS ERROR]         6. rebuild your product or component
[OHOS ERROR]
[OHOS ERROR]       If you still cannot solve this problem, you could post this problem on:
[OHOS ERROR]         https://gitee.com/openharmony/build/issues
[OHOS ERROR]</code></pre>
            <p>在报错信息之上,还有很多很多行,大致意思是正在对某些文件或仓库拉补丁,输出了补丁的 commit 信息。报错中最后提示的解决办法其实是无效的,我全量删除源码、甚至重装虚拟机,都还会遇到这个问题。</p>
            <p>仔细分析报错信息,发现报错的根本原因是在 python 中<strong>处理一个 Exception 时,又抛出了另一个
                    Exception,导致程序异常终止</strong>。上网搜索可知,这种问题的一般原因是 python
                同时拉取或爬取大量网页内容,但都失败了,导致同时出现两个异常,程序崩溃。具体到我们这里,问题就是拉补丁失败了,我检查了一下我的网络环境,发现我挂着梯子,梯子质量不是那么好。尝试将梯子关掉后,再次编译,问题解决。
            </p>
            <h2 id="一个奇怪的报错gn-failed">一个奇怪的报错——<code>GN Failed</code></h2>
            <p>这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。</p>
            <h3 id="问题描述与复现">问题描述与复现</h3>
            <p>问题复现方法为在编译过程中,执行以下命令:</p>
            <pre><code class="language-bash">./build.sh --product-name rk3568 --ccache</code></pre>
            <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p>
            <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_compile_gn_fail_1.png" /> <img
                    src="https://www.qin-juan-ge-zhu.top/images/code/ohos_compile_gn_fail_2.png" /></p>
            <p><strong>以下是该问题的具体描述:</strong></p>
            <p><code>build.log</code>如下:</p>
            <pre><code class="language-plaintext">Set cache size limit to 100.0 GB
[OHOS INFO] loader args:['platforms_config_file="/home/axiomer/桌面/out/preloader/ohos-sdk/platforms.build"', 'subsystem_config_file="/home/axiomer/桌面/out/preloader/ohos-sdk/subsystem_config.json"', 'example_subsystem_file=""', 'exclusion_modules_config_file="/home/axiomer/桌面/out/preloader/ohos-sdk/exclusion_modules.json"', 'source_root_dir="/home/axiomer/桌面/"', 'gn_root_out_dir="out/sdk"', 'build_platform_name=phone', 'build_xts=False', 'load_test_config=False', 'target_os=ohos', 'target_cpu=arm64', 'os_level=standard', "ignore_api_check=['xts', 'common', 'testfwk']", 'scalable_build=False', 'skip_partlist_check=False']
[OHOS INFO] Excuting gn command: /home/axiomer/桌面/prebuilts/build-tools/linux-x86/bin/gn gen --args="product_name=\"ohos-sdk\" product_path=\"/home/axiomer/桌面/productdefine/common/products\" product_config_path=\"/home/axiomer/桌面/productdefine/common/products\" device_name=\"sdk\" device_path=\"/home/axiomer/桌面/device/board/ohos/sdk\" device_company=\"ohos\" device_config_path=\"/home/axiomer/桌面/device/board/ohos/sdk\" target_cpu=\"arm64\" is_standard_system=true ohos_build_compiler_specified=\"\" ohos_build_time=1707374188101 ohos_build_datetime=\"2024-02-08 22:36:28\" build_ohos_sdk=true build_ohos_ndk=true ohos_build_enable_ccache=true ohos_build_type=\"debug\" device_type=\"default\" build_variant=\"root\" use_thin_lto=false ndk_platform=\"linux\" sdk_for_hap_build=true skip_generate_module_list_file=true enable_lto_O0=true archive_ndk=false enable_ndk_doxygen=false use_cfi=false sdk_check_flag=false sdk_platform=\"linux\" root_perf_main=\"main\" runtime_mode=\"release\"" --args=product_name="ohos-sdk" product_path="/home/axiomer/桌面/productdefine/common/products" product_config_path="/home/axiomer/桌面/productdefine/common/products" device_name="sdk" device_path="/home/axiomer/桌面/device/board/ohos/sdk" device_company="ohos" device_config_path="/home/axiomer/桌面/device/board/ohos/sdk" target_cpu="arm64" is_standard_system=true ohos_build_compiler_specified="" ohos_build_time=1707374188101 ohos_build_datetime="2024-02-08 22:36:28" build_ohos_sdk=true build_ohos_ndk=true ohos_build_enable_ccache=true ohos_build_type="debug" device_type="default" build_variant="root" use_thin_lto=false ndk_platform="linux" sdk_for_hap_build=true skip_generate_module_list_file=true enable_lto_O0=true archive_ndk=false enable_ndk_doxygen=false use_cfi=false sdk_check_flag=false sdk_platform="linux" root_perf_main="main" runtime_mode="release" /home/axiomer/桌面/out/sdk
ERROR at //build/config/BUILDCONFIG.gn:92:15: Could not read file.
    read_file("${preloader_output_dir}/build_config.json", "json")
              ^------------------------------------------
I resolved this to "/home/axiomer/桌面/out/preloader/build_config.json".
root_out_dir=//out/sdk
root_build_dir=//out/sdk
root_gen_dir=//out/sdk/gen
current_toolchain=
[91m[OHOS ERROR][0m Traceback (most recent call last):
[91m[OHOS ERROR][0m   File "/home/axiomer/桌面/build/hb/containers/status.py", line 47, in wrapper
[91m[OHOS ERROR][0m     return func(*args, **kwargs)
[91m[OHOS ERROR][0m   File "/home/axiomer/桌面/build/hb/services/gn.py", line 197, in _execute_gn_gen_cmd
[91m[OHOS ERROR][0m     SystemUtil.exec_command(gn_gen_cmd, self.config.log_path)
[91m[OHOS ERROR][0m   File "/home/axiomer/桌面/build/hb/util/system_util.py", line 64, in exec_command
[91m[OHOS ERROR][0m     LogUtil.get_failed_log(log_path)
[91m[OHOS ERROR][0m   File "/home/axiomer/桌面/build/hb/util/log_util.py", line 191, in get_failed_log
[91m[OHOS ERROR][0m     LogUtil.get_gn_failed_log(log_path)
[91m[OHOS ERROR][0m   File "/home/axiomer/桌面/build/hb/util/log_util.py", line 137, in get_gn_failed_log
[91m[OHOS ERROR][0m     raise OHOSException(
[91m[OHOS ERROR][0m exceptions.ohos_exception.OHOSException: GN Failed! Please check error in /home/axiomer/桌面/out/sdk/error.log, and for more build information in /home/axiomer/桌面/out/sdk/build.log
[91m[OHOS ERROR][0m
[91m[OHOS ERROR][0m Code:        3000
[91m[OHOS ERROR][0m
[91m[OHOS ERROR][0m Reason:      GN Failed! Please check error in /home/axiomer/桌面/out/sdk/error.log, and for more build information in /home/axiomer/桌面/out/sdk/build.log
[91m[OHOS ERROR][0m
[91m[OHOS ERROR][0m Error Type:  UNKNOWN
[91m[OHOS ERROR][0m
[91m[OHOS ERROR][0m Description: An unknown error occurred while executing 'gn gen'.
[91m[OHOS ERROR][0m
[91m[OHOS ERROR][0m Solution:    There is no solution available. You can check the 'gn_error.log' in the output directory for more information
[91m[OHOS ERROR][0m</code></pre>
            <p>报错信息中提到<code>ERROR at //build/config/BUILDCONFIG.gn:92:15: Could not read file.</code>,但是经过检查文件,<strong>存在名为<code>BUILDCONFIG.gn</code>的文件,且开放可读权限</strong>;但报错信息中显示无法读该文件。
            </p>
            <h3 id="失败尝试">失败尝试</h3>
            <p>在此,我进行了许多尝试,但都无一例外失败了;以下是我的尝试点,或许会有帮助:</p>
            <ul>
                <li>根据<a href="">一个相似提问</a>,对相关依赖进行安装,失败了: <img
                        src="https://www.qin-juan-ge-zhu.top/images/code/ohos_compile_gn_fail_dependencies.png" /></li>
                <li>根据报错信息,在编译命令中添加<code>--no-prebuilt-sdk</code>选项对 ohos-sdk 的构建进行跳过,依然失败</li>
            </ul>
            <p>尝试未果 T^T</p>
            <h3 id="最终方案">最终方案</h3>
            <p>报错信息如下所示:</p>
            <p>在上述报错信息中提到<code>Permission denied</code>,即权限不够;于是尝试添加<code>sudo</code>,居然跑通了!!!!</p>
            <p>在指导书的编译指令<code>./build.sh --product-name rk3568 --ccache</code>前添加权限设置<code>sudo</code>,即指令更改为:</p>
            <pre><code class="language-bash">sudo ./build.sh --product-name rk3568 --ccache</code></pre>
            <p>不知道为什么,编译过程中始终没有向我提出权限要求,但是不加<code>sudo</code>开权限就是跑不通,很奇怪 @ _ <span class="citation"
                    data-cites="也许是">@也许是</span> OHOS 内敛不好意思申请权限呢……</p>
            <h2 id="另一个奇怪的报错failed-load-btf-from-vmlinux-unknown-error--22">
                另一个奇怪的报错——<code>FAILED: load BTF from vmlinux: Unknown error -22</code></h2>
            <p>关于这个报错,当时的错误日志、运行日志、聊天截图均已丢失,但时日不久,记忆还算清楚,加上这个报错困扰了我好些天,因而必须记录。</p>
            <h3 id="问题简要描述">问题简要描述</h3>
            <p>正常按照<code>sudo ./build.sh --product-name rk3568 --ccache</code>编译时,报错,主要报错信息如下:</p>
            <pre><code class="language-plaintext">die__process_unit: DW_TAG_label (0xa) @ <0x3adc> not handled!
die__process_unit: DW_TAG_label (0xa) @ <0x3bdc> not handled!
die__process_unit: DW_TAG_label (0xa) @ <0x3bef> not handled!
die__process_unit: DW_TAG_label (0xa) @ <0x3ce5> not handled!
die__process_unit: DW_TAG_label (0xa) @ <0x3cff> not handled!
die__process_unit: DW_TAG_label (0xa) @ <0x3d19> not handled!
Killed
  LD      .tmp_vmlinux.kallsyms1
  KSYMS   .tmp_vmlinux.kallsyms1.S
  AS      .tmp_vmlinux.kallsyms1.S
  LD      .tmp_vmlinux.kallsyms2
  KSYMS   .tmp_vmlinux.kallsyms2.S
  AS      .tmp_vmlinux.kallsyms2.S
  LD      ymlinux
  BTEIDS  vmlinux
FAILED: load BTF from vmlinux: Unknown error -22make[2]: *** [/home/player/harmony/out/kernel/src_tmp/linux-5.19/
Makefile:1225: vmlinux]错误 255
make[1]: *** [arch/arm64/Makefile:208: rk3568-toybrick-x0-linux.img]错误2
make[1]: 离开目录"/home/player/harmony/out/kernel/OBJ/linux-5.10"
make: *** [Makefile:192:__sub-make]错误 2</code></pre>
            <p>可以看到,报错的关键点在于<code>FAILED: load BTF from vmlinux: Unknown error -22</code>这里。查看 Makefile 对应报错位置:</p>
            <pre><code class="language-makefile">vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
    +$(call if_changed,link-vmlinux)

targets := vmlinux</code></pre>
            <h3 id="解释">解释</h3>
            <ul>
                <li>这段 makefile 的实际功能是链接一个虚拟 linux
                    <ul>
                        <li>通过目录位置,我们可以合理猜测,这里是在进行<strong>linux 内核编译,但失败了</strong></li>
                    </ul>
                </li>
                <li>报错中说的<code>BTF</code>则是数据格式
                    <ul>
                        <li>一般出现<code>load BTF from xxx</code>错误时,是由于系统不一致导致的(也就是不同系统 BTF 格式不一样,出现了识别错误)</li>
                    </ul>
                </li>
                <li>最重要的是,<strong>Unknown error -22 这个报错码,搜不到任何信息!</strong></li>
            </ul>
            <p>因而,我尝试了重装系统,将我的 Ubuntu22.04 重装为 20.04,但最后<strong>仍然会出现这个错误</strong>,足以证明不是系统差异导致的。</p>
            <h3 id="解决">解决</h3>
            <p>最终,我在<a
                    href="https://unix.stackexchange.com/questions/616392/failed-load-btf-from-vmlinux-unknown-error-2make-makefile1162-vmlinu">第二篇参考博客</a>里找到了答案:编译较新的
                Linux 内核时,至少需要 10G+内存,而我一贯把虚拟机内存只设置为 8G。</p>
            <p>令人好奇的是,为什么需要这么大内存?按理来说在虚拟内存空间里,物理内存不够的时候,不应该是由 OS 出面进行内存与磁盘的页面调度吗?我认为,可能是在编译过程中,其他进程占据一部分内存,而这里在链接一个虚拟
                linux 文件,可能文件体积过大而尚未创建完成,所有页面一直驻留在内存中,导致内存崩溃。</p>
            <p>总而言之,言而总之,在<code>VMware->虚拟机->设置->硬件->内存</code>中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G
                时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。</p>
            <h1 id="ohos-的-ndk">ohos 的 NDK</h1>
            <p>NDK 编译方式比较简单,在源码根目录下执行如下命令:</p>
            <pre><code class="language-bash"># 安装依赖
./build/build_scripts/env_setup.sh

# 执行完上述命令后记得执行source ~/.bashrc或者重启终端
source ~/.bashrc

# 安装编译SDK需要的依赖包(编译镜像的时候是不依赖这些包的)
sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev

./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk</code></pre>
            <p>编译出来的 NDK 在<code>out/sdk/packages/ohos-sdk/linux/native</code>下。当然同时也有 windows 版本的 NDK,你猜在哪里?</p>
            <p>将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。</p>
            <p>注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK
                还未我们提供编译所需的全套服务,如编译工具链配置文件<code>ohos.toolchain.cmake</code>、头文件、库文件等。快说,谢谢 ohos~</p>
            <p>为了更方便地使用 NDK,鄙人不才,写了两个脚本,分别用于 cmake 编译和单文件编译:</p>
            <pre><code class="language-bash">#!/bin/bash

#######################################################################
# File Name    : compile.sh
# Encoding     : utf-8
# Author       : We-unite
# Email        : weunite1848@gmail.com
# Created Time : 2024-11-18 15:19:15
#######################################################################

set -e

if [ $UID -eq 0 ]; then
    echo "Please do not run this script as root"
    exit 1
fi

if [ $# -ne 2 ]; then
    echo "Usage: $0 <static|shared> <v7|v8>"
    exit 1
fi

if [ $2 == "v8" ]; then
    arch=arm64-v8a
elif [ $2 == "v7" ]; then
    arch=armeabi-v7a
else
    echo "Invalid architecture: $2"
    exit 1
fi

link=$1 # static or shared
native_path=~/app/native

export PATH=$native_path/build-tools/cmake/bin:$PATH

# 使用cmake编译,编译生成的文件运行在rk3568上
cmake -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)
cmake --build build</code></pre>
            <pre><code class="language-bash">#!/bin/bash

#######################################################################
# File Name    : compile-tiny.sh
# Encoding     : utf-8
# Author       : We-unite
# Email        : weunite1848@gmail.com
# Created Time : 2024-11-16 13:06:58
#######################################################################

set -e
# 如果是root,报错
if [ $(id -u) -eq 0 ]; then
    echo "Do not run as root"
    exit 1
fi

if [ $# -ne 2 ]; then
    echo "Usage: $0 <src file> [armv8-a|armv7-a]"
    exit 1
fi

native=~/app/native
file=$1
targetFile=${file%.*}
arch=$2

case $arch in
    armv8-a)
        compiler=$native/llvm/bin/aarch64-unknown-linux-ohos
        targetPlatform=aarch64-linux-ohos
        ;;
    armv7-a)
        compiler=$native/llvm/bin/armv7-unknown-linux-ohos
        targetPlatform=arm-linux-ohos
        ;;
    *)
        echo "Unsupported arch"
        exit 1
        ;;
esac

case ${file##*.} in
    c)
        compiler=$compiler-clang
        ;;
    cpp)
        compiler=$compiler-clang++
        ;;
    *)
        echo "Unsupported file type"
        exit 1
        ;;
esac

export CPATH=

$compiler -o $targetFile $file -Wall \
    --target=$targetPlatform \
    --sysroot=$native/sysroot \
    -march=$arch -mfloat-abi=softfp</code></pre>
            <h1 id="完结撒花">完结撒花</h1>
            <p>本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:</p>
            <ul>
                <li><strong>有报错,试试添加权限!</strong></li>
                <li>贫贱程序猿百事哀,编译 OpenHarmony 系统需要<strong>足够的硬件配置</strong>
                    <ul>
                        <li>内存 10G+</li>
                        <li>磁盘 160G+</li>
                    </ul>
                </li>
            </ul>
            <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p>
            <p class="time">2024.2.12,甲辰年正月初三<br>2024.4.24改<br>2024.11.19改</p>
            <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script>
        </div>
    </div>
</body>

</html>