鸿蒙北向开发 ubuntu20.04 gn + ninja环境傻瓜式搭建闭坑指南 ...

莱莱  论坛元老 | 2024-8-12 11:03:18 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1028|帖子 1028|积分 3084

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ninja跟gn都是比较时髦的东西,由歪果仁维护,假如走下载源码并编译这种流程的话需要走github跟google官网下载,国内的用网环境相信各位傻瓜都知道,github跟google这几年基本是属于连不上的状态,好在你看的鸿蒙项目跟国内的一些软件大厂已经帮你爬过梯子了,ninja工具跟gn工具已经被他们搬到国内来了
一.安装ninja
关于ninja的介绍网上还是比较多的,这里就不多讲了.贴一个写的不错的帖子各位可以去看看
ninja
相信你看过上面的帖子,对ninja基本上算是有个不错的概念认知,各个社区都集成了ninja,那么为什么各人都集成ninja呢?ninja专注于构建速度,最关键的是ninja可以配合cmake一起利用且ninja极其的小巧轻巧
ninja的安装比较简单
  1. $ sudo apt install ninja-build
复制代码
 利用如下指令查看安装的ninja版本,能查出版本即证明ninja安装成功
  1. $ ninja --version
复制代码

二.安装gn,源码编译
gn的安装稍微有点麻烦,gn需要前置clang,我当前的假造机是ubuntu20.04lts版本

这个版本的ubuntu apt源中配置了clang,直接通过如下指令下载
  1. sudo apt install clang
复制代码
因为我这台假造机已经安装过了clang,如下提示表示我的clang已经是最新版本了

利用
  1. $ clang --version
复制代码
查看当前clang版本

gn的源码编译需要clang-8以上的支持,各位根据本身当前体系环境善用百度安装clang-8以上版本
下载gn源码
gn的源码可以从多个地方下载,google官方的跟GitHub上有fork的仓库的需要科学上网,唯一能用的就是鸿蒙提供的Gitee的仓库
鸿蒙gitee
但是鸿蒙gitee下载的有点标题,下载下来后编译出来的测试步伐有标题,我就没有继续了,具体什么缘故因由还不太清楚

刚好我手里有开源鸿蒙4.1主干版本,我从主干上复制出来了gn源码,现已上传到csdn下载
gn 源码下载
将源码复制到ubuntu体系里面
进入gn目次
  1. $ cd gn
  2. $ python build/gen.py
  3. $ ninja -C out
复制代码

如上表示编译执行成功,跑一下测试代码
  1. $ ./out/gn_unittests
复制代码

如上表示测试成功
编译成功后,将gn复制到/usr/bin目次下
  1. $ sudo cp ./out/gn /usr/bin
复制代码

/usr/bin 目次就是体系默认添加环境变量的目次,将gn放到这个目次后可以在任一新建终端测试gn是否可用
新建终端:输入 gn help

如上表示gn安装成功
三.简单的测试
gn测试命令

ninja命令

建议初学者以gn仓为例举行学习,首先辈入gn/examples/simple_build文件夹,该文件夹下BUILD.GN形貌了一个最基本的C++文件的编译配置,如下可执行步伐hello依赖了动态库文件hello_shared以及静态库hello_static。
  1. # Copyright 2014 The Chromium Authors. All rights reserved.
  2. # Use of this source code is governed by a BSD-style license that can be
  3. # found in the LICENSE file.
  4. executable("hello") {
  5.   sources = [ "hello.cc" ]
  6.   deps = [
  7.     ":hello_shared",
  8.     ":hello_static",
  9.   ]
  10. }
  11. shared_library("hello_shared") {
  12.   sources = [
  13.     "hello_shared.cc",
  14.     "hello_shared.h",
  15.   ]
  16.   defines = [ "HELLO_SHARED_IMPLEMENTATION" ]
  17. }
  18. static_library("hello_static") {
  19.   sources = [
  20.     "hello_static.cc",
  21.     "hello_static.h",
  22.   ]
  23. }
复制代码
在目次下执行gn gen -C out同时进入out文件夹下,分别执行以下命令。


  • gn ls out
    1. //:hello
    2. //:hello
    3. _shared
    4. //:hello
    5. _static
    复制代码
    该命令列出了gn编译过程中的所有target列表,可以看出,包罗一个可执行步伐//:hello
    、一个动态库//:hello
    _shared和一个静态库//:hello
    _static。
  • gn refs out //:hello
    _shared
    1. //:hello
    复制代码
