Openharmony添加编译自己应用

介绍一下Openharmony如何在庞大的编译构建系统中,增添自己想编译的内容。不定期更新~🐸

gn官方文档:

  • https://gn.googlesource.com/gn/+/main/docs/quick_start.md
  • https://gn.googlesource.com/gn/+/master/docs/reference.md

openharmony官方build文档:

  • build: Compilation and building framework and scripts | 编译构建框架和脚本
  • zh-cn/device-dev/subsystems/subsys-build-module.md · OpenHarmony/docs - Gitee.com
AuthorDateVersionDescription
陈梓归、唐凯文2023-05-15V1.0第一个版本

 1. 编译自带libdrm/modeset程序

OH的源码环境下third_party/libdrm/tests下是有测试程序的,但是不会编译,需要自己写BUILD.gn来进行编译;

1.1 modeset添加BUILD.gn

  • 注意:只有sources和part_name是必选,其他都是可选的;
##  third_party/libdrm/tests/modetest/BUILD.gn
# 使用模板,用import,类似C语言的#include
import("//build/ohos.gni")
# 生成可执行文件,叫作modetest
ohos_executable("modetest"){
    # 依赖编译相关文件
    sources = [
        "buffers.c",
        "cursor.c",
        "modetest.c",
    ]
    cflags = [
        "-Wno-pointer-arith",
    ]
    include_dirs = [
        "../",
        ".",
    ]

    # 配置
    configs = [ "//third_party/libdrm:libdrm_config" ]
    public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

    # 部件内模块依赖
    deps = [
        "//third_party/libdrm:libdrm",
        "//third_party/libdrm/tests/util/:util",
    ]
    public_deps = []
    
    # 可选,缺省在/system/lib64或/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
    # module_install_dir = ""
    # 可选,模块安装相对路径,相对于/system/lib64或/system/lib;如果有module_install_dir配置时,该配置不生效  
    # relative_install_dir = "" 
    # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
    install_images = [
        "system",
    ]
    # 必选,所属部件名称
    part_name = "graphic_standard"
    # 可选,所属子系统名称
    subsystem_name = "graphic"
}

1.2 为 modetest构建依赖util

在前面的BUILD.gn中我们看到了modeset依赖了util,所以我们这里必须为util构建编译脚本!

因为libdrm会自动构建,所以我们不需要自己构建编译啦😄

## third_party\libdrm\tests\util\BUILD.gn
import("//build/ohos.gni")

ohos_static_library("util"){
    sources = [
        "format.c",
        "kms.c",
        "pattern.c",
    ]

    include_dirs = [
        "../",
        "."
    ]

    configs = [ "//third_party/libdrm:libdrm_config" ]

    public_configs = [ "//third_party/libdrm:libdrm_public_config" ]
    cflags = [
        "-Wno-unused-variable",
        "-Wno-sign-compare",
    ]

    deps =[
        "//third_party/libdrm:libdrm",
    ]
    public_deps = []
}

1.3 将modetest加入到OHOS编译系统

这里比较简单,可以搜一搜哪个编译的依赖libdrm,然后选择一个加入到BUILD.gn即可

  • 搜索//third_party/libdrm:libdrm
 deps = [
    "//third_party/libdrm:libdrm",
    "//third_party/libdrm/tests/util/:util",
    "//third_party/libdrm/tests/modetest/:modetest",
  ]

1.4 编译

  • --build-target=ohos_executable的名字

编译命令:./build.sh --product-name d2000 --target-cpu arm64 --build-target=modeset --jobs=100

  • 报错:
../../third_party/libdrm/tests/util/pattern.c:988:8: error: unused variable 'mem_base' [-Werror,-Wunused-variable]
  • 解决:
第一个方法:屏蔽这行
第二个方法:修改cflags参数
注意这里的cflags需要添加到libdrm下面的BUILD.gn才可以,不然也会编译不过!
修改libdrm文件下面的BUILD.gn加入
        "-Wno-unused-variable",
        "-Wno-sign-compare",
        "-Wno-pointer-sign",
        "-Wno-deprecated-declarations",

2. 添加自己应用

2.1 在libdrm下建立对应的fovt_app文件夹

  • 增加对应的gn文件和.c文件,然后按照上面的方法增加到一个编译里面去;
  • gn
#fovt test application
import("//build/ohos.gni")

#单独编译它
#./build.sh --product-name d2000 --target-cpu arm64 --build-target=atomic_test
ohos_executable("atomic_test"){
    sources = [
        "atomic_test.c",
    ]
    output_name = "atomic_test"

    cflags = [
        "-Wno-pointer-arith",
    ]

    include_dirs = [
        "../",
        ".",
    ]

    configs = [ "//third_party/libdrm:libdrm_config" ]

    public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

    deps = [
        "//third_party/libdrm:libdrm",
    ]

    public_deps = []

    install_images = [
        "system",
    ]
    part_name = "graphic_standard"
    subsystem_name = "graphic"
}

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

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

相关文章

