Tabla de contenido
Prefacio
El enlace original de este artículo es:
https://blog.csdn.net/freewebsys/article/details/108621002
[Clasificación del sistema Hongmeng]:
http://blog.csdn.net/freewebsys/article/category/10390587
[Dirección del proyecto Gitee]:
https://gitee.com/studyharmony/linux-build
No se permite la reimpresión sin el permiso del blogger.
La dirección del bloguero es: http://blog.csdn.net/freewebsys
1. Acerca del sistema Hongmeng
OpenHarmony es un proyecto de código abierto bajo la Fundación OpenAtom (OpenAtom Foundation) y se posiciona como un sistema operativo distribuido de código abierto para todos los escenarios.
Basado en la capacidad del sistema tradicional de un solo dispositivo, OpenHarmony presenta de manera creativa el concepto de adaptarse a múltiples formas de terminales basadas en la misma capacidad del sistema, y admite la operación en múltiples dispositivos terminales.La primera versión es compatible con dispositivos 128K-128M. , Bienvenido a unirse a la comunidad de código abierto y seguir evolucionando.
Para los desarrolladores de dispositivos, OpenHarmony adopta un esquema de diseño en componentes, que se puede adaptar de manera flexible de acuerdo con las capacidades de recursos y las características comerciales del dispositivo para cumplir con los requisitos de diferentes tipos de dispositivos terminales para el sistema operativo. Puede ejecutarse en dispositivos con recursos limitados y dispositivos portátiles en el nivel 100K, y también puede ejecutarse en dispositivos relativamente ricos en recursos, como cámaras domésticas inteligentes / grabadoras de unidades en el nivel 100M.
2. Escriba Dockerfile de acuerdo con el documento
Configurar el entorno es el primer paso.
Creo que deberíamos dar un Dockerfile oficial para que podamos descargar el espejo directamente.
https://gitee.com/studyharmony/linux-build/blob/master/Dockerfile
# 构建命令:
# docker build -t openharmony:dev .
#使用 ubuntu:18.04 做基础镜像减少大小。
# 然后安装构建鸿蒙系统需要的软件
FROM docker.io/ubuntu:18.04
# https://developer.aliyun.com/mirror/
# https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b115c0SRA
# 使用阿里云镜像地址。修改debian apt 更新地址,pip 地址,设置时区。
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse\n\
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse\n\
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse\n\
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse\n\
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse\n\
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse\n" > /etc/apt/sources.list && \
echo "[global]\n\
trusted-host=mirrors.aliyun.com\n\
index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 按照官方的方法继续软件安装:
# https://openharmony.gitee.com/openharmony/docs/blob/master/quick-start/%E6%90%AD%E5%BB%BA%E7%8E%AF%E5%A2%83-0.md
# 将Linux shell改为bash
RUN apt update && apt-get install -y curl && rm -rf /bin/sh && ln -s /bin/bash /bin/sh
# 这个是很少变的,放到前面
# 安装gn && 安装ninja && 安装LLVM编译工具链 && 安装hc-gen
RUN cd /opt && curl -O https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar && \
tar -xf gn.1523.tar -C /opt/ && rm -f gn.1523.tar
RUN cd /opt && curl -O https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar && \
tar -xf ninja.1.9.0.tar -C /opt/ && rm -f ninja.1.9.0.tar
# 724M 这个好大,每次都要下载好一会
RUN cd /opt && curl -O https://repo.huaweicloud.com/harmonyos/compiler/clang/9.0.0-34042/linux/llvm-linux-9.0.0-34042.tar && \
tar -xf llvm-linux-9.0.0-34042.tar -C /opt/ && rm -f llvm-linux-9.0.0-34042.tar
RUN cd /opt && curl -O https://repo.huaweicloud.com/harmonyos/compiler/hc-gen/0.65/linux/hc-gen-0.65-linux.tar && \
tar -xf hc-gen-0.65-linux.tar -C /opt/ && rm -f hc-gen-0.65-linux.tar
#安装gcc_riscv32 109M。
RUN cd /opt && curl -O https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz && \
tar -xf gcc_riscv32-linux-7.3.0.tar.gz -C /opt/ && rm -f gcc_riscv32-linux-7.3.0.tar.gz
#增加语言utf-8
ENV LANG=zh_CN.UTF-8
ENV LC_CTYPE=zh_CN.UTF-8
# llvm 和其他路径不一样。
RUN echo "export PATH=/opt/gn:/opt/ninja:/opt/llvm/bin:/opt/hc-gen:/opt/gcc_riscv32/bin:$PATH" >> /root/.bashrc
# 安装Python环境
RUN apt-get install -y python3.8 python3-pip dosfstools scons mtools zip && \
pip3 install setuptools kconfiglib pycryptodome six ecdsa && \
rm -f /usr/bin/python && ln -s /usr/bin/python3.8 /usr/bin/python
# 使用:
# mkdir -p data && docker run -it -v $PWD/data:/data openharmony:dev bash
Luego construye una imagen de Docker:
docker build -t openharmony: dev.
3. Utilice el espejo para crear el primer programa Hi3516
Si no hay equipo, estudiaré la quema.
La imagen se puede utilizar varias veces, mapeando una carpeta de datos local:
mkdir -p data && docker run -it -v $PWD/data:/data openharmony:dev bash
Después de entrar al espejo
cd /data
mkdir code-hi3516
cd code-hi3516
curl -O https://repo.huaweicloud.com/harmonyos/os/1.0/code-1.0.tar.gz
tar -zxvf code-1.0.tar.gz
# 直接执行 即可:
python build.py ipcamera_hi3516dv300 -b debug
Por último, muestra que la compilación se realizó correctamente y se omitieron muchos pasos.
conformance/interfaces/timer_settime/8-3 compile PASSED
conformance/interfaces/timer_settime/9-2 compile PASSED
conformance/interfaces/timer_settime/5-3 compile PASSED
../../../conformance/interfaces/timer_settime/5-1.c:92:6: warning: absolute value function 'labs' given an argument of type 'long long' but has parameter of type 'long' which may cause truncation of value [-Wabsolute-value]
if (labs(tsleft.tv_sec - SLEEPDELTA) <= ACCEPTABLEDELTA) {
^
../../../conformance/interfaces/timer_settime/5-1.c:92:6: note: use function 'llabs' instead
if (labs(tsleft.tv_sec - SLEEPDELTA) <= ACCEPTABLEDELTA) {
^~~~
llabs
1 warning generated.
conformance/interfaces/timer_settime/5-1 compile PASSED
conformance/interfaces/timer_settime/3-3 compile PASSED
conformance/interfaces/timer_settime/3-1 compile PASSED
conformance/interfaces/timer_settime/3-2 compile PASSED
conformance/interfaces/timer_settime/5-2 compile PASSED
conformance/interfaces/timer_settime/8-4 compile PASSED
conformance/interfaces/timer_settime/13-1 compile PASSED
make[2]: Entering directory '/data/code-hi3561/third_party/ltp/testcases/open_posix_testsuite/conformance/interfaces/timer_settime/speculative'
conformance/interfaces/timer_settime/speculative/12-1 compile PASSED
conformance/interfaces/timer_settime/speculative/12-3 compile PASSED
conformance/interfaces/timer_settime/speculative/12-2 compile PASSED
make[2]: Leaving directory '/data/code-hi3561/third_party/ltp/testcases/open_posix_testsuite/conformance/interfaces/timer_settime/speculative'
make[1]: Leaving directory '/data/code-hi3561/third_party/ltp/testcases/open_posix_testsuite/conformance/interfaces/timer_settime'
make: Leaving directory '/data/code-hi3561/third_party/ltp/testcases/open_posix_testsuite/conformance/interfaces'
[1328/1338] STAMP obj/test/xts/acts/open_posix_testsuite/conformance/interfaces/prebuild_ActsOpenPosixTest.stamp
[1329/1338] ACTION //test/xts/acts/open_posix_testsuite/conformance/interfaces:ActsOpenPosixTest(//build/lite/toolchain:linux_x86_64_clang)
[1330/1338] STAMP obj/test/xts/acts/open_posix_testsuite/conformance/interfaces/ActsOpenPosixTest.stamp
[1331/1338] STAMP obj/test/xts/acts/acts_compoment.stamp
[1332/1338] COPY bin/query.bin suites/acts/resource/tools/query.bin
[1333/1338] STAMP obj/test/xts/acts/query_copy.stamp
[1334/1338] ACTION //test/xts/acts:acts(//build/lite/toolchain:linux_x86_64_clang)
[1335/1338] STAMP obj/test/xts/acts/acts.stamp
[1336/1338] STAMP obj/build/lite/ohos.stamp
[1337/1338] ACTION //build/lite:gen_rootfs(//build/lite/toolchain:linux_x86_64_clang)
[1338/1338] STAMP obj/build/lite/gen_rootfs.stamp
ohos ipcamera_hi3516dv300 build success!
4. Cree otro programa Hi3861
Similar al primero, pero ejecute la compilación después de descargar el código:
python build.py wifiiot
El error es el siguiente, parece que las cosas creadas por el proyecto Hi3516 siguen siendo diferentes.
[196/197] ACTION //vendor/hisi/hi3861/hi3861:run_wifiiot_scons(//build/lite/toolchain:linux_x86_64_riscv32_gcc)
FAILED: obj/vendor/hisi/hi3861/hi3861/run_wifiiot_scons_build_ext_components.txt
python ../../build/lite/build_ext_components.py --path=../../vendor/hisi/hi3861/hi3861 --command=sh\ hm_build.sh
/usr/lib/scons/SCons/Defaults.py:213: SyntaxWarning: "is not" with a literal. Did you mean "!="?
if len(operation_list) is not 2:
/data/code-hi3861/vendor/hisi/hi3861/hi3861/build/scripts/hi_config_parser.py:85: SyntaxWarning: "is" with a literal. Did you mean "=="?
if option is '':
/usr/lib/python3/dist-packages/Crypto/Random/Fortuna/FortunaGenerator.py:28: SyntaxWarning: "is" with a literal. Did you mean "=="?
if sys.version_info[0] is 2 and sys.version_info[1] is 1:
/usr/lib/python3/dist-packages/Crypto/Random/Fortuna/FortunaGenerator.py:28: SyntaxWarning: "is" with a literal. Did you mean "=="?
if sys.version_info[0] is 2 and sys.version_info[1] is 1:
Traceback (most recent call last):
File "/usr/lib/scons/SCons/Script/Main.py", line 1376, in main
_exec_main(parser, values)
File "/usr/lib/scons/SCons/Script/Main.py", line 1339, in _exec_main
_main(parser)
File "/usr/lib/scons/SCons/Script/Main.py", line 1006, in _main
SCons.Script._SConscript._SConscript(fs, script)
File "/usr/lib/scons/SCons/Script/SConscript.py", line 255, in _SConscript
exec(compile(_file_.read(), _file_.name, 'exec'),
File "/data/code-hi3861/vendor/hisi/hi3861/hi3861/SConstruct", line 34, in <module>
from scripts import pkt_builder
File "/data/code-hi3861/vendor/hisi/hi3861/hi3861/build/scripts/pkt_builder.py", line 24, in <module>
import make_upg_file as MAKE_IMAGE
File "/data/code-hi3861/vendor/hisi/hi3861/hi3861/build/scripts/make_upg_file.py", line 30, in <module>
from Crypto.PublicKey import RSA
File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 78, in <module>
from Crypto import Random
File "/usr/lib/python3/dist-packages/Crypto/Random/__init__.py", line 29, in <module>
from Crypto.Random import _UserFriendlyRNG
File "/usr/lib/python3/dist-packages/Crypto/Random/_UserFriendlyRNG.py", line 38, in <module>
from Crypto.Random.Fortuna import FortunaAccumulator
File "/usr/lib/python3/dist-packages/Crypto/Random/Fortuna/FortunaAccumulator.py", line 39, in <module>
from . import FortunaGenerator
File "/usr/lib/python3/dist-packages/Crypto/Random/Fortuna/FortunaGenerator.py", line 35, in <module>
from Crypto.Util import Counter
File "/usr/lib/python3/dist-packages/Crypto/Util/Counter.py", line 59, in <module>
from Crypto.Util import _counter
ImportError: cannot import name '_counter' from 'Crypto.Util' (/usr/lib/python3/dist-packages/Crypto/Util/__init__.py)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/bin/scons", line 201, in <module>
SCons.Script.main()
File "/usr/lib/scons/SCons/Script/Main.py", line 1401, in main
SCons.Script._SConscript.SConscript_exception()
File "/usr/lib/scons/SCons/Script/SConscript.py", line 319, in SConscript_exception
stack = traceback.extract_tb(tb)
File "/usr/lib/python3.8/traceback.py", line 72, in extract_tb
return StackSummary.extract(walk_tb(tb), limit=limit)
File "/usr/lib/python3.8/traceback.py", line 366, in extract
f.line
File "/usr/lib/python3.8/traceback.py", line 288, in line
self._line = linecache.getline(self.filename, self.lineno).strip()
File "/usr/lib/python3.8/linecache.py", line 16, in getline
lines = getlines(filename, module_globals)
File "/usr/lib/python3.8/linecache.py", line 47, in getlines
return updatecache(filename, module_globals)
File "/usr/lib/python3.8/linecache.py", line 137, in updatecache
lines = fp.readlines()
File "/usr/lib/python3.8/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 699: invalid continuation byte
Traceback (most recent call last):
File "../../build/lite/build_ext_components.py", line 64, in <module>
sys.exit(main())
File "../../build/lite/build_ext_components.py", line 58, in main
cmd_exec(args.command)
File "../../build/lite/build_ext_components.py", line 32, in cmd_exec
raise Exception("{} failed, return code is {}".format(cmd, ret_code))
Exception: ['sh', 'hm_build.sh'] failed, return code is 1
ninja: build stopped: subcommand failed.
you can check build log in /data/code-hi3861/out/wifiiot/build.log
5. Resumen
El uso de la duplicación de Docker puede minimizar las diferencias en el entorno de construcción de diferentes dispositivos.
Sin embargo, solo Hi3516 se construyó con éxito y la demostración de Hi3861 no se construyó correctamente.
Además, no tengo equipo. Se puede construir con éxito, la demostración definitivamente se puede grabar en él.
No se estudiará lo siguiente. Luego comience a mirar el código relevante.
El enlace original de este artículo es:
https://blog.csdn.net/freewebsys/article/details/108621002
La dirección del blogger es: https://blog.csdn.net/freewebsys