​ gn refs列出了哪些目的依赖了目的//:hello
_shared,从上面可以看出目的//:hello
依赖了目的//:hello
_shared,从GN配置文件也可以看出来。


  • gn desc out //:hello
    _shared
    1. Target //:hello
    2. _sharedtype: shared_librarytoolchain: //build/toolchain:gccvisibility  *metadata  {  }testonly  falsecheck_includes  trueallow_circular_includes_fromsources  //hello_shared.cc  //hello_shared.hpublic  [All headers listed in the sources are public.]configs (in order applying, try also --tree)  //build:compiler_defaultsoutputs  //out/libhello_shared.socflags  -fPIC  -pthreaddefines  HELLO_SHARED_IMPLEMENTATIONDirect dependencies (try also "--all", "--tree", or even "--all --tree")externs
    复制代码
    gn desc查看目的//:hello
    _shared的所有信息,这个命令非常实用,记载了目的的visibility、metadata、cflags、defines等紧张信息,建议开发者多利用该功能举行调试。
  • gn path out //:hello
    //:hello
    _shared
    1. //:hello
    2. --[private]-->//:hello
    3. _shared1 non-data path found. It is not public.
    复制代码
    查看两个目的之间的依赖路径。从上面我们可以看出,//:hello
    和//:hello
    _shared是私有依赖的关系,且两者是直接依赖的。
  • gn args --list out
    1. current_cpu
    2.     Current value (from the default) = ""
    3.       (Internally set; try `gn help current_cpu`.)
    4. current_os
    5.     Current value (from the default) = ""
    6.       (Internally set; try `gn help current_os`.)
    7. host_cpu
    8.     Current value (from the default) = "x64"
    9.       (Internally set; try `gn help host_cpu`.)
    10. host_os
    11.     Current value (from the default) = "linux"
    12.       (Internally set; try `gn help host_os`.)
    13. target_cpu
    14.     Current value (from the default) = ""
    15.       (Internally set; try `gn help target_cpu`.)
    16. target_os
    17.     Current value (from the default) = ""
    18.       (Internally set; try `gn help target_os`.)
    复制代码
    查看编译过程中的gn参数列表。
  • gn check out
    1. Header dependency check OK
    复制代码
    查看编译过程中的头文件依赖是否正确。
  • gn format find . -name "*.gni" -o -name "*.gn"
    上述命令可以格式化当前文件夹下的所有GN文件,包括.gni文件和.gn文件。

下面是ninja命令测试 在simple_build目次下执行如下指令


  • ninja -C out -v
    1. ninja: Entering directory `out'
    2. [1/6] g++ -MMD -MF obj/libhello_static.hello_static.o.d   -fPIC -pthread  -c ../hello_static.cc -o obj/libhello_static.hello_static.o
    3. [2/6] g++ -MMD -MF obj/libhello_shared.hello_shared.o.d -DHELLO_SHARED_IMPLEMENTATION  -fPIC -pthread  -c ../hello_shared.cc -o obj/libhello_shared.hello_shared.o
    4. [3/6] g++ -MMD -MF obj/hello.hello.o.d   -fPIC -pthread  -c ../hello.cc -o obj/hello.hello.o
    5. [4/6] rm -f obj/libhello_static.a && ar rcs obj/libhello_static.a obj/libhello_static.hello_static.o
    6. [5/6] g++ -shared  -o ./libhello_shared.so -Wl,-soname=libhello_shared.so @libhello_shared.so.rsp
    7. [6/6] g++ -Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link= -o hello -Wl,--start-group @hello.rsp  -Wl,--end-group
    复制代码
    该命令可以查看所有编译目的的具体编译命令,可以看出,首先编译出了libhello_static.hello_static.o、libhello_shared.hello_shared.o、hello.hello.o三个目的文件,并将目的文件放在obj文件夹下,末了链接成hello的可执行步伐。
  • ninja -t deps
    1. obj/libhello_static.hello_static.o: #deps 2, deps mtime 1681441611760382343 (VALID)
    2.     ../hello_static.cc
    3.     ../hello_static.h
    4. obj/libhello_shared.hello_shared.o: #deps 2, deps mtime 1681441611760382343 (VALID)
    5.     ../hello_shared.cc
    6.     ../hello_shared.h
    7. obj/hello.hello.o: #deps 3, deps mtime 1681441611768382257 (VALID)
    8.     ../hello.cc
    9.     ../hello_shared.h
    10.     ../hello_static.h
    复制代码
    查看目的的依赖关系,如obj/libhello_static.hello_static.o目的文件依赖了../hello_static.cc源文件和../hello_static.h头文件。
  • ninja -t targets all
    1. build.ninja: gn
    2. obj/hello.hello.o: cxx
    3. hello: link
    4. obj/libhello_shared.hello_shared.o: cxx
    5. libhello_shared.so: solink
    6. obj/libhello_static.hello_static.o: cxx
    7. obj/libhello_static.a: alink
    8. hello_shared: phony
    9. hello_static: phony
    10. :hello: phony
    11. :hello_shared: phony
    12. :hello_static: phony
    13. all: phony
    复制代码
    列出ninja阶段的所有编译目的以及编译利用的工具。
  • ninja -t commands hello
    1. g++ -MMD -MF obj/hello.hello.o.d   -fPIC -pthread  -c ../hello.cc -o obj/hello.hello.o
    2. g++ -MMD -MF obj/libhello_shared.hello_shared.o.d -DHELLO_SHARED_IMPLEMENTATION  -fPIC -pthread  -c ../hello_shared.cc -o obj/libhello_shared.hello_shared.o
    3. g++ -shared  -o ./libhello_shared.so -Wl,-soname=libhello_shared.so @libhello_shared.so.rsp
    4. g++ -MMD -MF obj/libhello_static.hello_static.o.d   -fPIC -pthread  -c ../hello_static.cc -o obj/libhello_static.hello_static.o
    5. rm -f obj/libhello_static.a && ar rcs obj/libhello_static.a obj/libhello_static.hello_static.o
    6. g++ -Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link= -o hello -Wl,--start-group @hello.rsp  -Wl,--end-group
    复制代码
    查看编译单个目的的具体编译命令。
第一个hello world
进入out目次,运行hello


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表