鸿蒙编译子系统详解(二)main.py

1.5.4源码解析

1.5.4.1 build/hb/main.py脚本

这个脚本是编译的主程序脚本,流程如下:

首先是初始化各种module类,然后运行对应模块。

hb分为build,set,env,clean,tool,help几个模块,模块源码位于build/hb/modules/目录下,目录结构

.
├── interface
│   ├── build_module_interface.py        #build模块接口类
│   ├── clean_module_interface.py        #clean模块接口类
│   ├── env_module_interface.py          #env模块接口类
│   ├── module_interface.py              #module基类
│   ├── set_module_interface.py          #set模块接口类
│   └── tool_module_interface.py         #tool模块接口类
├── ohos_build_module.py              #build模块类
├── ohos_clean_module.py              #clean模块类
├── ohos_env_module.py                #env模块类
├── ohos_set_module.py                #set模块类
└── ohos_tool_module.py               #tool模块类

初始化module的流程是获取参数信息,构造必要参数,构造各模块的模块类。

1.5.4.1.1 build模块初始化

源码:

def _init_build_module(self) -> BuildModuleInterface:
    args_dict = Arg.parse_all_args(ModuleType.BUILD)

    if args_dict.get("product_name").arg_value != '':
        set_args_dict = Arg.parse_all_args(ModuleType.SET)
        set_args_resolver = SetArgsResolver(set_args_dict)
        ohos_set_module = OHOSSetModule(set_args_dict, set_args_resolver, "")
        ohos_set_module.set_product()

    preloader = OHOSPreloader()
    loader = OHOSLoader()
    generate_ninja = Gn()
    ninja = Ninja()
    build_args_resolver = BuildArgsResolver(args_dict)

    return OHOSBuildModule(args_dict, build_args_resolver, preloader, loader, generate_ninja, ninja)

初始化build模块,构造OHOSBuildModule类,传入参数:

  • args_dict

                全部命令行参数信息,一共41个

  • build_args_resolver

                build参数解析及处理类

  • preloader

                OHOSPreloader类

  • loader

                OHOSLoader类

  • generate_ninja

                Gn类,执行gn命令

  • ninja

                Ninja类,执行ninja命令

1.5.4.1.2 set模块初始化

源码:

def _init_set_module(self) -> SetModuleInterface:
    Arg.clean_args_file()
    args_dict = Arg.parse_all_args(ModuleType.SET)
    set_args_resolver = SetArgsResolver(args_dict)
    from services.menu import Menu
    menu = Menu()
    return OHOSSetModule(args_dict, set_args_resolver, menu)

初始化set模块,构造OHOSSetModule类,传入参数:

  • args_dict

                全部命令行参数信息,一共2个

  • set_args_resolver

                set命令行参数解析及处理类

  • menu

文本菜单

1.5.4.1.3 env模块初始化

源码:

def _init_env_module(self) -> EnvModuleInterface:
    args_dict = Arg.parse_all_args(ModuleType.ENV)
    env_args_resolver = EnvArgsResolver(args_dict)
    return OHOSEnvModule(args_dict, env_args_resolver)

初始化env模块,构造OHOSEnvModule类,传入参数:

  • args_dict

                全部命令行参数信息,一共2个

  • env_args_resolver

                env命令行参数解析及处理类

1.5.4.1.4 clean模块初始化

def _init_clean_module(self) -> CleanModuleInterface:
    args_dict = Arg.parse_all_args(ModuleType.CLEAN)
    clean_args_resolever = CleanArgsResolver(args_dict)
    return OHOSCleanModule(args_dict, clean_args_resolever)

初始化clean模块,构造OHOSCleanModule类,传入参数:

  • args_dict

                全部命令行参数信息,一共4个

  • clean_args_resolver

                clean命令行参数解析及处理类

1.5.4.1.5 tool模块初始化

def _init_tool_module(self) -> ToolModuleInterface:
    Arg.clean_args_file()
    args_dict = Arg.parse_all_args(ModuleType.TOOL)
    generate_ninja = Gn()
    tool_args_resolever = ToolArgsResolver(args_dict)
    return OHOSToolModule(args_dict, tool_args_resolever, generate_ninja)

初始化tool模块,构造OHOSCleanModule类,传入参数:

  • args_dict

                全部命令行参数信息,一共有6个

  • tool_args_resolver

                tool命令行参数解析及处理类

  • generate_ninja

                Gn类,执行gn命令

