OpenHarmony编译系统

news2025/2/27 14:22:26

GN 简介

  • 直接百度

GN 入门

  • 可以参考下面的示例,作为入门参考学习
  • https://blog.csdn.net/weixin_44701535/article/details/88355958
  • https://gn.googlesource.com/gn/+/main/docs/reference.md
  • https://chromium.googlesource.com/chromium/src/tools/gn/+/48062805e19b4697c5fbd926dc649c78b6aaa138/docs/language.md#Functions

借助openHarmony 代码来学习了解GN

从一个基本的目录来看

  • Gn 管理同样是基于目录来常见的基本单元,存在BUILD.gn 来管理当前目录以及下层目录的内容,定义一些label, 后续访问的都是以target作为基本的单元。
  • 同时存在一些.gni的文件将一些比较通用的模块(模板),以及一些编译的选项给提取出来,提高复用性,在实际需要的scope中,通过import导入所需要的文件,例如import("//build/lite/config/component/lite_component.gni")。
    • foundation/ai/engine/services/server 为例来看。首先在该目录下面存在一个BUILD.gn的文件,其次在plugin_manager中同样存在一个BUILD.gn文件来管理当前的目录。
    • 在这里插入图片描述
      • 查看plugin_manager文件内容,可以发现一种常见的固定格式,首先import 导入一些的文件, 然后定义一些labels,如gen_etc_iniplungin_manager
	import("//foundation/ai/engine/services/ai_plugin_config.gni")

action("gen_etc_ini") {
  outputs = [ "${root_out_dir}/etc/ai_engine_plugin.ini" ]
  script = "get_config_ini.py"
  args = []
  args = [ rebase_path(get_path_info("//", "abspath")) ]
  args += [ rebase_path("$root_out_dir") ]
  args += [ "${board_name}" ]
  args += [ "$activate_plugin_list"]
}

source_set("plugin_manager") {
  sources = [
    "source/aie_plugin_info.cpp",
    "source/plugin.cpp",
    "source/plugin_label.cpp",
    "source/plugin_manager.cpp",
  ]

  cflags = [ "-fPIC" ]
  cflags_cc = cflags

  include_dirs = [
    "//base/hiviewdfx/hilog_lite/interfaces/native/kits/hilog",
    "//foundation/ai/engine/interfaces/",
    "//foundation/ai/engine/services/common/",
    "//foundation/ai/engine/services/server/",
    "//third_party/bounds_checking_function/include",
    "//third_party/iniparser",
  ]
  deps = [ "//third_party/iniparser:iniparser" ]
}
  • 查看当前目录下的BUILD.gn 文件内容,可以发现其中调用了plugin_manager,使用的是相对路径。 当然使用一些不是当前目录下定义的labels使用的的是Source-tree absolute names
import("//build/lite/config/component/lite_component.gni")

lite_component("ai_server") {
target_type = "executable"
features = [
  "communication_adapter:ai_communication_adapter",
  "plugin_manager",
  "server_executor",
]
cflags = [ "-fPIC" ]
ldflags = [
  "-Wl,-Map=server.map",
  "-lstdc++",
  "-Wl,--whole-archive",
  "libs/libai_communication_adapter.a",
  "-Wl,--no-whole-archive",
  "-ldl",
  "-pthread",
]
deps = [
  "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared",
  "//foundation/ai/engine/services/common/platform/dl_operation:dlOperation",
  "//foundation/ai/engine/services/common/platform/event:event",
  "//foundation/ai/engine/services/common/platform/os_wrapper/ipc:aie_ipc",
  "//foundation/ai/engine/services/common/platform/lock:lock",
  "//foundation/ai/engine/services/common/platform/semaphore:semaphore",
  "//foundation/ai/engine/services/common/platform/threadpool:threadpool",
  "//foundation/distributedschedule/samgr_lite/samgr:samgr",
]
}

