現在、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 を使用させるには、configure に QT_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 フォークをお試しいただき、その結果をお知らせください。