OpenHarmonyのビルドシステムアーキテクチャと実践ガイド

ビルドシステムの概要

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が高速ビルドを実行します。

ビルドフロー

全体のビルドフローは以下の順序で実行されます:
  1. hb set - 製品選択
  2. GN設定ファイルの解析
  3. Ninjaファイル生成
  4. 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:動作確認

ビルド完了後、ファームウェアを書き込み、シリアルコンソールで出力を確認します。

タグ: OpenHarmony Build System gn ninja Embedded Development

7月19日 00:00 投稿