编译配置指导

产品配置规则

产品的配置文件为config.json,放在vendor目录的产品目录下,其中包含产品的详细信息,以及产品所包含的子系统及部件列表。关于新增并编译产品,配置方法请参考产品配置规则

子系统配置规则

子系统的配置文件为build仓下的subsystem_config.json,其中包含所有子系统的配置规则。详细请参考子系统配置规则

部件配置规则

部件的配置文件为bundle.json,放在部件源码的根目录下,其中配置了部件的各项属性。关于新增并编译部件,详细请参考部件配置规则

模块配置规则

模块的配置文件为BUILD.gn,其中配置了构建目标的所有参数。关于新增并编译模块,详情请参考模块配置规则

特性配置规则

在部件的bundle.json文件中通过feature_list来声明部件的feature列表,在部件内可以定义feature值,开发者可以根据feature决定部分代码或代码参与编译,也可以为模块进行代码级差异化配置,详细请参考特性配置规则

部件化检查规则

编译构建提供了部件化检查的能力,在新增部件时,会根据生成的全量部件列表与编译目标的部件列表进行比对,如果编译目标的部件列表有部件名或者子系统名不存在于全量部件列表的,会被认为是不合法的,编译报错。这一检查规则的实现在build仓下的hb/util/loader/load_ohos_build.py文件中。

external-deps使用规范

在添加模块的时候,需要在BUILD.gn中声明它的依赖。依赖分为两种:部件内依赖deps和部件间依赖external_deps。 -部件内依赖示例:

 import("//build/ohos.gni")
 ohos_shared_library("module1") {
   ……
   part_name = "part1"   # 必选,所属部件名称
   ……
 }
import("//build/ohos.gni")
ohos_shared_library("module2") {
  ……
  deps = [
    "module1的gn target",
  ……
 ]                        # 部件内模块依赖
part_name = "part1"       # 必选,所属部件名称
}

-部件间依赖示例:

import("//build/ohos.gni")
ohos_shared_library("module1") {
  ……
  part_name = "part1"   # 必选,所属部件名称
  ……
}
import("//build/ohos.gni")
ohos_shared_library("module2") {
  ……
  external_deps = [
    "part1:module1",
  ……
  ]                      # 部件间模块依赖,这里依赖的模块必须是依赖的部件声明在inner_kits中的模块
  part_name = "part2"    # 必选,所属部件名称
}

详情请参考deps、external_deps的使用

模板使用规范

OpenHarmony项目中,要求开发者尽量使用内置模板,内置模板以ohos开头,常见模板及配置规则请参考模板示例

cflags配置规则

开发者想对模块新增cflags编译参数,可在BUILD.gn文件的模板中配置cflags参数,示例如下:

    ohos_shared_library("example") {
      ...
      cflags = [ "-fxxx" ]
      cflags_cc = [ "-fno-xxx" ]    # -fno-xxx会覆盖-fxxx,使-fxxx失效
      ...
    }

其中cflags对C,C++源码生效,cflags_c仅对C源码生效,cflags_cc仅对C++源码生效。编译参数根据配置顺序先后,后配置的参数会覆盖先配置的参数。cflags系列参数使用指导

FAQ

如何配置gn变量

对于单个或少数模块生效的变量,推荐声明在模块对应的*.gni中 对于全局或者多数模块生效的,推荐声明在build/ohos_var.gni中 对于全局生效且和工具链相关的,推荐声明在build/config/BUILDCONFIG.gn中 并在编译命令中添加下面命令即可完成使能。

--gn-args enable_cxx=false

如何新增编译参数

以新增--ccache选项为例,其默认值为false,用于调用ccache编译缓存,加快编译速度。步骤如下: 1,参数注册:在build/hb/resources/args/default/buildargs.json中进行注册参数,该参数在编译前开启。 2,参数实现:在build/hb/resolver/build_args_resolver.py中添加相应的实现函数。 3,参数使用:在编译命令中添加--ccache即可通过在指定编译阶段调用resolve_ccache()实现参数使能。

详细规则请参考新增编译选项

如何新增一个模块

OpenHarmony项目的按功能单独划分,可以分为子系统,部件,模块,其中子系统包含部件,部件包含模块。新增模块步骤如下: 1,新增模块的配置文件BUILD.gn。 2,配置模块所属的部件的配置文件:bundle.json。

如果开发者要在新增子系统中新增模块,请参考新增模块

如何单编一个模块

--build-target参数加模块名。如果直接指定名称报unkonw target的话,可能是重名等原因,按照gn的全名称指定:{目标所在BUILD.gn的路径}:{目标名}, 比如: --build-target commonlibrary/c_utils/base:utils

如何新增一个APP

具体步骤请参考APP构建指导