1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QtAdvent Calendar 2024

Day 20

Windows での QtWebEngine build from source

Last updated at Posted at 2024-12-19

1. はじめに

この記事は Qt Advent Calender 2024 の20日目の記事です。
一昨日に続き、2度目の執筆となります。

昨日は @task_jp さんによる Qt Creator を微かに改善してみました でした。

Suzuki さんが度々パッチを送られているのを見て、いつか自分もできるようになりたいなと密かに思っております(Contributor と呼ぶのでしょうか、憧れます)。


また、この記事は 苦行またはメロンパン の20日目の記事でもあります。
個人的に qtwebengine のビルドは苦行だったので参加しました。


学生ライセンス で Qt を使わせていただいている立場なので、学生でなくなった時にどうしようかと偶に考えます。結局はやはりソースからビルドしたいと思うものです。

ところで、QtWebEngine だけは何回試みてもビルドに成功したことがなく悔しいので、一度落ち着いて取り組むとします。


2. 環境構築

2.1. ビルド要件

Qt Documentation に書いてあります。
各々インストールした後はターミナルにコマンドを打って、対応する表示が出ることを確認します(例:cmake --version)。


ライブラリ名など 備考
Visual Studio 2022 「C++ によるデスクトップ開発」を選択し、インストール
CMake インストーラをダウンロード
Bison 「Complete package, except sources」よりインストーラをダウンロード
Flex 同上
html5lib python -m pip install html5lib。Python 3.10.16 を使用
GPerf 「Complete package, except sources」よりインストーラをダウンロード
Node.js インストールが完了したら、nvm install lts
Perl 「DOWNLOAD STRAWBERRY PERL」からインストール

2.2. モジュールの依存関係

こちら に書いてあります。
「depends」欄はもちろんのこと、「recommends」欄は無いとビルドされないソースがあるので準備した方がよいのでしょう。

モジュール名 依存・および推奨モジュール
qtbase
qtsvg qtbase
qtimageformats qtbase
qtshadertools qtbase
qtlanguageserver qtbase
qtserialport qtbase
qtactiveqt qtbase
qtdeclarative qtbase, qtimageformats, qtshadertools, qtsvg, qtlanguageserver
qtquicktimeline qtbase, qtdeclarative
qtquick3d qtbase, qtdeclarative, qtshadertools, qtquicktimeline
qtmultimedia qtbase, qtshadertools, qtdeclarative, qtquick3d
qtwebsockets qtbase, qtdeclarative
qtwebchannel qtbase, qtdeclarative, qtwebsockets
qttools qtbase, qtdeclarative, qtactiveqt
qtpositioning qtbase, qtdeclarative, qtserialport
qtwebengine qtdeclarative, qtwebchannel, qttools, qtpositioning

3. ビルド

Visual Studio 2022 Developer Command Prompt を起動。
スタートにて「x64」と入力すれば候補に出てくるはず。

ソースを取得します。今回はバージョン 6.5.3 を選びました。

git clone git://code.qt.io/qt/qt5.git
cd qt5
git checkout 6.5.3

続いて、サブモジュールを取得。
非常に時間がかかります(QtWebEngineの 3rd party のソースの量が莫大なため)。ちなみに新しいバージョンでは、init-repository.bat があるので、perlは必要なかった気がします。

perl init-repository --module-subset=qtbase,qtsvg,qtimageformats,qtshadertools,qtlanguageserver,qtserialport,qtactiveqt,qtdeclarative,qtwebsockets,qtwebchannel,qttools,qtpositioning,qtwebengine

ビルドシステム作成。
インストールフォルダを -prefix オプションで指定できます。

cd ..
mkdir build
cd build
C:/Qt_source/qt5/configure -prefix "C:/Qt-6.5.3" -platform win32-msvc

最後に出力される Log は無視せず確認します。
「Warning」とか「won't be built」とか偶に書いてあるので。


最後にビルド・インストール。

cmake --build . --parallel
cmake --install .

4. 結果

うーん、上手くいかない。

エラー文のパスを調べていると、記載されているパスに「gn.exe」が存在しません。どうやら qtwebengine の 3rd party ソースの一つである gn のビルドに失敗しており、その後の処理が出来なくなっているようです。


というわけで試すこと以下2点。

  • qtwebengine 以外のモジュールは問題なくビルドできるのか
  • gn.exe は問題なくビルドできるのか

4.1. qtwebengine 以外のビルド

init-repository--module-subset 指定するモジュールから qtwebengine を省いてビルドを進めてみます。

git clone git://code.qt.io/qt/qt5.git
cd qt5
git checkout 6.5.3
perl init-repository --module-subset=qtbase,qtsvg,qtimageformats,qtshadertools,qtlanguageserver,qtserialport,qtactiveqt,qtdeclarative,qtwebsockets,qtwebchannel,qttools,qtpositioning

ビルドシステム作成、ビルド、インストールコマンドは上記と同じ。

cd ..
mkdir build
cd build
C:/Qt_source/qt5/configure -prefix "C:/Qt-6.5.3" -platform win32-msvc
cmake --build . --parallel
cmake --install .

これらは問題なくビルドが完了しました。

image.png


4.2. gn.exe のビルド

まずは こちら よりソースを取得。これもまた Visual Studio 2022 Developer Command Prompt にて行う。

git clone https://gn.googlesource.com/gn

続いて、gn.exe をビルドする。