Redis 消息队列 Stream

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 💕💕 推荐:体系化学习Java(Java面试专题&#…

C语言写网络爬虫总体思路

使用C语言编写爬虫可以实现网络数据的快速获取和处理,适用于需要高效处理海量数据的场景。与其他编程语言相比,C语言具有较高的性能和灵活性,可以进行底层操作和内存管理,适合处理较复杂的网络请求和数据处理任务。 但是&#xf…

Redis学习总结(二)

AOF 为什么是在执行完命令之后记录日志? 关系型数据库(如 MySQL)通常都是执行命令之前记录日志(方便故障恢复),而 Redis AOF 持久化机制是在执行完命令之后再记录日志。AOF 记录日志过程为什么是在执行完命…

【LeetCode】HOT 100(7)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

chatgpt赋能python:Python创建SEO文章的指南

#Python创建SEO文章的指南 在当今数字化世界中,SEO(搜索引擎优化)对于拥有一个成功的在线业务至关重要。SEO文章不仅可以帮助提高网站的排名,还可以吸引更多的访问者并提高转化率。在本文中,我们将介绍如何使用Python…

数据分析第17课seaborn绘图

关系型绘图 seaborn.relplot() 这个函数功能非常强大,可以用来表示多个变量之间的关联关系。默认情况下是绘制散点图(散点图是看到变量与变量之间相关性最优的一个图形),也可以绘制线性图,具体绘制什么图形是通过kind参数来决定的。实际上以下两个函数就是relplot的特例…

2023网安面试题170道,轻松应对面试

最近有不少小伙伴跑来咨询: 想找网络安全工作,应该要怎么进行技术面试准备? 工作不到 2 年,想跳槽看下机会,有没有相关的面试题呢? 为了更好地帮助大家高薪就业,今天就给大家分享两份网络安全工…

(1Gbit)MT28EW01GABA1LPC-0SIT、MT28EW01GABA1HPC-0SIT FLASH - NOR 存储器

MT28EW01GABA1LPC-0SIT、MT28EW01GABA1HPC-0SIT 1Gbit并行NOR闪存器件具有较高的密度、就地执行 (XiP) 性能和架构灵活性,可满足汽车、消费类和移动产品的设计要求。该器件非常适合用于GPS/导航、汽车后视摄像头、手机、智能手机和电子阅读器。该器件还具有较宽的温…

使用OpenFlow和Ryu控制器实现网络交换机的软件定义网络(SDN)控制

使用OpenFlow和Ryu控制器实现网络交换机的软件定义网络(SDN)控制 (1)环境介绍 硬件环境:系统最低要求为2个CPU 、2 GB内存。 拓扑介绍:云平台具体安装拓扑如图5-4所示。 图5-4 云平台安装拓扑 搭建云平…

NodeJS MongoDB⑦

文章目录 ✨文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持😘前言Node&MongoDB 第一步 连接数据库 第二步 创建User Mongodb模型 第三步 简单使用 Mongodb命令 第四步 规范使用 Mongodb命令 &#xff08…

解数独--难的一批

1题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数…

RHEL7同步ntp时间

RHEL7同步ntp时间 RHEL7同步ntp时间测试ntp服务器是否可用抓包分析ntp 查看NTP同步情况ntp服务器配置文件将ntp配置迁移到chronytimedatectl设置时区和时间设置UTC或RTC时间查看所有可用时区查看当前时区设置系统时区启用夏令时timedatectl时间同步timedatectl修改当前日期时间…

基于ADME的分子过滤和 lead-likeness标准

T002 基于ADME的分子过滤和 lead-likeness标准 项目来源于TeachOpenCADD 本文目标 在药物设计的背景下,重要的是通过例如它们的物理化学性质来过滤候选分子。 在这个教程中,从 ChEMBL ( Talktorial T001 )获得的化合物将按照 Lipinsik 的五法则进行…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码,通常适用于前向纠错。在分组码中,编码器产生的 n 个码元的一个码组,完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

【马蹄集】第十四周作业

第十四周作业 目录 MT2134 泡泡MT2135 调整队伍MT2141 快排变形MT2142 逆序MT2143 线段树 MT2134 泡泡 难度:黄金    时间限制:1秒    占用内存:128M 题目描述 小码哥小时候喜欢吹泡泡,有一次他吹出了 n n n 个一样小的泡泡&…

SSM-Spring+SpringMVC+MyBatis框架的水果商城网站

项目介绍 主要功能: 前端用户购物端: ①角色信息:用户注册、用户登录、个人中心 ②个人中心:基本信息、我的订单、商品收藏、修改密码 ③首页管理:公告、留言、折扣大促销、热门商品 ④商品详情:收藏、加入…

使用阿里云OSS实现图片文件上传

说明&#xff1a;注册用户时&#xff0c;经常会用到上传头像。文件的上传/接收与一般文本数据不同。 一、创建Demo页面 先准备一个Demo页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图片上传…

影响电磁铁磁力大小的因素有哪些

影响电磁铁磁力大小的因素主要有四个&#xff0c;一是缠绕在铁芯上线圈的圈数&#xff0c;二是线圈中电流的强度&#xff0c;三是缠绕的线圈与铁芯的距离&#xff0c;四是铁芯的大小形状。 首先要了解电磁铁的磁性是如何产生的&#xff0c;通电螺线管的磁场&#xff0c;由毕奥&…

总结895

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff09;…

JMM如何实现volatile写/读的内存语义

内存屏障类型表 StoreLoad Barriers是一个“全能型”的屏障&#xff0c;它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障&#xff08;其他类型的屏障不一定被所有处理器支持&#xff09;。执行该屏障开销会很昂贵&#xff0c;因为当前处理器通常要把写缓冲区中的数…