Skip to main content

vcpkg で HarmonyOS 向け C/C++ ライブラリをビルド

コメント
このブログは「Building C/C++ libraries for HarmonyOS with vcpkg」の抄訳です。

現在、Qt の HarmonyOS 対応移植に取り組んでいます。CI環境および開発者マシンでは、HarmonyOS 向けにビルドされたサードパーティライブラリが多数必要です。このプラットフォーム向けにオープンソースの C/C++ ライブラリをクロスコンパイルする作業は、これまで手作業による煩雑なプロセスでした。ライブラリごとにビルドシステム(CMake、Autotools、Meson など)が異なり、OHOS ターゲット向けに正しいバイナリを生成するためには個別の対応が必要でした。これまではシェルスクリプトを手書きで管理し、ライブラリを一つひとつビルドしながら、クロスコンパイル固有の問題に対してライブラリごとの回避策を適用してきました。

vcpkg フォークの導入により、そのスクリプトはコマンド一つで済むようになりました。

なぜ vcpkg?

vcpkg は Microsoft のオープンソース C/C++ パッケージマネージャーです。Android、iOS、その他の組み込みターゲット向けのクロスコンパイルをすでにサポートしています。HarmonyOS をファーストクラスのプラットフォームとして追加することで、vcpkg のポートカタログ全体が OHOS 開発者にとって、ライブラリごとのビルドシステム対応なしに利用できるようになります。

Qt はいくつかのバージョン以降、vcpkg が提供するサードパーティライブラリへのビルド対応をサポートしており、Qt 6.11 では vcpkg をマニフェストモードで実行して依存関係を自動インストールする configure オプションが導入されました。

残念ながら、vcpkg は HarmonyOS をサポートしていませんでしたが、当社のフォークでこの問題に対処しました。

フォークで追加された内容

変更は小規模かつ目的に絞ったものです。vcpkg-tool フォーク(コミット1件)では、ohos を認識されるプラットフォーム識別子として追加しています。なお、歴史的な経緯から OHOS を HarmonyOS の同義語として使用しています。SDK のツールチェーンファイルも同様です。vcpkg レジストリフォークには以下が含まれます。

  • HarmonyOS SDK のネイティブツールチェーンに処理を委譲する OHOS ツールチェーンファイル
  • コミュニティトリプレット:arm64-ohos、arm-ohos、x64-ohos
  • "supports": "!uwp" のようなポート式で OHOS を含める・除外するためのプラットフォーム検出
  • OHOS 固有の調整が必要なライブラリへのポートファイルパッチ(現時点:libpng、fontconfig、ICU)

スタートガイド

前提条件

  • ネイティブツールチェーン付きの HarmonyOS SDK(API 12 以降)
  • CMake 3.20 以降、Ninja
  • Git

ステップ 1:vcpkg-tool をソースからビルド

upstream の vcpkg-tool はまだ OHOS を認識しないため、フォークからビルドします。

git clone https://git.qt.io/jobor/vcpkg-tool.git -b ohos ~/vcpkg-tool

cd ~/vcpkg-tool

cmake -S . -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF

ninja build

ステップ 2:vcpkg レジストリをセットアップ

git clone https://git.qt.io/jobor/vcpkg.git -b ohos ~/vcpkg

cd ~/vcpkg

cp ~/vcpkg-tool/build/vcpkg ./

export VCPKG_ROOT=~/vcpkg

ステップ 3:SDK パスを設定

HarmonyOS コマンドラインツールのインストール場所に応じて設定してください。

export OHOS_SDK_ROOT=~/.local/opt/ohos/command-line-tools/sdk/default/openharmony

このディレクトリには native/build/cmake/ohos.toolchain.cmake が含まれている必要があります。 

ステップ 4:ライブラリをインストール

共通のインストールルートにライブラリをインストールするには、vcpkg の「クラシックモード」(「マニフェストモード」ではなく)を使用します。

vcpkg install --triplet arm64-ohos libpng libjpeg-turbo ...

これだけです。vcpkg が依存関係を解決し、ソースをダウンロードして、OHOS ツールチェーンですべてをクロスコンパイルし、ヘッダー、ライブラリ、CMake 設定ファイルを $VCPKG_ROOT/installed/arm64-ohos にインストールします。 

ステップ 5:プロジェクトで使用

vcpkg 独自の CMake インテグレーションを利用することもできます。

cmake -S . -B build \

    -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake \

    -DVCPKG_TARGET_TRIPLET=arm64-ohos

 Qt に vcpkg を使用させるには、configureQT_USE_VCPKG=ON を渡してください。Qt のビルドシステムが vcpkg ツールチェーンファイルの場所を自動的に検出して使用します。 

利用可能なトリプレット

HarmonyOS 向けには以下のトリプレットが利用できます。

Triplet OHOS ABI
arm64-ohos arm64-v8a
arm-ohos armeabi-v7a
x64-ohos x86_64

すべてのトリプレットは、バージョンなしの soname を持つ動的リンクライブラリを生成します。

アップストリームへの貢献

これらの変更を公式の vcpkg および vcpkg-tool リポジトリにアップストリームすべく作業中です。目標は標準のコミュニティトリプレットを提供し、OHOS を Android や iOS などの他のクロスコンパイルプラットフォームと並ぶ vcpkg のファーストクラスターゲットにすることです。

アップストリームが完了すれば、フォークは不要になります。標準の vcpkg インストールで OHOS がそのまま使えるようになります。

まとめ

HarmonyOS のサポートを vcpkg に追加することで、すべての OHOS C/C++ 開発者が直面しているライブラリごとのクロスコンパイルの負担が解消されます。各依存関係に対してカスタムビルドスクリプトを管理する代わりに、ビルドレシピはコミュニティが管理するリポジトリで一元管理されます。

HarmonyOS 向けにネイティブライブラリをビルドしている方は、ぜひ vcpkg フォークをお試しいただき、その結果をお知らせください。

コメント

ブログを購読

Qt 6.11 を今すぐ試そう!

最新リリースはこちらからダウンロードできます。 www.qt.io/download

 Qt 6.11 がリリースされました!アプリケーション開発者やデバイス開発者向けに、多くの新機能と改善が追加されています。 

採用情報 

現在、さまざまなポジションで採用を行っています。募集職種はこちら をご覧ください。また、Instagram をフォローして #QtPeople の働き方もぜひチェックしてください。