cd gn
python build/gen.py
ninja -C out

これが上手くいかない。

スクリーンショット 2024-12-20 025735.png

めぼしいエラーメッセージも無いので何もしようが無い。

とりあえず out ディレクトリを削除し、オプションを付けて試してみます。

python build/gen.py --allow-warnings

build/gen.py にはこのオプションが書いてありますが、サイトに書いてあるように「--allow-warning」としてもコマンドは通ります(argparse の仕様?)。


改めてビルド。

ninja -C out

image.png

あれ、gn.exe がビルドできました。
ちゃんと使えるのか試してみます。

cd out
gn_unittests.exe

スクリーンショット 2024-12-20 034222.png

どう見ても大丈夫ではなさそうですが、Debug ディレクトリに出力された foo.json には「true」と書いていて、成功したのか不明です。

example をビルドしてみます。

cd ..
cd examples/simple_build
"C:/gn/out/gn.exe" gen -C out
ninja -C out
cd out
hello.exe

問題なくビルドでき、「Hello, world」と表示されました。

image.png


4.3. 再挑戦

前章で分かったのは、「--allow-warnings オプションを付ければ gn.exe は(一応)ビルド可能」ということなので、qtwebengine ビルド時にこのオプションを指定できるようにします。

qtwebengine 以外がビルドでき、C:/Qt-6.5.3 にインストールした状態から始めます。

git clone git://code.qt.io/qt/qt5.git
cd qt5
git checkout 6.5.3
perl init-repository -f --module-subset=qtwebengine

C:\Qt_source\qt5\qtwebengine\src\gn\CMakeLists.txt 内の add_custom_command の引数の記述に、--allow-warnings オプションを加えます。

add_custom_command(
    OUTPUT ${GN_EXECUTABLE}
    WORKING_DIRECTORY ${GN_BINARY_DIR}
    COMMAND ${Python3_EXECUTABLE} ${GN_SOURCE_DIR}/build/gen.py
        --allow-warnings # ここにオプションを追加

続いてビルドシステム作成。

cd ..
mkdir build
cd build
"C:/Qt-6.5.3/bin/qt-configure-module.bat" C:/Qt_source/qt5/qtwebengine

最後にビルド。

cmake --build .

うーん、上手くいかない。
エラー文のコマンドを実行して何が原因か見てみます。

<path/to/cmd.exe> /C "cd /D C:\Qt_source\build\src\gn && <path/to/python.exe> C:/Qt_source/qt5/qtwebengine/src/3rdparty/gn/build/gen.py --allow-warnings --no-last-commit-position --out-path C:/Qt_source/build/src/gn/Release --cc "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe" --cxx "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe" --ld "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe" --ar "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/lib.exe" --qt-version 6.5.3.qtwebengine.qt.io

『gen.py: error: unrecognized arguments: --allow-warnings』


なぜ… ??


どうやら C:/Qt_source/qt5/qtwebengine/src/3rdparty/gn/build/gen.py と、4.2節 でクローンしてきた gen.py の中身が違うようです。init-repository を行った時の出力を確認すると、gn は qtwebengine-chromium から取得されているようで、gen.py を見ると確かに --allow-warnings オプションはありませんでした。

これを踏まえると、gn.exe をビルドできるかどうかはクローンしてきた方のソースで確かめる必要があります。

cd "C:/Qt_source/qt5/qtwebengine/src/3rdparty/gn"
python build/gen.py --no-last-commit-position --out-path out --cc "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe" --cxx "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe" --ld "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe" --ar "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/lib.exe" --qt-version 6.5.3.qtwebengine.qt.io
ninja -C out

結果、ビルドは成功しませんでした。

[2/155] ninja -t msvc -- C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe /nologo /showIncludes /FC -I..\src -I. /O2 /DNDEBUG /Zc:inline /DNOMINMAX /DUNICODE /DWIN32_LEAN_AND_MEAN /DWINVER=0x0A00 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_UNICODE /D_WIN32_WINNT=0x0A00 /FS /W4 /Zi /wd4099 /wd4100 /wd4127 /wd4244 /wd4267 /wd4505 /wd4577 /wd4838 /wd4996 /std:c++17 /GR- /D_HAS_EXCEPTIONS=0 /c ..\src\gn\escape.cc /Fosrc/gn/escape.obj
FAILED: src/gn/escape.obj
ninja -t msvc -- C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.42.34433/bin/Hostx64/x64/cl.exe /nologo /showIncludes /FC -I..\src -I. /O2 /DNDEBUG /Zc:inline /DNOMINMAX /DUNICODE /DWIN32_LEAN_AND_MEAN /DWINVER=0x0A00 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_UNICODE /D_WIN32_WINNT=0x0A00 /FS /W4 /Zi /wd4099 /wd4100 /wd4127 /wd4244 /wd4267 /wd4505 /wd4577 /wd4838 /wd4996 /std:c++17 /GR- /D_HAS_EXCEPTIONS=0 /c ..\src\gn\escape.cc /Fosrc/gn/escape.obj

うーん、何も分からない。


5. おわりに

時間を浪費する訳にもいかないので、このあたりで諦めようと思います。
もし何か知見をお持ちの方がいれば共有してくださると大変助かります。


苦行またはメロンパン の明日は わゃをん さんです。「学園アイドルのためならお茶を20kg分買って運んだってかまわない」とのこと、お楽しみに~。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?