使用如下的fx子命令build编译fuchsia代码。实际上运行的是目录tools/devshell/下的编译脚本build。fx将调用ninja运行两次:第一次编译zircon,第二次编译fuchsia。

~/fuchsia$ scripts/fx build

其实,每个fx的子命令都对应着一个tools/devshell目录下的脚本文件:

~/fuchsia$ ls tools/devshell/
add-update-source  cp               lib                 mkzedboot     README.md           serial         shell         wait
aemu               doctor           list-boards         netaddr       reboot              serve          ssh
args               exec             list-packages       netboot       run                 serve-updates  symbolize
build              flash            list-products       netls         run-host-tests      set            syslog
~/fuchsia$ 

当然,也可以使用fx build命令单独编译zircon。如下编译zircon的default目标:

~/fuchsia$ scripts/fx build zircon/default
ninja: Entering directory `/home/kai/fuchsia/out/default.zircon'
[65/65] STAMP obj/default.stamp
~/fuchsia$ 

或者,单独编译fuchsia的目标target。如下编译fuchsia的default目标,由于依赖于zircon,首先要编译zircon,之后再是编译fuchsia目标。

~/fuchsia$ scripts/fx build default
ninja: Entering directory `/home/kai/fuchsia/out/default.zircon'
ninja: no work to do.
ninja: Entering directory `/home/kai/fuchsia/out/default'
[1/1] Regenerating ninja files
[355/355] STAMP obj/default.stamp
~/fuchsia$ 

来看一下tools/devshell/build脚本中的主函数main。如果zircon的编译目录不存在,调用fx-gen函数创建(tools/devshell/lib/var.sh),此函数使用buildtools/gn脚本创建编译目录。如上所示,如果指定编译fuchsia的target(如上的default),脚本将自动为zircon_target增加一个default目标。即编译fuchsia时将先编译zircon的default目标。随后调用run-ninja函数进行zircon相关编译,编译目录指定-C为:out/default.zircon。通常情况下参数${zircon_targets[@]}为空。

function main {if [ ! -d "$ZIRCON_BUILDROOT" ]; thenecho >&2 "Re-running gn gen first (missing $ZIRCON_BUILDROOT)"fx-gen || returnfiif [ ${#fuchsia_targets[@]} -ne 0 ]; thenzircon_targets+=(default)firun-ninja -C "${ZIRCON_BUILDROOT}" "${switches[@]}" "${zircon_targets[@]}"

在zircon编译完成之后,如果只是编译zircon相关target,主函数至此结束。如果编译zircon的default目标是为了准备编译fuchsia目标,接下来再次调用run-ninja编译fuchsia。编译目录指定为:out/default。

  # If there were explicit Zircon targets and no other explicit targets,# the Zircon run was enough by itself.  Otherwise Zircon default is# a prerequisite for any Fuchsia target (including implicit default).if [ ${#fuchsia_targets[@]} -ne 0 -o ${#zircon_targets[@]} -eq 0 ]; thenrun-ninja -C "${FUCHSIA_BUILD_DIR}" "${switches[@]}" "${fuchsia_targets[@]}"fuchsia_status=$?if [ "${status}" -eq 0 ]; thenstatus="${fuchsia_status}"fifireturn "${status}"
}

简化一下,函数run-ninja仅是封装了fx-run-ninja函数(tools/devshell/lib/vars.sh),最终调用buildtools/ninja脚本执行编译。

function run-ninja {(fx-run-ninja "${FUCHSIA_DIR}/buildtools/ninja" "$@") || exit
}

脚本buildtools/ninja如下。只是给SCRIPT_ROOT和TOOL_NAME两个变量赋值,调用exec_tool.sh脚本。

readonly SCRIPT_ROOT="$(cd $(dirname ${BASH_SOURCE[0]} ) && pwd)"
readonly TOOL_NAME=$(basename "$0")source "${SCRIPT_ROOT}/exec_tool.sh"

脚本exec_tool.sh如下。根据系统架构获取动编译工具的路径,执行编译。例如最终的ninja路径为:buildtools/linux-x64/ninja。

case "$(uname -s)" inDarwin)readonly HOST_PLATFORM="mac-x64";;Linux)readonly HOST_PLATFORM="linux-x64";;
esacreadonly TOOL_PATH="${SCRIPT_ROOT}/${HOST_PLATFORM}/${TOOL_NAME}"exec "${TOOL_PATH}" "$@"

ninja的编译规则文件默认为build.ninja,如下out/default.zircon目录下的build.ninja文件。

~/fuchsia$ ls -l  out/default.zircon/build.ninja*
-rw-rw-r-- 1 kai kai 1023201 Jun 13 02:46 out/default.zircon/build.ninja
-rw-rw-r-- 1 kai kai   49635 Jun 13 02:46 out/default.zircon/build.ninja.d
~/fuchsia$

使用如下的ninja命令工具deps可查看功能的依赖关系(只显示一部分),目标cowsay.cowsay.o的依赖关系包括一个C文件和多个头文件。

~/fuchsia$ buildtools/linux-x64/ninja -C out/default -t deps
obj/examples/cowsay/cowsay.cowsay.o: #deps 8, deps mtime 1560228190 (VALID)../../examples/cowsay/cowsay.c../../zircon/third_party/ulib/musl/include/stdio.h../../zircon/third_party/ulib/musl/include/features.h../../zircon/third_party/ulib/musl/include/bits/alltypes.h../../zircon/third_party/ulib/musl/include/bits/null.h../../buildtools/linux-x64/clang/lib/clang/9.0.0/include/stddef.h../../zircon/third_party/ulib/musl/include/string.h../../zircon/third_party/ulib/musl/include/strings.h

ninja运行产生的依赖关系和日志文件位于编译目录下,分别为.ninja_deps和.ninja_log。

~/fuchsia$ ls -l out/default/.ninja_*
-rw-rw-r-- 1 kai kai 7086288 Jun 11 06:18 out/default/.ninja_deps
-rw-rw-r-- 1 kai kai 3025583 Jun 13 02:48 out/default/.ninja_log
~/fuchsia$ 

ninja工具命令browse可生成依赖图,启动一个运行在8000端口的web服务,可通过浏览器查看。可指定本地监听地址:--host=192.168.1.x,也可指定监听端口,如--port=8080。

~/fuchsia$ buildtools/linux-x64/ninja -C out/default -t browse
Web server running on localhost:8000, ctl-C to abort...
Web server pid 91479

END

Fuchsia系统ninja编译相关推荐

  1. Fuchsia 系统的编译和探索

    版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com 最近下载了 Fuchsia 源代码并编译好后跑起来进行了简单的探索,并且跑了几个测试程序,现在把中途 ...

  2. Android系统快速编译方式ninja

    随着Android版本的更迭,尤其是Androd10和Android11源码的编译,单编模块的时间也特别慢,每次都需要半个小时甚至更长,因为每次单编都会重新加载所有mk文件,再生成ninja编译,此过 ...

  3. fushia系统的编译

    本文讲述在linux环境下fushia系统的编译环境搭建(系统ubuntu 14.04): Fuchsia是Google主要为IoT(物联网).PC以及移动端开发的新一代只能操作系统.与之前的Andr ...

  4. 02-20210222华为海思Hi3518EV300鸿蒙系统的编译

    02-20210222华为海思Hi3518EV300鸿蒙系统的编译 2021/2/22 15:15 1.源码获取: https://device.harmonyos.com/cn/docs/start ...

  5. 鸿蒙系统编译怎样收费的,深度解析鸿蒙系统的编译流程

    1.准备工作 我的本地代码是基于最新发布的OpenHarmony 1.1.0 LTS(2021-04-01)版本抓取的,代码根目录OHOS1_1_0LTS: $repo init -u https:/ ...

  6. android 编译ninja,Ninja编译过程分析

    在Android N的系统上,初次使用了Ninja的编译系统.对于Ninja,最初的印象是用在了Chromium open source code的编译中,在chromium的编译环境中,使用ninj ...

  7. deepin系统下编译使用libtorrent

    deepin系统下编译使用libtorrent 安装openssl 查看系统是否安装ssl openssl version -a 安装openssl sudo apt install openssl ...

  8. fushia系统的编译环境搭建

    本文讲述在Linux环境下fushia系统的编译环境搭建(系统ubuntu 14.04): Fuchsia是Google主要为IoT(物联网).PC以及移动端开发的新一代只能操作系统.与之前的Andr ...

  9. ubuntu系统下载编译android源码

    在ubuntu系统下编译android需要注意的事项: 1. 参考http://source.android.com/中的安装说明. 2. 安装JDK6中碰到的问题可以参考http://hi.baid ...

最新文章

  1. mysql多表分析_mysql多表查询实例结果及分析-2017.12.14
  2. 九妹带你走向 架构师
  3. [剑指offer][JAVA]面试题第[22]题[j剑指offer][双指针][快慢指针]
  4. 苹果 macOS Monterey 桌面抽象风格不好看,如何换成自己喜欢的照片?
  5. 「洛谷3469」「POI2008」BLO-Blockade【Tarjan求割点】
  6. 蓝牙软件测试指标,手机软件测试蓝牙.pdf
  7. 点云仿射变换—open3d python
  8. centos(11)-ps进程管理
  9. oracle导入dmp文件
  10. 基于tensorflow2的手写中文数字识别(自己创建数据集)
  11. 用matlab实现运筹学最短路问题,运筹学最短路问题实验报告
  12. mysql求回购率_回购利率计算方法
  13. 如何在CSS中应用多个转换?
  14. 谷歌被墙,怎样给谷歌浏览器加入迅雷下载插件
  15. npm run build命令运行后报错 npm ERR! missing script: build
  16. C语言域名解析的简单实现
  17. CAN收发器与CAN控制器
  18. git gerrit 拉取本地服务器代码出错Unable to negotiate with XX.XX.XX.XX port XX: no matching key exchange me
  19. 惠普星11x2二合一平板电脑评测
  20. 江西计算机职业学校排名2015,2015江西专科学校排名及排行榜

热门文章

  1. 用友致远U8-OA getSessionList jsp信息泄露复现
  2. 给Python漫画分集标题目录下载工具添加从列表文件下载功能
  3. 数据科学与大数据技术专业有哪些就业方向?
  4. Android 实现视屏播放器、边播边缓存功能,附源码
  5. 艾永亮:从产品功能需求到打造超级产品过程中,企业经历了什么?
  6. matlab 怎么控制ccd,CCD camera的一般控制流程及些许困惑
  7. 集成开发环境PL/SQL Developer v13.0新功能(二)——PL / SQL美化功能增强
  8. HTTPS下导出Excel, ie浏览器报“IE 无法下载 无法打开该站点” 解决办法
  9. 淘口令解析api接口_淘口令解析API免费接口,淘口令解析API连接器接口付费定制-进制数据...
  10. C# excel转换Json