14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-04

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

今回はあえて情報の少ない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を使ったアプリケーションをビルドすることができました。
ただし、エディターは別途用意する必要があります。

14
11
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
14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?