ArkUI-X编译规范
目的和范围
ArkUI-X编译规范用于指导开发者规范地编写和修改编译相关的源码、脚本和工具,保证编译过程正确,可信,可重复和高效。
术语
编译框架
ArkUI-X的编译系统就是用来构建ArkUI-X SDK的一组软件,主要由模块编译模板,配置框架、发布框架组成。
ArkUI-X的编译系统主要由GN(Generate Ninja)语言和Python编写完成,通常GN用于描述编译过程和依赖关系,Python用于执行特定的编译目标
本文主要描述GN的相关编写要求。
GN
GN : Generate Ninja, 开源的编译工具,使用.gn文件定义和描述编译过程,并生成最终的编译过程清单,即ninja文件。
Ninja
Ninja: 开源的编译执行工具,高效执行ninja文件描述的编译过程清单。
GN 编写规范
规则1.1
禁止 :在gn中调用外部编译工具编译软件模块。 反例 :在gn中使用action调用automake和Make来编译三方组件。 要求 :需要将外部组件移植成gn的编译形式,避免编译过程对环境产生不必要的依赖,而且可获得编译框架提供的公共能力,包括不限于:安全编译选项,ASAN等。 例外 :Linux Kernel 编译框架实际完成的用户态程序编译,内核完全可以在编译框架之外完成独立编译。某些平台实现为了实现一键编译,使用gn将内核编译加在编译过程中,是可以接受的。
规则1.2
禁止 :禁止在模块的gn文件中,再次添加编译系统已经添加的安全编译选项。
反例 :在模块的编译添加 -fstack-protector-strong
要求 :对于全局已经添加的默认选项,模块开发者应当知晓,不需要为了满足内外部规则再次添加。
| 编译选项 | 编译参数 | 默认值 |
|---|---|---|
| 栈保护 | -fstack-protector-strong | 开 |
| Fortify Source | -D_FORTIFY_SOURCE=2 -O2 | 开 |
规则1.3
禁止 :在gn中添加和默认编译选项相反的编译选项。
反例 :在自研模块中添加 -wno-unused 以消除编译告警。
要求 :默认的编译选项代表了系统的默认能力,自研模块有特殊情况需要去掉部分能力,必须有足有的理由。
例外 :移植三方组件,或者使用因为三方组件时,可根据三方组件的要求覆盖默认的编译选项。
规则 2.1
要求 :使用gn format 对添加或者修改的gn文件进行格式化,满足格式和排版的需求。
规则 2.2
建议 :编写action时,使用Python而不是shell。 说明 : Python 环境更容易保持统一,可以比较容易的多重操作系统上运行,并且扩展性可读性可测试更好。
规则 2.3
规则:禁止在gn和ninja执行过程修改源码目录的内容。 说明:包括但不限于给源码目录打patch,向源码目录中拷贝,在源码目录中执行编译,在源码目录生成中间文件等。
规则 2.4
规则:编译脚本的编码格式设置为utf-8,换行符设置为unix格式。 反例 :在windows上编写脚本后,使用了中文注释并保存为本地编码。