ビルドシステムの概要
OpenHarmonyのビルドサブシステムは、GN(Generate Ninja)とNinjaをベースとした構築基盤です。コンポーネント化された抽象レイヤーでビルド設定を管理し、以下の主要機能を提供します:
- コンポーネント単位での製品アセンブリと独立ビルド
- 軽量・小規模・標準システム向けのソリューションビルド、およびSDK開発キットの構築
- チップベンダー向けの柔軟なカスタマイズと独立ビルド
ビルドツールチェーンの連携
OpenHarmonyのビルドプロセスは、hb、GN、Ninjaの3つのツールが連携して動作します。
hbセットアップツール
hb setコマンドは、ターゲット製品の選択を行います。これにより、特定の製品ディレクトリ(例:wifiiot_hispark_pegasus)を指定し、その製品に関連するコードのみがビルド対象となります。最小単位での独立ビルドが可能で、シンプルな機能から複雑なシステムまで柔軟に選択できます。
hbビルド実行
hb buildコマンドは、選択された製品のコードをコンパイルします。開発ボードの設定ファイル(config.gni)を読み込み、ツールチェーンやコンパイルオプションを適用します。
特定のターゲットのみをビルドする場合:
hb build -T //path/to:target_name
BUILD.gnの役割
GNファイルは、Ninjaビルドファイルを生成するためのスクリプトです。各モジュールのBUILD.gnがビルド定義を記述し、最終的にNinjaが高速ビルドを実行します。
ビルドフロー
全体のビルドフローは以下の順序で実行されます:
- hb set - 製品選択
- GN設定ファイルの解析
- Ninjaファイル生成
- Ninjaによるコンパイル実行
システムアーキテクチャ
OpenHarmonyは階層型アーキテクチャを採用し、「システム > サブシステム > コンポーネント」の構造で構成されています。マルチデバイス展開時には、不要なサブシステムやコンポーネントを削除でき、高い柔軟性と疎結合を実現しています。
コンポーネント設定ルール
パス構造
コンポーネントは以下のルールで配置されます:
{ドメイン}/{サブシステム}/{コンポーネント名}
コンポーネント定義
コンポーネント定義は
build/lite/components/ディレクトリにJSON形式で格納されます。定義ファイルには、コンポーネント名、説明、依存関係、対応カーネル等の属性が含まれます。
WiFiコンポーネントの例
WiFiコンポーネントの場合、targetsパラメータを通じて
/foundation/communication/wifi/BUILD.gnが参照され、依存関係が解決されます。
チップソリューション設定
チップソリューションコンポーネントは、製品で選択された開発ボードに応じて自動的にビルドされます。
製品ソリューション設定
製品ソリューションは
config.jsonファイルで設定されます。主要な設定項目:
{
"product_name": "wifiiot_hispark_pegasus",
"type": "mini",
"version": "3.0",
"ohos_version": "OpenHarmony 1.0",
"device_company": "hisilicon",
"device_build_path": "device/board/hisilicon/hispark_pegasus",
"board": "hispark_pegasus",
"kernel_type": "liteos_m",
"kernel_is_prebuilt": true,
"subsystems": [...]
}
カスタム製品ソリューションの作成
ステップ1:コンポーネントの作成
applications/sample/myComponent/ディレクトリを作成し、ソースファイルを作成:
// custom_entry.c
#include <stdio.h>
#include "ohos_init.h"
void custom_init(void) {
printf("Custom component initialized!\n");
}
SYS_RUN(custom_init);
BUILD.gnファイル:
static_library("custom_lib") {
sources = [ "custom_entry.c" ]
include_dirs = [ "//commonlibrary/utils_lite/include" ]
}
ステップ2:コンポーネント定義の登録
build/lite/components/my_components.jsonを作成:
{
"components": [
{
"component": "myComponent",
"description": "Custom component for demonstration",
"optional": "true",
"dirs": [ "applications/sample/myComponent" ],
"targets": [ "//applications/sample/myComponent:custom_lib" ],
"adapted_kernel": [ "liteos_m" ]
}
]
}
ステップ3:製品設定の作成
vendor/mycompany/my_product/config.jsonを作成:
{
"product_name": "custom_product",
"type": "mini",
"version": "3.0",
"ohos_version": "OpenHarmony 3.2",
"device_company": "hisilicon",
"device_build_path": "device/board/hisilicon/hispark_pegasus",
"board": "hispark_pegasus",
"kernel_type": "liteos_m",
"kernel_is_prebuilt": true,
"subsystems": [
{
"subsystem": "applications1",
"components": [
{ "component": "myComponent", "features": [] }
]
},
{
"subsystem": "startup",
"components": [
{ "component": "bootstrap_lite", "features": [] },
{ "component": "syspara_lite", "features": [] }
]
}
],
"third_party_dir": "//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party",
"product_adapter_dir": "//vendor/mycompany/my_product/hals"
}
ステップ4:ビルドと検証
hb set
hb build -f
特定コンポーネントのビルドテスト:
hb build -f -T //applications/sample/myComponent:custom_lib
ステップ5:動作確認
ビルド完了後、ファームウェアを書き込み、シリアルコンソールで出力を確認します。