> 技术文档 > 鸿蒙OH实战开发:OpenHarmony开源鸿蒙build编译模块的原理和系统配置解析_ohos.build是什么

鸿蒙OH实战开发:OpenHarmony开源鸿蒙build编译模块的原理和系统配置解析_ohos.build是什么



📚往期学习笔录📝:

📝 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

📝 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

📝 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

📝 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

📝 记录一场鸿蒙开发岗位面试经历~

📝 持续更新中……


编译模块整体描述
  • 目的:使用这个模块里的脚本、配置来编译整个开源鸿蒙系统,生成一个操作系统可执行文件
    • build模块源码地址:https://gitee.com/openharmony/build
    • 基于Gn和ninja的编译构建框架(类似于CMake/QMake/Automake + Makefile)
    • 使用Python文件、Python插件或者bash脚本安装依赖工具、按要求生成BUILD.gn配置文件
    • build模块介绍 - 编译构建
  • 编译的方法有三种:
    • 1:运行Python源码,生成BUILD.gn并编译
    • 2:运行使用Python写的插件hb,生成BUILD.gn并编译
    • 3:运行bash脚本,生成BUILD.gn并编译
第一种编译,使用Python源码:
  • python3 build.py -p qemu_mini_system_demo@ohemu 这是编译命令
  • Docker编译环境
  • build.py文件在OpenHarmony源码文件夹的顶层,但其实顶层的文件只是一个链接:build.py -> build/build_scripts/build.py
  • 这是build.py文件的内容:
#!/usr/bin/env python3# -*- coding: utf-8 -*-import osimport sysimport importlibimport subprocessdef search(findir: str, target: str) -> str or bool: for root, _, files in os.walk(findir): if target in files: return root return Falsedef find_top() -> str: cur_dir = os.getcwd() while cur_dir != \"/\": build_config_file = os.path.join( cur_dir, \'build/config/BUILDCONFIG.gn\') if os.path.exists(build_config_file): return cur_dir cur_dir = os.path.dirname(cur_dir)def get_python(python_relative_dir: str) -> str: topdir = find_top() if python_relative_dir is None: python_relative_dir = \'prebuilts/python\' python_base_dir = os.path.join(topdir, python_relative_dir) if os.path.exists(python_base_dir): python_dir = search(python_base_dir, \'python3\') return os.path.join(python_dir, \'python3\') else: print(\"please execute build/prebuilts_download.sh.\", \"if you used \'--python-dir\', check whether the input path is valid.\") sys.exit()def check_output(cmd: str, **kwargs) -> str: process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, **kwargs) for line in iter(process.stdout.readline, \'\'): sys.stdout.write(line) sys.stdout.flush() process.wait() ret_code = process.returncode return ret_codedef build(path: str, args_list: list) -> str: python_dir = None if \"--python-dir\" in args_list: index = args_list.index(\"--python-dir\") if index < len(args_list) - 1: python_dir = args_list[index + 1] del args_list[index: index + 2] else: print(\"-python-dir parmeter missing value.\") sys.exit() python_executable = get_python(python_dir) cmd = [python_executable, \'build/hb/main.py\', \'build\'] + args_list return check_output(cmd, cwd=path)def main(): root_path = find_top() return build(root_path, sys.argv[1:])if __name__ == \"__main__\": sys.exit(main())
第二种编译,运行Python插件:
  • HB构建工具使用指导
  • 使用Python的插件ohos-build,使用命令为 hb set; hb build -f 安装流程为
    • python3 -m pip install --user ohos-build==0.4.3 或者
    • python3 -m pip install --user build/hb
    • hb源码在OpenHarmony源码的./build/hb文件夹下:
#!/usr/bin/env python# -*- coding: utf-8 -*-import osfrom setuptools import setupfrom resources.global_var import VERSIONLONG_DESCRIPTION = \"\"WORK_PATH = os.path.abspath(os.path.dirname(\'__file__\'))README_PATH = os.path.join(WORK_PATH, \'README.md\')with open(README_PATH, \'r\', encoding=\'utf-8\') as FILE_DESCRIPTION: LONG_DESCRIPTION = FILE_DESCRIPTION.read()setup<