鸿蒙编译子系统详解(二)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.mzph.cn/pingmian/7697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow——SSRF

文章目录 web 351web 352web 353web 354web 355web 356web357web 358web 359web 360 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统…

python实现的信号合成分析系统(DSP)

python实现的信号合成分析系统(DSP) 流程 1、在QT界面上设置好信号频率,采样频率,采样点数 2、使用np构建sin函数 3、使用matplotlib画出 4、分别分析合成信号的FFT频域信息1、效果图 2、示例代码 def btn_com_clicked(self):# 信号合成分析Fs = self.com_fs_edit_value #…

C++程序设计教案

文章目录: 一:软件安装环境 第一种:vc2012 第二种:Dev-C 第三种:小熊猫C 二:语法基础 1.相关 1.1 注释 1.2 换行符 1.3 规范 1.4 关键字 1.5 ASCll码表 1.6 转义字符 2.基本框架 2.1 第一种&…

巨控GRM561/562/563/564Q杀菌信息远程监控

摘要 通过程序编写、手机APP画面制作等运行系统,实现电脑及手机APP显示的历史曲线画面和数据图形化的实时性。 不仅流程效率提升90%以上,同时为杀菌生产提供有利的质量保障,还有效规避因触屏及内存卡的突发异常导致历史数据的丢失&#xff0…

Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1 (1)进入环境后看到一篇php代码,开始我简单的以为是一题常规的php伪协议,多次试错后发现它并没有那么简单,它包含了基础的文件包含,伪协议还有反序列化 (2&#x…

streamlit通过子目录访问

运行命令: streamlit hello 系统默认使用8501端口启动服务: 如果想通过子目录访问服务,可以这么启动服务 streamlit hello --server.baseUrlPath "app" 也可以通过以下命令换端口 streamlit hello --server.port 9999 参考&…

Python - pyplot 画一个漂亮的饼图 Pie charts

目录 一.引言 二.颜色选择 三.绘制饼图 四.总结 一.引言 因工作需求,需要绘制一些数据的饼图,使用默认的颜色绘制不够美观,下面我们找一些好看的颜色美化一些饼图。 二.颜色选择 我们根据 plt 给出的一些好看颜色对应的编码即可为每一个…

HackMyVM-Animetronic

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 feroxbuster steghide exiftool hydra ssh连接 提权 系统信息收集 socat提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7…

【无标题】程序设计和c语言-谭浩强配套(适合专升本)

一晃大半年没更新了,一直在备考,想着这几天把前段时间学的c语言给大家分享一下,在此做了一个专栏,有需要的小伙伴可私信获取。 说明:本专栏所有内容皆适合专升本复习资料,本人手上也有日常刷题整理的错题以…

KAN: Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接:https://arxiv.org/abs/2404.19756 代码链接:https://github.com/KindXiaoming/pyKAN 项目链接:https://kindxiaoming.github.io/pyKAN/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

数据结构——链表(精简易懂版)

文章目录 链表概述链表的实现链表的节点(单个积木)链表的构建直接构建尾插法构建头插法构建 链表的插入 总结 链表概述 1,链表(Linked List)是一种常见的数据结构,用于存储一系列元素。它由一系列节点&…

Bookends for Mac v15.0.2 文献书籍下载管理

Bookends Mac版可以轻松地将其导入参考 ,并直接搜索和进口从数以百计的线上资料来源。Bookends Mac版使用内置在浏览器中下载参考与PDF格式的文件,或和/或网页的点击。 Bookends for Mac v15.0.2注册激活版下载 本文由 mdnice 多平台发布

深度学习模型训练套路与验证套路以及如何使用GPU进行模型训练

完整的模型训练套路:代码模板 数据集以经典的 CIFAR10 为例。 这个例子是很简单的,可能不太实用,但重点是通过这个例子掌握一种模型训练的写法套路,因此很有必要学习。 import torch.optim import torchvision from torch impo…

java-串口通讯-连接硬件

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

拥抱新质生产力,助力新型工业化!CMM电子展暨IARS机器人展5月东莞盛大起航

2024年5月15-17日&#xff0c;东浩兰生会展集团旗下CMM电子展&#xff06;IARS机器人展将在广东现代国际展览中心&#xff08;东莞厚街&#xff09;举办。展会面积达50000平方米&#xff0c;展示品牌700余个&#xff0c;同期论坛峰会30余场&#xff0c;预计专业观众超50000人次…

error: pathspec ‘XXX‘ did not match any file(s) known to git

使用vscode&#xff0c;在本地开发切换分支时&#xff0c;报以下错误&#xff1a; error: pathspec XXX did not match any file(s) known to git 该问题是由于没有对应分支的原因。 首先使用一下命令&#xff0c;查看本地及远程的所有分支。 git branch -a 若没有对应的分…

极验4 一键解混淆

提示&#xff01;本文章仅供学习交流&#xff0c;严禁用于任何商业和非法用途&#xff0c;未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;如有侵权&#xff0c;可联系本文作者删除&#xff01; AST简介 AST&#xff08;Abstract Syntax Tree&#xff09;&a…

Linux专栏03:使用Xshell远程连接云服务器

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 使用Xshell远程连接云服务器 编号&#xff1a;03 文章目录 使用Xsh…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…