鸿蒙OH实战开发:OpenHarmony开源鸿蒙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 os
import sys
import importlib
import subprocess

def search(findir: str, target: str) -> str or bool:
    for root, _, files in os.walk(findir):
        if target in files:
            return root
    return False

def 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_code

def 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 os
from setuptools import setup

from resources.global_var import VERSION

LONG_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(
    name='ohos-build',
    version=VERSION,
    author='Huawei
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值