Help us understand the problem. What is going on with this article?

Qtビルド環境のコンテナ化

More than 1 year has passed since last update.

開発環境をコンテナ化するのが流行っていますね(要出典)。

今回はあえて情報の少ないWindowsでのコンテナ化に挑戦してみたいと思います。Docker for Windowsを使用し、QtのWindows向けビルド環境をコンテナ(Windowsコンテナ)にします。

なお前提としてC++開発環境にVisual Studio Build Tools 2017のコンテナを使用します。

Linuxの情報

Linux用のQt環境のコンテナは検索したら色々出てきます。

Qtのサイレントインストール

QtのインストーラーはQt Installer Frameworkで作られていて、スクリプトを使用したサイレントインストールが可能です。

このサンプルコードはUbuntu Server用なので、インストールするコンポーネントをWindows用に変えます。

コンポーネント名を調べるにはインストーラーを普通に実行して、最後の方で表示される確認画面を見れば良いです。

qt-installer-noninteractive.qs
function Controller() {
    installer.autoRejectMessageBoxes();
    installer.installationFinished.connect(function() {
        gui.clickButton(buttons.NextButton);
    })
}

Controller.prototype.WelcomePageCallback = function() {
    // click delay here because the next button is initially disabled for ~1 second
    gui.clickButton(buttons.NextButton, 3000);
}

Controller.prototype.CredentialsPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.TargetDirectoryPageCallback = function()
{
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("C:/Qt");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    widget.deselectAll();
    // Windowsのコンポーネントに変更
    widget.selectComponent("qt.qt5.597.win64_msvc2017_64");
    widget.selectComponent("qt.qt5.597.qtcharts");
    widget.selectComponent("qt.qt5.597.qtdatavis3d");
    widget.selectComponent("qt.qt5.597.qtpurchasing");
    widget.selectComponent("qt.qt5.597.qtvirtualkeyboard");
    widget.selectComponent("qt.qt5.597.qtwebengine");
    widget.selectComponent("qt.qt5.597.qtnetworkauth");
    widget.selectComponent("qt.qt5.597.qtremoteobjects");
    widget.selectComponent("qt.qt5.597.qtspeech");
    widget.selectComponent("qt.qt5.597.qtscript");

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.LicenseAgreementPageCallback = function() {
    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ReadyForInstallationPageCallback = function()
{
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.FinishedPageCallback = function() {
var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm;
if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {
    checkBoxForm.launchQtCreatorCheckBox.checked = false;
}
    gui.clickButton(buttons.FinishButton);
}

このスクリプトを使ってサイレントインストールを行うDockerfileを書きます。

FROM tetsurom/vctools:recommended-latest

ADD http://download.qt.io/official_releases/online_installers/qt-unified-windows-x86-online.exe C:/TEMP
ADD qt-installer-noninteractive.qs C:/TEMP

RUN C:\TEMP\qt-unified-windows-x86-online.exe --script C:\TEMP\qt-installer-noninteractive.qs

RUN setx path "%path%;C:\Qt\5.9.7\msvc2017_64\bin"

あとはビルドしてしばらく待ちましょう。

> docker build .

以上の手順でビルドしたコンテナをtetsurom/qtenv-windows:5.9.7-msvc2017_64にpushしておきました。

ライセンスについて

上記の手順ではLGPL版のQtをインストールしています。

使ってみよう

先ほど作ったイメージからコンテナを起動します。
qtsampleフォルダを作っておき、マウントします。

コンテナ外
> mkdir qtsample
> docker run --rm -it -v qtsample:C:/qtsample tetsurom/qtenv-windows:5.9.7-msvc2017_64

ここでqtsampleフォルダにQtを使ったアプリのコードを配置してください。
(docker runより前に置いてあっても良いです)

main.cpp
#include <QApplication>
#include <QWidget>
#include <memory>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    auto widget = std::make_unique<QWidget>();
    widget->show();
    return app.exec();
}

配置したらqmake -projectを実行し、proファイルを生成します。

コンテナ内
> cd C:\qtsample
> qmake -project

生成したままではウィジェットが使えないので、生成されたproファイルを編集し、変数QTwidgetsを足します。

qtsample.pro
QT += widgets

以下のコマンドを実行してビルドします。

コンテナ内
> qmake
> nmake release
> windeployqt release

ビルドが成功したら、コンテナ外から起動してください。

コンテナ外
> qtsample\release\qtsample.exe

ウィンドウが表示されれば成功です。

このように、ホストマシンにVisual C++やQtをインストールすることなく、Qtを使ったアプリケーションをビルドすることができました。
ただし、エディターは別途用意する必要があります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした