# [gn+ninja学习 0x07] ninja构建系统学习

举报
zhushy 发表于 2022/11/09 10:09:54 2022/11/09
【摘要】 [gn+ninja学习 0x07] ninja构建系统学习OpenHarmony使用gn+ninja来维护开源项目的构建。之前没有接触过gn+ninja,是时候系统性的来学习下了。边学边记录下学习过程,希望对同样需要学习gn+ninja的朋友有所帮助。这一篇,我们来学习下GN参考文档GN Reference中内容Language and grammar for GN build files...

[gn+ninja学习 0x07] ninja构建系统学习

OpenHarmony使用gn+ninja来维护开源项目的构建。之前没有接触过gn+ninja,是时候系统性的来学习下了。边学边记录下学习过程,希望对同样需要学习gn+ninja的朋友有所帮助。

这一篇,我们来学习下GN参考文档GN Reference中内容Language and grammar for GN build files,通过该文的学习来掌握编写GN构建文件的需要具备的知识。

1、 Ninja简介

Ninja 是 Google 推出的注重速度的轻巧构建工具,通过将编译任务并行组织,大大提高了构建速度。Ninja 的目标是成为汇编程序。

构建系统在需要做出决策时变得缓慢。当您处于编辑 - 编译周期时,您希望它尽可能快 - 您希望构建系统执行必要的最少工作以确定需要立即构建的内容。

Ninja 包含描述任意依赖图所需的最基本功能。它缺乏语法使得无法表达复杂的决策。

相反,Ninja 旨在与生成其输入文件的单独程序一起使用。生成器程序(如 ./configure 在 autotools 项目中找到的)可以分析系统依赖性并尽可能多地做出尽可能多的决策,以便增量构建保持快速。超越自动工具,甚至构建时决定,比如 “我应该使用哪个编译器标志?” 或 “我应该构建调试或发布模式二进制文件?” 属于 .ninja 文件生成器。

1.1、设计目标:

  • 非常快速(即即时)增量构建,即使对于非常大的项目也是如此。
  • 关于如何构建代码的政策很少。不同的项目和更高级别的构建系统对如何构建代码有不同的看法; 例如,应该在源代码旁边构建对象还是应该将所有构建输出放到一个单独的目录中?是否有一个 “包” 规则来构建项目的可分发包?通过尝试允许实施这些决策而不是选择来实现这些决定,即使这会导致更多的冗长。
  • 获取依赖关系是正确的,特别是使用 Makefiles 很难得到的情况(例如,输出需要对用于生成它们的命令行的隐式依赖;要构建 C 源代码,您需要使用 gcc 的 -M 标志来实现标头依赖性)。
  • 当方便和速度发生冲突时,请选择速度。

1.2、一些明确的非目标:

  • 手动编写构建文件的方便语法。 你应该使用另一个程序生成你的Ninja文件。这就是我们如何回避许多政策决定。
  • 内置规则。开箱即用,Ninja 没有例如编译 C 代码的规则。
  • 构建的构建时自定义。选项属于生成忍者文件的程序。
  • 构建时决策能力,例如条件或搜索路径。做决定很慢。
    重申一下,Ninja 比其他构建系统更快,因为它非常简单。您必须告诉 Ninja 在创建项目 .ninja 文件时要做什么。

6、小结

本篇,我们学习了GN构建文件的语言语法,该文的学习可以掌握编写GN构建文件的需要具备的知识。

参考资料

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。