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

server/2024/9/23 22:35:04/

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.ppmy.cn/server/36004.html

相关文章

数据结构-树概念基础知识

根结点:非空树中无前驱节点的结点 结点度:结点拥有的子树数或子节点数或后继节点数 树的度:树内各结点的度的最大值 叶子:终端节点,度为0 祖先:从根到该节点所经分支上的所有结点 子孙:以某结点…

行业早报5.7

1.IDC:一季度中国折叠屏手机市场华为第一,荣耀、vivo、OPPO、三星前五; 2.华为 2024 年一季度净利润 196.5 亿元,同比大涨约 564%; 3.极氪 4 月交付 16089 台同比增长 99%,环比增长 24% 再创历史新高&#…

Graph RAG:基于知识图谱的检索增强技术与优势对比

身处信息爆炸时代,如何从海量信息中获取准确全面的搜索结果,并以更直观、可读的方式呈现出来是大家期待达成的目标。传统的搜索增强技术受限于训练文本数量、质量等问题,对于复杂或多义词查询效果不佳,更无法满足 ChatGPT 等大语言…

模板初阶篇

本篇目标 泛型编程函数模板类模板 一、泛型编程 下面是实现一个通用的交换函数 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } v…

java后端自学错误总结spring持续更新中

java后端自学错误总结 一.SpringBoot--正在总结中1.循环嵌套异常2.项目起来卡住了怎么办 二.SpringCloud--正在总结中 一.SpringBoot–正在总结中 1.循环嵌套异常 今天再写SpringCloud项目的时候书写测试类运行结果报错了报错的最后的信息是 The dependencies of some of th…

【网络】网站打开的全过程:网络通信与协议解析

在我们日常的网络浏览中,打开一个网站似乎是理所当然的事情,但其中涉及了复杂的网络通信过程和多种协议的配合。本文将从上至下,逐层解析打开一个网站的完整过程,并介绍每个层次可能涉及的协议和技术。 1. 应用层 当我们在浏览器…

欧盟EDPB发布2024至2027年的安全战略

文章目录 前言一、加强协调和促进合规1、EDPB将继续就关键问题提供指南。2、 EDPB将继续支持适当和有效的合规措施的发展和实施3、EDPB将开发补充技术和法律重点出版物的信息。二、加强共同执行文化和有效合作三、在发展中的数字和跨监管环境中促进个人数据保护四、促进全球数据…

SpringMVC简介和体验

一、SpringMVC简介和体验 1.1 介绍 Spring Web MVC :: Spring Framework Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc )&#…