Aprendizaje del sistema operativo Huawei Hongmeng (2): use Docker para compilar código Hongmeng en Linux, compile un entorno Dockerfile y ejecute el código de compilación Hi3516, pero use la misma imagen para compilar Hi3581, la compilación falla.

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.

Consulte
https://openharmony.gitee.com/openharmony/docs/blob/master/quick-start/%E5%BC%80%E5%8F%91Hi3516%E7%AC%AC%E4%B8%80%E4% B8% AA% E5% BA% 94% E7% 94% A8% E7% A8% 8B% E5% BA% 8F% E7% A4% BA% E4% BE% 8B.md

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

Supongo que te gusta

Origin blog.csdn.net/freewebsys/article/details/108621002
Recomendado
Clasificación