はじめに
令和元年5月6日時点における情報になります。
Flutter Desktop Embedding
を触ってみようとしたところ、ビルド方法が GN
+ Ninja
を使用するように変更されていました。
この Ninja
を使ったビルド方法についての情報が見つけられなかったので残しておきます。
環境構築
Windows10 Pro ver.1803 において、以下3点の環境構築を行いました。
- C++開発環境
- ビルドツール
Ninja
,GN
-
Flutter
とFlutter Desktop Embedding
のソース
C++開発環境
Visual Studio 2017 を入れてなかったので Build Tools を使ってみることにしました。
すでに Visual Studio 2017 の環境がある方は、 Desktop development with C++ も入っていれば大丈夫なようです。
Visual Studio のダウンロードページから Build Tools for Visual Studio 2019 をダウンロード。
ダウンロードした vs_buildtools_*.exe
を実行し、Visual Studio Installer をインストール。
C++ Build Tools の以下についてインストールする。
インストール後、MSBuild.exe
と vcvars64.bat
への PATH
を通す(MSBulid.exe
はサンプルをビルドする際に使用する)。
今回はユーザー環境変数に追加している。
$vspath = [Environment]::GetEnvironmentVariable('Path', 'User')
$vspath += ';' + 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build'
$vspath += ';' + 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
[Environment]::SetEnvironmentVariable('Path', $vspath, 'User')
自環境では vcvars64.bat
が存在しなかったので作成した。
また cl.exe
やヘッダーファイルへの PATH
も通っていなかったので、ここで設定しておく。
ヘッダーファイルは環境変数 INCLUDE
で設定する。
> cd "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build"
> echo @'
@set PATH=%PATH%;%~dp0..\..\Tools\MSVC\14.16.27023\bin\HostX64\x64
@set INCLUDE=%INCLUDE%;%~dp0..\..\Tools\MSVC\14.16.27023\include
@call "%~dp0vcvarsall.bat" amd64
'@ |
Out-File ".\vcvars64.bat" -Encoding Default
powershell
を再起動して PATH
を更新する。
PS > vcvars64.bat
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.0
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
ビルドツール Ninja
Makefile代替としてC++プロジェクトをビルドするのに使われるツール。
Makefileと比べて高速でビルドしてくれる。
Chromiumのプロジェクトでも使われているらしい。
今回は Scoop を用いてインストールした。
他の方法として、Chocolateyを使ったり、バイナリをダウンロードしたりしてください。
> scoop install ninja
> ninja --version
1.9.0
メタビルドツール Generate Ninja (GN)
上記 Ninja のビルド設定ファイルを出力するツール。
Googleが開発してる。
Windows用のバイナリを ダウンロード して PATH
を通しておく。
今回はユーザー環境変数に追加している。
$syspath = [Environment]::GetEnvironmentVariable('Path', 'User')
$syspath += ';' + '\path\to\gn\bin'
[Environment]::SetEnvironmentVariable('Path', $syspath, 'User')
PATH
を変更したら powershell
を一度開き直して更新させる。
> gn --version
1565 (d409ab89)
Flutter
と Flutter Desktop Embedding
作成したプロジェクトディレクトリ以下に flutter
と flutter-desktop-embedding
のgitリポジトリをクローンする。
mkdir desktop-embed
cd desktop-embed
git clone https://github.com/flutter/flutter
git clone https://github.com/google/flutter-desktop-embedding
ビルド手順
GNによるNinjaファイルの生成
直接 gn
コマンドは使わず、flutter-desktop-embedding/tools/gn_dart.bat
ファイルを使用する。
出力ディレクトリは ./out
以下を指定するのが慣例のようです。
初回は flutter
の初期化が行われる。
> cd flutter-desktop-embedding
> tools/gn_dart.bat gen out/Default
Checking Dart SDK version...
Downloading Dart SDK from Flutter engine 2f11d3c4a205eca899de19617303ca8174ada7e3...
Unzipping Dart SDK...
Building flutter tool...
Running pub upgrade...
Downloading Material fonts... 0.8s
...
Done. Made 3 targets from 7 files in 9ms
Ninjaによるコンパイル
上記で生成されたファイルをもとにコンパイル。
ninja -C out/Default
いくつかWarnningが出るが、out\Default\gen\flutter_library
以下に flutter_windows.dll
などが生成される。
エラー Your Flutter tree is too old
flutter
をshallow copyすると、必要なコミット履歴が見つからずエラーが発生する。
よってshallow copyせずに全履歴をクローンする。
> ninja -C out/Default
...
Running git merge-base --is-ancestor 829130ddfcf84aa683291744fb6d170f61f0287b HEAD
fatal: Not a valid commit name 829130ddfcf84aa683291744fb6d170f61f0287b
Flutter library update aborted: Your Flutter tree is too old for use with this project. Please update to a newer version of Flutter, then try again.
Note that this may require switching to Flutter master. See:
https://github.com/flutter/flutter/wiki/Flutter-build-release-channels
ninja: build stopped: subcommand failed.
サンプル実行
flutter
ツールを利用して実行できるようになった関係で、初回は必ず flutter run
から起動しなければいけない。
また flutter run
実行前に、環境変数 ENABLE_FLUTTER_DESKTOP
を true
に設定しておく。
> cd example
> $env:ENABLE_FLUTTER_DESKTOP="true"
> ..\..\flutter\bin\flutter run
Launching lib/main.dart on Windows in debug mode...
Building Windows application...
[ERROR:c:\b\s\w\ir\k\src\flutter\shell\platform\embedder\embedder_surface_gl.cc(95)] Could not create a resource context for async texture uploads. Expect degraded performance. Set a valid make_resource_current callback on FlutterOpenGLRendererConfig.
[ERROR:c:\b\s\w\ir\k\src\flutter\shell\platform\embedder\embedder_surface_gl.cc(95)] Could not create a resource context for async texture uploads. Expect degraded performance. Set a valid make_resource_current callback on FlutterOpenGLRendererConfig.
Syncing files to device Windows... 1,555ms
上記のエラーは昔から発生しているもので、エラーというより警告と捉えればいいようです。
(Example on Windows doesnt respond to mouse input · Issue #363 · google/flutter-desktop-embedding)
成功すれば下図のようなアプリが立ち上がります。
+
ボタンを押せば中央の数値が加算されていくのが見て取れます。
遭遇したエラー
Unable to locate a development device
> ..\..\flutter\bin\flutter run
Unable to locate a development device; please run 'flutter doctor' for information about installing
additional components.
環境変数 $env:ENABLE_FLUTTER_DESKTOP="true"
の設定を忘れていると発生する。
flutter run
実行前にはちゃんと設定しておきましょう。
$env:ENABLE_FLUTTER_DESKTOP="true"
..\..\flutter\bin\flutter run
The current Flutter SDK version is 0.0.0-unknown
> ..\..\flutter\bin\flutter run
The current Flutter SDK version is 0.0.0-unknown.
Because example_flutter requires Flutter SDK version >=1.5.9-pre.56, version solving failed.
Running "flutter packages get" in example...
pub get failed (1)
flutter
を git clone
する際にうまく初期化できていなかったときに起こるエラー。
Workarounds for common issues - flutter/flutter の手順に従えば解決する。
git clean -xfd git stash save --keep-index git stash drop git pull flutter doctor
終わりに
とりあえずライブラリをビルドしてサンプルを動かしただけですが、Ninja
や GN
について知らなかったのでつらたんでした。
色々いじってみるのは今後の課題に残します。
Flutter Desktop Embedding
は開発途中のプロジェクトなので、このビルド方法もいつまで正しいかわからないことはご注意ください。
参考
google/flutter-desktop-embedding
gn - Git at Google
Ninja, a small build system with a focus on speed
Address VS 2019 compatibility · Issue #342 · google/flutter-desktop-embedding
ninjaでリソースビルド - Qiita
Flutter desktop embedding を Windows で試す - Qiita
vs2015でコマンドラインでプログラムをコンパイルする際のincludeパスの設定
知っておくと便利な git clone --depth と git diff --indent-heuristic - kakakakakku blog