Распараллеливание компиляции для Qt 5.0.1
Как показано в публикации, распараллеливание
компиляции может существенно сократить время сборки проектов Qt
на компьютере с многоядерным процессором. Одним из способов применительно
к MinGW на платформе Windows является пересборка qmake
таким образом, чтобы он включал в сценарии сборки Makefile
распознаваемый утилитой mingw32-make ключ
-jX, где X
число одновременно выполняемых потоков компиляции. Данная статья
рассматривает решение этой задачи для Qt 5.0.1.
Далее для определенности будем полагать, что библиотека Qt установлена
в папку C:\Qt\Qt5.0.1\5.0.1\mingw47_32.
Основная сложность пересобрать qmake
так, чтобы ничего не нарушить в конфигурации установленной библиотеки,
а для этого надо знать с какими опциями библиотека была сконфигурирована.
Эту информацию можно найти в файле C:\Qt\Qt5.0.1\5.0.1\mingw47_32\mkspecs\qconfig.pri,
содержимое которого приведено ниже.
CONFIG+= release rtti qpa
QT_ARCH = i386
QT_HOST_ARCH = i386
QT_CPU_FEATURES =
QT_HOST_CPU_FEATURES =
QT_EDITION = OpenSource
QT_CONFIG += debug_and_release build_all debug release c++11 shared
zlib icu angle png freetype build_all accessibility opengl opengles2
egl openssl audio-backend native-gestures qpa iconv concurrent minimal-config
small-config medium-config large-config full-config
#versioning
QT_VERSION = 5.0.1
QT_MAJOR_VERSION = 5
QT_MINOR_VERSION = 0
QT_PATCH_VERSION = 1
Речь идет о строке
QT_CONFIG += ...
Некоторые опции включаются автоматически, а некоторые из них
следует указывать явно при вызове команды конфигурации.
Для сборки потребуются следующие инструменты
исходники Qt 5
MinGW 4.7 (должен уже
быть установлен вместе с библиотекой Qt)
ActivePython
Strawberry Perl
DirectX Software Development Kit (DXSDK)
последнему нужен
Windows SDK for Windows 7 and .NET Framework 4
а этому, в свою очередь,
Microsoft .NET Framework 4
DXSDK непосредственно в сборке qmake
не используется, но конфигуратор библиотеки проверяет его наличие.
Если он отсутствует, то qmake не будет собран
так, как надо.
Рассмотрим пошагово порядок действий, он очень похож на представленный
в вышеупомянутой публикации.
1. Создаем папку
C:\Qt\qt-5-deps
в которую будем устанавливать все компоненты, необходимые
для сборки qmake.
2. Скачиваем ActivePython с ресурса,
установочный файл
ActivePython-2.7.2.5-win32-x86.msi
45 MB
(версия файла на момент написания статьи)
устанавливаем в папку
C:\Qt\qt-5-deps\Python27
3. Скачиваем Strawberry Perl с ресурса,
установочный файл
strawberry-perl-5.16.2.1-32bit.msi
63 MB
(версия файла на момент написания статьи)
устанавливаем в папку
C:\Qt\qt-5-deps\strawberry
4. Скачиваем Microsoft .NET Framework 4
по ссылке,
онлайн установщик
dotNetFx40_Full_setup.exe
устанавливаем в папку по умолчанию
C:\Program Files\Microsoft.NET
5. Скачиваем Windows SDK for Windows 7 and .NET Framework 4
по ссылке,
онлайн установщик
winsdk_web.exe
устанавливаем в папку по умолчанию
C:\Program Files\Microsoft SDKs
В процессе установки может выскочить ошибка
Installation of the "Microsoft
Windows SDK for Windows 7" product has reported the following
error: Please refer to Samples\Setup\HTML\ConfigDetails.htm document
for further information.
Для устранения можно воспользоваться советом с
ресурса
удалить ранее установленный Microsoft Visual C++ 2010 Redistributable,
должно помочь.
6. Скачиваем DirectX Software Development Kit
по ссылке,
установочный файл
DXSDK_Jun10.exe 571 MB
устанавливаем в папку
C:\Qt\qt-5-deps\DXSDK
На предложение разрешить сбор информации о компьютере
выбираем
No, I would not like to participate
7. Скачиваем исходники библиотеки Qt 5
на странице загрузки,
архив
qt-everywhere-opensource-src-5.0.1.zip 269 MB
(версия файла на момент написания статьи)
распаковываем его в папку
C:\Qt
Итак, исходные файлы библиотеки теперь лежат в папке
C:\Qt\qt-everywhere-opensource-src-5.0.1
в ней же и будет происходить сборка qmake.
Для удобства переименуем эту папку во что-нибудь более короткое,
например
C:\Qt\qt-5.0.1
8. Делаем резервную копию файла
C:\Qt\qt-5.0.1\qtbase\qmake\generators\makefile.cpp
открываем его для редактирования и правим строку
QString makefilein = " -f " + subtarget->makefile;
которая встречается в этом файле 2 раза. Новая редакция
строки выглядит, например, так
QString makefilein = " -j9 -f " + subtarget->makefile;
Число потоков компиляции в ключе -jX
в Вашем случае зависит от количества ядер процессора N.
Обычно рекомендуется брать X = N + 1.
Если процессор поддерживает технологию Hyper-trheading, то число
потоков X = 2 · N + 1.
9. Для удобства создадим пакетный файл C:\Qt\qt-5.0.1\config.bat
со следующим содержимым
set QMAKESPEC=
set QTDIR=
set PATH=C:\Qt\qt-5.0.1\qtbase\bin
set PATH=%PATH%;C:\Qt\qt-5.0.1\gnuwin32\bin
set PATH=%PATH%;C:\Qt\Qt5.0.1\Tools\MinGW\bin
set PATH=%PATH%;C:\Qt\qt-5-deps\strawberry\c\bin
set PATH=%PATH%;C:\Qt\qt-5-deps\strawberry\perl\bin
set PATH=%PATH%;C:\Qt\qt-5-deps\Python27
set PATH=%PATH%;%SystemRoot%\System32
set DXSDK_DIR=C:\Qt\qt-5-deps\DXSDK\
set MAKE_COMMAND=
configure -prefix C:\Qt\Qt5.0.1\5.0.1\mingw47_32 -opensource -confirm-license
-platform win32-g++ -release -shared -debug-and-release -c++11 -qt-zlib
-icu -angle -opengl es2 -openssl -iconv -plugin-sql-odbc -nomake
tests -nomake examples -no-vcproj
10. Запускаем терминал Windows (см. Пуск
> Все программы > Стандартные > Командная строка) и вводим команды
cd \Qt\qt-5.0.1
config.bat
Сборка qmake займет несколько
минут. По окончании следует убедиться, что библиотека сконфигурирована
правильно, заглянув в созданный файл C:\Qt\qt-5.0.1\mkspecs\qconfig.pri.
11. Делаем на всякий случай резервную копию
файла C:\Qt\Qt5.0.1\5.0.1\mingw47_32\bin\qmake.exe
и заменяем его вновь собранным C:\Qt\qt-5.0.1\bin\qmake.exe.
Теперь все должно заработать так, как задумано.
Замечания.
Опция -release в команде configure
нужна для того, чтобы по умолчанию проекты собирались в конфигурации
Выпуск, и при этом не требовалось добавлять
в команду qmake параметр CONFIG+=release.
Возможно, что опция -shared включается
автоматически и может не указываться явно.
Иногда рекомендуют указывать опцию -developer-build,
но при сборке установленной библиотеки она не указывалась, иначе
в файле qconfig.pri среди других присутствовала
бы запись private_tests.
|