深入解析 OpenHarmony 构建系统-3-GN 构建系统管理脚本

devtools/2024/11/16 13:45:42/
引言

OpenHarmony作为一款面向全场景的分布式操作系统,其构建系统在开发过程中扮演着至关重要的角色。本文将详细介绍OpenHarmony构建系统下的一个gn封装脚本,该脚本用于管理和执行 gn 命令,更高效地管理构建过程。
位置:/build/hb/services/gn.py

脚本概述

该脚本定义了一个 Gn 类,继承自 BuildFileGeneratorInterface 接口,并实现了多个方法来执行不同的 gn 命令。这些命令包括生成构建文件、查询路径、描述目标、列出目标、引用检查、格式化和清理等。

脚本结构
1. 导入必要的模块
import sys
import os
from enum import Enumfrom containers.status import throw_exception
from exceptions.ohos_exception import OHOSException
from services.interface.build_file_generator_interface import BuildFileGeneratorInterface
from resources.config import Config
from containers.arg import Arg, ModuleType
from util.system_util import SystemUtil
from util.io_util import IoUtil
from util.log_util import LogUtil
  • sysos 模块用于处理系统相关的操作。
  • Enum 用于定义枚举类型。
  • throw_exception 是一个装饰器,用于捕获和处理异常。
  • OHOSException 是自定义的异常类。
  • BuildFileGeneratorInterface 是接口类,定义了构建文件生成器的基本方法。
  • Config 类用于读取和管理配置文件。
  • ArgModuleType 用于处理命令行参数。
  • SystemUtilIoUtil 提供系统和输入输出相关的工具函数。
  • LogUtil 用于日志记录。
2. 定义枚举类型 CMDTYPE
class CMDTYPE(Enum):GEN = 1PATH = 2DESC = 3LS = 4REFS = 5FORMAT = 6CLEAN = 7
  • CMDTYPE 枚举类型定义了 gn 命令的类型,包括生成构建文件 (GEN)、查询路径 (PATH)、描述目标 (DESC)、列出目标 (LS)、引用检查 (REFS)、格式化 (FORMAT) 和清理 (CLEAN)。
3. Gn 类定义
class Gn(BuildFileGeneratorInterface):def __init__(self):super().__init__()self.config = Config()self._regist_gn_path()def run(self):self.execute_gn_cmd(CMDTYPE.GEN)
  • Gn 类继承自 BuildFileGeneratorInterface 接口。
  • __init__ 方法初始化 Gn 类实例,读取配置文件并注册 gn 可执行文件路径。
  • run 方法默认执行生成构建文件的命令。
4. 注册 gn 可执行文件路径
@throw_exception
def _regist_gn_path(self):gn_path = os.path.join(self.config.root_path, 'prebuilts/build-tools/{}-x86/bin/gn'.format(sys.platform))if os.path.exists(gn_path):self.exec = gn_pathelse:raise OHOSException('There is no gn executable file at {}'.format(gn_path), '0001')
  • _regist_gn_path 方法根据系统平台查找 gn 可执行文件的路径,并存储在 self.exec 中。
  • 如果路径不存在,抛出 OHOSException 异常。
5. 转换注册的参数和标志
def _convert_args(self) -> list:args_list = []for key, value in self.args_dict.items():if isinstance(value, bool):args_list.append('{}={}'.format(key, str(value

http://www.ppmy.cn/devtools/134452.html

相关文章

【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing

HITS: High-coverage LLM-based Unit Test Generation via Method Slicing 1. 来源出处 本文是发表在2024年39th IEEE/ACM International Conference on Automated Software Engineering (ASE)上的论文。作者包括Zejun Wang, Kaiibo Liu, Ge Li和Zhi Jin,他们来自北京的PKU …

C++的一些模版

1、不限制次数的输入数据 vector<int> nums;int num;while (cin >> num) {nums.push_back(num);if (cin.get() \n) break;}2、取模模版 template<int kcz> struct ModInt { #define T (*this)int x;ModInt() : x(0) {}ModInt(int y) : x(y > 0 ? y : y…

反转链表

反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1…

视频编码基础入门

文章目录 前言一、视频编码的目标二、 视频编码基本流程1. 采样与颜色空间转换2. 变换编码&#xff08;例如DCT&#xff09;3. 量化4. 熵编码5. 运动补偿和帧间预测6. 编码输出 三、视频编码的关键技术1. 帧类型2. GOP&#xff08;Group of Pictures&#xff09;结构3. 比特率控…

学习yum工具,进行安装软件

目录 1.Linux 软件包管理器 yum 什么是软件包 2.Linux下安装软件的方案 3.Linux软件生态 Linux下载软件的过程&#xff08;Ubuntu、Centos、other&#xff09; 操作系统的好坏评估--- ⽣态问题 为什么会有⼈免费特定社区提供软件&#xff0c;还发布&#xff1f;还提供云服…

vue/react前端项目自定义js脚本实现自定义部署等操作

因为项目需要&#xff0c;需要将同一个项目部署到四个不同的服务器上&#xff0c;并且每一个服务器的静态文件夹名称还不能一样&#xff0c;这就需要在打包之前&#xff0c;将静态文件夹重新命名&#xff0c;并且修改vue或者ts等文件中静态资源的引入路径&#xff0c;这是相当繁…

微信小程序:vant组件库安装步骤

前言&#xff1a;在微信小程序中引用vant组件报错&#xff0c;提示路径不存在&#xff0c;这很有可能是因为没有安装构建vant组件库导致。下面是我整理的安装vant组件库的步骤: 第一步&#xff1a;安装node.js(执行完第一步请重启小程序) 具体步骤请看链接&#xff1a;node.js…

笔记整理—linux驱动开发部分(12)I2C总线与触摸屏设备

IIC总线有三根线&#xff1a;SCL时钟线、SDA串行数据线、GND地线。IIC总线有以下三个特点的特点&#xff1a;同步通信&#xff08;同一个时钟下&#xff09;、电平&#xff08;电平信号、非差分、近距离&#xff09;、低速。 总线是结构&#xff0c;多个设备挂载同一条总线上&a…