1.5.4.1.6 命令行参数
1.5.4.1.6.1 获取参数

命令行参数信息通过parse_all_args()接口获取:

args_dict = Arg.parse_all_args(ModuleType.BUILD)
args_dict = Arg.parse_all_args(ModuleType.SET)
args_dict = Arg.parse_all_args(ModuleType.ENV)
args_dict = Arg.parse_all_args(ModuleType.CLEAN)
args_dict = Arg.parse_all_args(ModuleType.TOOL)

源码位于build/hb/containers/arg.py,从配置文件中读取命令行参数的配置并保存起来。

@staticmethod
def parse_all_args(module_type: ModuleType) -> dict:
    args_dict = {}
    parser = argparse.ArgumentParser()
    all_args = Arg.read_args_file(module_type)

    for arg in all_args.values():
        arg = dict(arg)
        ArgsFactory.genetic_add_option(parser, arg)
        oh_arg = Arg.create_instance_by_dict(arg)
        args_dict[oh_arg.arg_name] = oh_arg

    parser.usage = 'hb {} [option]'.format(module_type.name.lower())
    parser_args = parser.parse_known_args(sys.argv[2:])

#......省略
    return args_dict

配置文件位于build/hb/resources/args/default目录下,对应各个模块的参数信息

  • buildargs.json
  • cleanargs.json
  • envargs.json
  • setargs.json
  • toolargs.json

json文件中包含有多个参数,每个参数都有多个属性:

  • arg_name:参数名称
  • argDefault:默认值
  • arg_help:帮助信息
  • arg_phase:阶段
  • arg_type:类型
  • arg_attribute:属性,包括optional可选值、abbreviation缩写等
  • resolve_function:解析函数
  • testFunction:测试函数
1.5.4.1.6.2 解析参数

命令行参数解析通过build/hb/resolver目录下的类来进行:

.
├── args_factory.py               #arg工厂类
├── build_args_resolver.py        #build解析类
├── clean_args_resolver.py        #clean解析类
├── env_args_resolver.py          #env解析类
├── interface
│   └── args_resolver_interface.py   #arg解析接口基类
├── set_args_resolver.py           #set解析类
└── tool_args_resolver.py          #tool解析类

根据json文件配置resolve_function函数名称,查找对应同名函数,调用函数解析参数。调用解析的源码位于接口类中resolve_arg

@throw_exception
def resolve_arg(self, target_arg: Arg, module):
    if target_arg.arg_name not in self._args_to_function.keys():
        raise OHOSException(
            'You are tring to call {} resolve function, but it has not been defined yet''0000')
    if not hasattr(self._args_to_function[target_arg.arg_name]'__call__'):
        raise OHOSException()

    resolve_function = self._args_to_function[target_arg.arg_name]
    return resolve_function(target_arg, module)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/597187.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学生管理系统初级

根据题目要求生成大纲 总结: 1.在书写时,考虑到了书写时id可是是abc... 类型是String,但在根据id获取集合中元素时 list.get() ,get()里面是int类型。 2.在书写还有一点功能并不完全, 2.1查找时是打印所有…

【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计

前言 从今天开始,我们详解介绍制作实时天气时钟项目的方法步骤,主要分以下几个专题分别进行:(1)连接点亮SPI-TFT屏幕和UI布局设计;(2)NodeMCU的WIFI模式设置及连接;&…

车牌号识别系统:PyQT5+QT Designe+crnn/PaddleOCR+YOLO+OpenCV矫正算法。

PyQT5&QT Designecrnn/PaddleOCRYOLO传统OpenCV矫正算法。可视化的车牌识别系统项目。 车牌号识别系统 项目绪论1.项目展示2.视频展示3.整体思路 一、PyQT5 和 QT Designer1.简介2.安装3.使用 二、YOLO检测算法三、OpenCV矫正算法四、crnn/PaddleOCR字符识别算法五、QT界面…

FreeRTOS任务详解

一、任务的创建与删除 1.任务的基本概念 RTOS系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习 RTOS 系统的工程 师或者学生主要就是为了使用 RTOS 的多任务处理功能,初步上手 RTOS 系统首先必须掌握的 也是任务的创建、删除、挂起和恢复等操作,由此可见任务管理…

限量背包问题

问题描述 限量背包问题:从m个物品中挑选出最多v个物品放入容量为n的背包。 问题分析 限量背包问题,可以用来解决许多问题,例如要求从n个物品中挑选出最多v个物品放入容量为m的背包使得背包最后的价值最大,或者总共有多少种放法…