lite_component("server") {
  features = [
      ":ai_server",
      "plugin:plugin",
      "plugin_manager:gen_etc_ini",
  ]
}
  • 细看这些内容,设计到的一些常用的Target 声明,以及一些自定义的模板。
    • lite_component便是一个模板,定义位于/mnt/d/workspace/code/code-v3.1-Beta/OpenHarmony/build/lite/config/component/lite_component.gni文件中。定义中使用了一些内置的函数,assert, defined, foreach, 以及一些流程控制和判断表达式的使用。其中的invoker 做一个不严谨的类比,如果模板定义为一个类的话,那么通过该模板定义的一个Target可以类比为一个实例,那么invoker类比为 cpp 或者java中的this,python中的self,指代当前的实例 。关于其中的target, 主要是用于在运行时,推断编译时无法获取的 target内容,target(“source_set”, “doom_melon”) { 等于source_set(“doom_melon”) { 关于其中的forward_variables_from 则从给定的scope拷贝到本地的scope中。
template("lite_component") {
  assert(defined(invoker.features), "Component features is required.")

  if (!defined(invoker.target_type)) {
    target_type = "group"
  } else if (invoker.target_type == "static_library") {
    target_type = "group"
  } else {
    target_type = invoker.target_type
  }
  assert(target_type != "")

  target(target_type, target_name) {
    deps = []

    forward_variables_from(invoker, "*")

    # add component deps
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    # add component features
    foreach(feature_label, features) {
      deps += [ feature_label ]
    }
  }
}
  • 关于这些Targets 内部可以定义的变量以及内置的变量。如target_type, features,cflags, ldflags, deps。

从整个项目来看

  • 在根目录下存在.gn完成gn相关的一些配置文件。
# The location of the build configuration file.
buildconfig = "//build/config/BUILDCONFIG.gn"

# The source root location.
root = "//build/core/gn"

# The executable used to execute scripts in action and exec_script.
script_executable = "/usr/bin/env"
  • 从基本的配置文件/mnt/d/workspace/code/code-v3.1-Beta/OpenHarmony/build/lite/config/BUILDCONFIG.gn来看,主要的是基础配置,设定工具链,以及一些基础的编译选项
    • set_default_toolchain
    • set_defaults
    • config
    • declare_args
     declare_args() {
    enable_teleporter = true
    enable_doom_melon = false
    }
    
    If you want to override the (default disabled) Doom Melon:
    gn --args="enable_doom_melon=true enable_teleporter=true"
    This also sets the teleporter, but it's already defaulted to on so it will
    have no effect.
    

命令行

  • 关于Gn 本身提供的命令选项可以通过查看这些命令参数来查看,

编译AI子系统

  • 参考该目录下的README.md 搭建编译环境,https://gitee.com/openharmony/build_lite/blob/master/README_zh.md
  • 安装hb python 包,切换到opon harmony源码下,切换到python 虚拟环境
    	python3 -m pip install --user build/lite
        看到 Successfully installed ohos-build-0.4.4, 如果没有看到,尝试多次执行该命令
        The script hb is installed in '/home/wang/.local/bin' which is not on PATH.
        /home/wang/.local/bin 添加到环境变量中 ~/.bashrc
        source ~/.bashrc
    

在这里插入图片描述

  • 设定一些基本配置
    hb set -root ./
    # 当前源码目录,接下来弹出一个选择开发板, 上下选择, 回车选择
    # OHOS Which product do you need?  ohos-arm64
    

使用build.sh编译

./build.sh --product-name rk3568 --ccache --jobs 16
# 报错,缺少ruby 的环境
/usr/bin/env: ‘ruby’: No such file or directory
# 安装ruby 环境
sudo apt update
sudo apt install ruby-full
# 缺库
# libtinfo.so.5: cannot open shared object file

# install 
ls /lib/x86_64-linux-gnu/libtinfo.*
sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6.2 /lib/x86_64-linux-gnu/libtinfo.so.5
# 版本不兼容
/lib/x86_64-linux-gnu/libtinfo.so.5: version `NCURSES_TINFO_5.0.19991023' not found (required by ../../prebuilts/mingw-w64/ohos/linux-x86_64/clang-mingw/bin/clang)
# install
sudo apt-get install libncurses5
 sudo apt install openjdk-11-jdk
  • 编译成功
    在这里插入图片描述
  • 查看生成的文件
    在这里插入图片描述

分析

  • 该入口中主要做三部分内容,首先检查下安装的依赖是否完成, 然后配置下preloader , 之后build

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 看下面的内容,会发现,最后还是走到了 调用gn, 然后最后调用Ninja
    在这里插入图片描述

  • 关于在preloader中工作,读取提前设置好配置文件,设置文件中主要是编译的配置,编译哪部分内容,以及选择对应的工具链的label。下图中为主要的配置json文件,关于这些文件的配置,可以参考该目录下的README_zh.md。

在这里插入图片描述

  • 主要读取的json文件,以及选择好使用的工具链。
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

Java项目_在线点餐系统(jsp+sevlet+mysql)(含论文)

在线点餐系统(jspsevletmysql一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.餐桌管理(管理员)7.菜系管理(管理员)8.菜品管理(管理员)9.订单管理(管理员)三、获取源码一、系统介绍 系统主要功能: 用户&#…

4位资深专家多年大厂经验分享出Flink技术架构设计与实现原理

时间飞逝,转眼间毕业七年多,从事 Java 开发也六年了。我在想,也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

bootstrap下拉菜单学习(五)

组件:下拉菜单 bootstrap字体图标和下拉菜单组件的使用 这些图标都存在我们引入的font文件夹内: 复制bootstrap所用的包: 创建html页面: 图标不仅可以直接放文本里面, 还可有结合按钮去用。 要使用组件:不…

《网络空间测绘技术与实践》正式发售,让网络空间作战“有图可依”

近日,多位业界专家力推,由知道创宇CEO赵伟、CTO杨冀龙、CSO黑哥(周景平)等撰写的著作《网络空间测绘技术与实践》,正式出版并发售。网络空间已成为继“陆、 海、空、天”后的第五大空间,网络空间亦需要类似…

【uni-app高频面试题——精品一】

uni-app高频面试题谈谈你对uni-app的理解🍕uni中如何为不同的平台设置不同的代码uniapp中封装接口请求相较于微信小程序有什么要注意的uni-app中的本地存储数据和接收数据是什么✊uni-app 路由与页面跳转💪uni-app全局变量怎么定义,怎么获取&…

【Python实战】“特种兵”们的专属游戏助手,助你吃鸡:极品小助手也是棒呆了~(“大吉大利,今W吃鸡”)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 “注意左边,左边有人,打他!” “快上车!&#xff0…

Spring Security(十九)--OAuth2:实现授权服务器(下)--环境准备以及骨架代码搭建

一、前言 本章我们将在上一章代码骨架搭建好的前提下对三种授权类型进行测试以及讲解如何配置授权服务器以颁发刷新令牌,所以本章是一个比较轻松的章节,但是唯一的要求就是需要小伙伴们对上一章内容要完成代码的搭建,否则这章学习也不知道个…

[附源码]计算机毕业设计springboot飞越青少儿兴趣培训机构管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

嘉创房地产冲刺港交所:半年营收4.7亿 现金及现金等价物减少

雷递网 雷建平 11月28日嘉创房地产控股有限公司(简称:“嘉创”)日前递交招股书,准备在港交所上市。半年营收4.73亿嘉创为一家精品住宅物业发展商,主要在大湾区的东莞、惠州及佛山迅速发展的住宅市场(如东莞…

m半分布式JAC联合接纳控制与用户位置信息的垂直切换matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信技术的飞速发展,为支持多种不同无线接入技术、不同系统间协作、不同业务类型及终端差异性等需求,未来的无线网络将是一种协作式的异构网络融合架构&#xff0…

文理导航杂志文理导航杂志社文理导航编辑部2022年第12期目录

专题研究《文理导航》投稿:cn7kantougao163.com 初中科学生活化作业优化策略 唐黎娜; 4-6 揭密2022年新高考1卷解析几何解答题 陈思伽; 7-9 初中数学错题资源的有效运用 王丹; 10-12 浅谈陶行知思想在初中体育教学中的应用 王树华; 13-15 高中数…

Error: error:0308010C:digital envelope routines::unsupported(vue2项目报错)

问题描述 在 终端输入 npm run dev 命令,项目运行报错 Error: error:0308010C:digital envelope routines::unsupported 问题原因 node 版本过高,可以在命令行 输入 node -v 查看版本 因为 Node.js 版本是 17 以上所以会运行失败, Node.j…

MySQL为自动编号的字段赋值

insert users values(NULL,ming,fasdfasdfasd,22,1); 或者 insert users values(DEFAULT,ming,fasdfasdfasd,22,1);

分布式消息中间件RabbitMQ解析

RabbitMQ作为分布式消息存储和转发系统,已广泛使用于分布式系统中。本文简要介绍RabbitMQ相关概念、集群架构和消息转发流程,并与Kafka做了简要对比,以加深理解。 1、RabbitMQ相关概念 1.1 AMQP介绍 消息(Message)是…

【uni-app】详细总结uni-app基础知识和如何配置项目,运行到模拟器和小程序端,附案例和图(建议收藏)

1- uni-app 简介 1.1 介绍 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。 开发者编写一套代码,可发布到 iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。 详细的 uni-app 官方文档&#…

煤炭行业数据库-煤炭价格、消耗量、发电量分省市民用电、工业用电数据

(1)煤炭行业数据库 1、数据来源: WIND数据库煤炭资源网 2、时间跨度:至今 3、区域范围:全国 4、指标说明: 包含指标如下 煤炭价格 国际煤价(周) 秦皇岛煤炭价格(…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——优化网站性能

Caffeine是最好缓存工具 登录凭证和用户有直接关联不适合存放在本地缓存 本地缓存和redis缓存的区别 本地缓存的效率高 整个缓存在使用的过程中详细流程 caffeine的使用 caffeine的使用手册 affeine的导包 设置自定义参数 去优化查询的方法,通常优化的是Servi…

MIT发现语言模型内的事实知识可被修改??

文 | 小伟前言众所周知,自回归语言模型(如GPT-2)里存储着大量的事实知识,比如语言模型可以正确的预测出埃菲尔铁塔所在的城市是巴黎市。那么语言模型是在什么地方存储这些知识呢?我们是否可以修改存储在语言模型里的知识呢?来自于…

流媒体传输 - RTP 荷载 H265

H265 码流结构 H265 码流和是由很多 NAL Unit 组成,所有 NAL Unit 均存在一个 16 位数据的 NAL Unit Header ,一个 NAL Unit Header 的语法如下: ------------------------------|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|----------------|F| Type | La…

电感啸叫产生的根本原因及解决方法

电感啸叫产生的根本原因及解决方法 【摘 要】环形电感或工形电感啸叫问题,在稳压电源电路的设计经常遇到,根据稳压电源芯片的不同和外围电路的不同,解决方法也各不相同,本文档的宗旨是分析电感啸叫的根本原因,并综合各…