Qt Lite の仕組み: configure 編

とあるお仕事で Qt Lite の仕組みを調べたので、少しづつ共有したいと思います。

configure/configure.bat

Qt 5.8 で configure 周りが大きく変わりました。

configure には configure スクリプト(*nix用)と configure.exe(Windows 用)が存在し、様々なことをそれぞれ同じように(しかし全部同じではない)するようになっていました。開発もメンテナンスもとても大変で、担当者がレビューを頑張ってはいましたが、とてもツライ状況でした。

これを改善したのが Qt Lite プロジェクトで、configure/configure.bat (exe は廃止された) は qmake をビルドするだけにして、クロスプラットフォームの qmake 側に処理を移譲することにしました。

ということで、シンプルになった configure がこちらになります。

configure (shell script)

コメントを抜粋し、何が行われているかを見てみましょう。

# script initialization
...
# utility functions
...
# operating system detection
...
# Verify Xcode installation on Mac OS
...
# Qt version detection
...
# initalize variables
...
# parse command line arguments
...
# help - interactive parts of the script _after_ this section please
...
# platform detection
...
# command line and environment validation
...
# build tree initialization
...
# build qmake
...
# create a qt.conf for the Qt build tree itself
...
# configure and build top-level makefile
...

色々なことをしていますが、最終的には qmake を作ってそれを実行するのが目的です。

configure.bat

同じく、コメントを抜粋してみます。

Make sure qmake is not confused by these. Recursion via Makefiles would
be still affected, so just unsetting them here is not an option.
...
Parse command line
...
Find various executables
...
Determine host spec
...
Prepare build dir
...
Extract Qt's version from .qmake.conf
...
Create forwarding headers
...
Build qmake
...
These must have trailing spaces to avoid misinterpretation as 5>>, etc.
...
Generate qt.conf
...
Launch qmake-based configure
...

細かいところはだいぶ異なりますが、qmake をビルドし、それを実行するようになっています。

qmake の世界へ

どちらも、最後に qmake を実行しています。

# configure
"$outpath/bin/qmake" "$relpathMangled" -- "[email protected]"

ビルドした qmake に、qt5 のソースツリーのパスと、configure に渡されたオプションを渡しています。

rem configure.bat
"%QTDIR%\bin\qmake.exe" "%TOPQTSRC%" -- %ARGS%

Windows 版もまったく同じです。

まとめ

Qt 5.8 以降、configure は qmake をビルドし、それを実行するという最低限の実装に変わりました。これにより、configure/configure.bat のメンテナンスコストが大幅に下がり、以降の処理は qmake 側で統一することができるようになってます。

次回は qmake 側を見てみましょう。お楽しみに!

(ちなみに、この記事の執筆に際して、些細なバグを一つ直しました

あわせて読みたい