我独自升级:崛起怎么下载 我独自升级游戏下载教程分享

定于5月8日全球揭幕的《我独自升级崛起》——一款扣人心弦的动作RPG巨制,灵感采撷于同名动画及网络漫画的热潮,誓将引领满怀热忱的玩家步入一场交织着深邃探索和宏大规模的奇妙冒险。该游戏立足于一个独树一帜的网络武侠宇宙,细腻刻画了一个凡…

VSCode通过SSH连接虚拟机Ubuntu失败

问题说明 最近使用VSCode通过SSH连接Ubuntu,通过VSCode访问Ubuntu进行项目开发,发现连接失败 在VSCode中进行SSH配置 这些都没有问题,但在进行连接时候出现了问题,如下: 出现了下面这个弹窗 解决方法 发现当…

软件测试职责

软件测试职责主要包括以下几个方面: 1. 需求分析:理解软件需求规格说明书,确保测试活动覆盖所有的功能需求和非功能需求(如性能、安全性、兼容性等)。 2. 测试计划制定:根据项目需求,设计测试…

NodeJS 如何在npm运行时设置Windows控制台的标题?

通过代码设置 const server app.listen(port, () > {console.log(主机名称:, global.hostname)console.log(主机IP地址:, global.host)console.log(后台服务端口号:, port)console.log(恭喜你,启动成功!)process.title node …

图像处理

图像处理 导入图片 导入io模块,读取文件所在位置,将生成的图像数据赋给变量img,显示图像 from skimage import ioimgio.imread(D:\工坊\图像处理\十个勤天2.png)io.imshow(img) 运行结果: 将图片进行灰度处理 from skimage i…

Autodesk AutoCAD 2025 for Mac:强大的二维三维绘图工具

Autodesk AutoCAD 2025 for Mac是一款专为Mac用户打造的计算机辅助设计软件,它在继承了AutoCAD系列软件的优秀传统的基础上,针对Mac系统进行了全面优化,为用户提供了更出色的绘图和设计体验。 这款软件不仅支持用户创建和编辑复杂的二维几何图…

Nvidia发布Llama3-ChatQA-1.5: 提升对话问答和表格推理能力,平均性能超越GPT-4

前言 近日,Nvidia推出了一款名为Llama3-ChatQA-1.5的对话问答模型。该模型在对话式问答和检索增强型生成等能力方面表现出色,在综合评测指标上甚至超越了当前业界顶尖的GPT-4模型。 技术特点 Llama3-ChatQA-1.5是基于Llama-3基础模型训练而成的。相比之…

01-基本概念

1. 到底什么是数据结构? 数据结构是指在计算机中组织和存储数据的方式,它涉及到数据元素之间的关系以及对这些关系进行操作的方法。数据结构可以看作是一种将数据组织起来以便有效使用的方式,它关注数据的组织、存储和操作,以及如…

关于冯诺依曼体系结构 和 操作系统(Operator System)的概念讲解(冯诺依曼体系结构,操作系统的作用等)

目录 一、冯诺依曼体系结构 二、操作系统 1. 概念 2. 设计操作系统的目的 3.系统调用和库函数概念 4.总结 三、完结撒❀ 一、冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截…

标贝数据采集标注在自动驾驶场景中落地应用实例

AI数据服务作为人工智能和机器学习的基础,在自动驾驶领域中有着重要地位。与其他人工智能应用场景相比,自动驾驶的落地场景相对复杂,想要让汽车本身的算法做到处理更多、更复杂的场景,就需要运用大量场景化高质量AI数据做支撑。标…

第八节课《大模型微调数据构造》

大模型微调数据构造(补充课程)_哔哩哔哩_bilibili Tutorial/FineTune at main Focusshang/Tutorial GitHub 一、大模型训练数据介绍 预训练: 网络、论文数据,无标签数据transform算法base model典型:GPT监督微调 对…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

ISIS的基本概念

1.ISIS概述 IS-IS是一种链路状态路由协议,IS-IS与OSPF在许多方面非常相似, 例如运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此,然后建立邻接关系,并交互链路状态信息。 CLNS由以下三个部分组成: CLNP&#xf…

新的项目springboot

buybuyshenglombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 添加依赖 lombok package com.example.demo.pojo;import lombok.AllArgsConstructor; import lombok.Data; import …

LLM应用:prompt提示让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …