Russian Qt Forum
Ноябрь 23, 2024, 10:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Распараллеливание компиляции  (Прочитано 28709 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #15 : Март 11, 2011, 07:22 »

Цитировать
Кол-во потоков компиляции выбираем равным числу ядер процессора + 1 или +2.

Почему не +1? почему не "=  числу ядер"?
Записан
Akon
Гость
« Ответ #16 : Март 11, 2011, 08:16 »

Windows:
вместо nmake использовал тулзу jom

Причем здесь nmake  | jom ?
Мой пост касается MinGW

mingw32-make -j9 -f Makefile.Release

А при чем здесь конкретно твой пост?
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #17 : Март 11, 2011, 08:32 »

Пригодилась. Ваш способ Qt4.7 работает.

ps способ с "QMAKE_CXXFLAGS_RELEASE += -MP " или передача в мэйк -j не работает с mingw32-make. Проверил.

Вы глубоко заблуждаетесь!  mingw32-make поддерживает ключ -j Просто при вызове mingw32-make без указания ключа -f, используется дефолтный Makefile, в котором вызывается mingw32-make уже без паралельной компиляции.  Посмотрите внимательно лог сборки.

После того, как вы повторите действия из моего поста (см. выше), у вас появится возможность быстро собирать приложения в MinGW.


Почему не +1? почему не "=  числу ядер"?
Это официальные рекомендации.  
+1 уменьшает время простоя процессора при переключении задач
« Последнее редактирование: Март 11, 2011, 09:41 от lesav » Записан

juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #18 : Март 11, 2011, 11:22 »

Цитировать
Вы глубоко заблуждаетесь!
Действительно, заблуждался. -j без -f не работал. Ну тогда можно просто передать в mingw32-make  два ключа
-j9 -f Makefile.Release
После передачи 2-х ключей и у меня стало быстро компеляца без "добавления поддержки паралельной компиляции MinGW в qmake". Зачем тогда нужно добавлять что-то в qmake, если достаточно в мингв-мэйк передать 2 ключа?
Записан
Akon
Гость
« Ответ #19 : Март 11, 2011, 14:34 »

А при чем здесь конкретно твой пост?
см. Сабж

Я привел один из способов под Windows. К твоему посту мой пост не имеет никакого отношения. Или что не так?
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #20 : Март 11, 2011, 14:56 »

Я привел один из способов под Windows. К твоему посту мой пост не имеет никакого отношения. Или что не так?

Я скромно извиняюсь!  Просто я поднял тему из глубины 2009 года, и решил что ответ был на мой пост!

Мою ошибку признаю.  Эх надо было новую тему открывать.
Записан

lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #21 : Март 11, 2011, 17:06 »

Пригодилась. Ваш способ Qt4.7 работает.
pps У одного прогера под виндой работает опция -j.
      У меня не работает. Оказалось что я использую mingw32-make из SDK.
      А у него нет мингв. Он использует какойто make.exe. С make под виндой всё просто, опцию -j
      и будет счастье

Не будет счастья!  Ибо make.exe  и  mingw32-make.exe  Это одно и тоже!

Вызывая make -j9   вы фактически вводите команду make -j9 -f Makefile All
make хватается за сценарий сборки Makefile в котором указано,
что для сборки проекта необходимо вызвать make -f Makefile.Debug и затем запусить make -f Makefile.Release
Ключ -j не наследуется на последующие вызовы make

А сценарии сборки Makefile.Release и Makefile.Debug сгенерил qmake.  Лечить нужно qmake

см. методу в Wiki
« Последнее редактирование: Март 11, 2011, 23:56 от lesav » Записан

LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #22 : Июнь 26, 2011, 16:47 »

lesav, cпасибо за мануал. Разбирался по нему.
В новом SDK немного изменилась структура папок, но в целом изменения минимальны:

1) Изменяем файлы
C:\QtSDK\QtSources\4.7.3\qmake\generators\makefile.cpp
C:\QtSDK\QtSources\4.7.3\qmake\generators\mac\pbuilder_pbx.cpp
C:\QtSDK\QtSources\4.7.3\qmake\generators\symbian\symmake.cpp
C:\QtSDK\QtSources\4.7.3\qmake\generators\symbian\symmake_abld.cpp

(для компиляции только под Win видимо достаточно только первого файла)

Заменяем:
   $(MAKE) -f       или     makefilein = " -f "         или   "make -C "++" -f "
на                                                                             
   $(MAKE) -j9 -f или     makefilein = " -j9 -f "    или   "make -C "++" -j9 -f "

2) Создаём файл C:\QtSDK\QtSources\4.7.3\src\corelib\global\qconfig.cpp
Код
C++ (Qt)
/* Licensed */
static const char qt_configure_licensee_str          [512 + 12] = "qt_lcnsuser=Open Source";
static const char qt_configure_licensed_products_str [512 + 12] = "qt_lcnsprod=OpenSource";
 
/* Build date */
static const char qt_configure_installation          [11  + 12] = "qt_instdate=2011-06-25";
 
static const char qt_configure_prefix_path_str       [512 + 12] = "qt_prfxpath=C:/QtSDK/Desktop/Qt/4.7.3/mingw";
static const char qt_configure_documentation_path_str[512 + 12] = "qt_docspath=C:/QtSDK/Documentation";
static const char qt_configure_headers_path_str      [512 + 12] = "qt_hdrspath=C:/QtSDK/Desktop/Qt/4.7.3/mingw/include";
static const char qt_configure_libraries_path_str    [512 + 12] = "qt_libspath=C:/QtSDK/Desktop/Qt/4.7.3/mingw/lib";
static const char qt_configure_binaries_path_str     [512 + 12] = "qt_binspath=C:/QtSDK/Desktop/Qt/4.7.3/mingw/bin";
static const char qt_configure_plugins_path_str      [512 + 12] = "qt_plugpath=C:/QtSDK/Desktop/Qt/4.7.3/mingw/plugins";
static const char qt_configure_imports_path_str      [512 + 12] = "qt_impspath=C:/QtSDK/Desktop/Qt/4.7.3/mingw/imports";
static const char qt_configure_data_path_str         [512 + 12] = "qt_datapath=C:/QtSDK/Desktop/Qt/4.7.3/mingw";
static const char qt_configure_translations_path_str [512 + 12] = "qt_trnspath=C:/QtSDK/Desktop/Qt/4.7.3/mingw/translations";
static const char qt_configure_examples_path_str     [512 + 12] = "qt_xmplpath=C:/QtSDK/Examples/4.7";
static const char qt_configure_demos_path_str        [512 + 12] = "qt_demopath=C:/QtSDK/Demos/4.7";
/* strlen( "qt_lcnsxxxx") == 12 */
#define QT_CONFIGURE_LICENSEE qt_configure_licensee_str + 12;
#define QT_CONFIGURE_LICENSED_PRODUCTS qt_configure_licensed_products_str + 12;
#define QT_CONFIGURE_PREFIX_PATH qt_configure_prefix_path_str + 12;
#define QT_CONFIGURE_DOCUMENTATION_PATH qt_configure_documentation_path_str + 12;
#define QT_CONFIGURE_HEADERS_PATH qt_configure_headers_path_str + 12;
#define QT_CONFIGURE_LIBRARIES_PATH qt_configure_libraries_path_str + 12;
#define QT_CONFIGURE_BINARIES_PATH qt_configure_binaries_path_str + 12;
#define QT_CONFIGURE_PLUGINS_PATH qt_configure_plugins_path_str + 12;
#define QT_CONFIGURE_IMPORTS_PATH qt_configure_imports_path_str + 12;
#define QT_CONFIGURE_DATA_PATH qt_configure_data_path_str + 12;
#define QT_CONFIGURE_TRANSLATIONS_PATH qt_configure_translations_path_str + 12;
#define QT_CONFIGURE_EXAMPLES_PATH qt_configure_examples_path_str + 12;
#define QT_CONFIGURE_DEMOS_PATH qt_configure_demos_path_str + 12;

3) Запускаем Qt 4.7.3 for Desktop (MinGW)
cd c:\QtSDK\QtSources\4.7.3\qmake\
qmake
mingw32-make -j9 -f Makefile.Release

Ждём окончания компиляции.

4) Забираем получившийся exe-шник C:\QtSDK\QtSources\4.7.3\bin\qmake.exe
Записан
ppk
Гость
« Ответ #23 : Август 10, 2011, 23:06 »

Вроде бы сделал все по инструкции, но при запуске qmake получаем:
Код:
WARNING: Failure to find: windows/registry.cpp
WARNING: Failure to find: symbian/epocroot.cpp
WARNING: Failure to find: qbitarray.cpp
WARNING: Failure to find: qbuffer.cpp
WARNING: Failure to find: qbytearray.cpp
WARNING: Failure to find: qbytearraymatcher.cpp
WARNING: Failure to find: qcryptographichash.cpp
WARNING: Failure to find: qdatetime.cpp
WARNING: Failure to find: qdir.cpp
WARNING: Failure to find: qdiriterator.cpp
WARNING: Failure to find: qfile.cpp
WARNING: Failure to find: qabstractfileengine.cpp
WARNING: Failure to find: qfileinfo.cpp
...
завршается успешно и далее на следующем шаге
Код:
C:/QtSDK/mingw/bin/mingw32-make -j3 -f Makefile.Release
mingw32-make[1]: Entering directory `C:/QtSDK/QtSources/4.7.3/qmake'
g++ -x c++-header -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DQT_NO_TEXTCODEC -DQT_NO_LIBRARY -DQT_NO_STL -DQT_NO_COMPRESS -DQT_NO_UNICODETABLES -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM -DQLIBRARYINFO_EPOCROOT -DQMAKE_OPENSOURCE_EDITION -DQT_NODLL -DQT_NO_THREAD -DQT_NO_QOBJECT -I"." -I"generators" -I"generators\unix" -I"generators\win32" -I"generators\mac" -I"generators\symbian" -I"\include" -I"\include\QtCore" -I"\qmake" -I"\tools\shared" -I"..\..\..\Desktop\Qt\4.7.3\mingw\mkspecs\win32-g++" -o debug\qmake_pch.h.gch\c++ qmake_pch.h
qmake_pch.h:44:21: error: qglobal.h: No such file or directory
qmake_pch.h:54:19: error: qfile.h: No such file or directory
qmake_pch.h:58:21: error: qstring.h: No such file or directory
qmake_pch.h:59:25: error: qstringlist.h: No such file or directory
qmake_pch.h:60:19: error: qhash.h: No such file or directory
qmake_pch.h:63:21: error: qregexp.h: No such file or directory
qmake_pch.h:65: error: 'QT_BEGIN_NAMESPACE' does not name a type

Что с этим делать не очень понятно. Может кто-то подскажет как решить проблему?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #24 : Январь 18, 2012, 11:43 »

lesav, спасибо большое за мануал - работает замечательно.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #25 : Январь 18, 2012, 22:54 »

Очень рад что пригодилось.


PS  Мое правило:
Не люблю кого-то ждать, и чтоб меня ждали.  Время нужно беречь.
Записан

lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #26 : Февраль 06, 2012, 08:55 »

Вроде бы сделал все по инструкции, но при запуске qmake получаем:
Код:
WARNING: Failure to find: windows/registry.cpp
WARNING: Failure to find: symbian/epocroot.cpp
...
WARNING: Failure to find: qfileinfo.cpp
...
завршается успешно и далее на следующем шаге
Код:
C:/QtSDK/mingw/bin/mingw32-make -j3 -f Makefile.Release
mingw32-make[1]: Entering directory `C:/QtSDK/QtSources/4.7.3/qmake'
...
qmake_pch.h:65: error: 'QT_BEGIN_NAMESPACE' does not name a type

Что с этим делать не очень понятно. Может кто-то подскажет как решить проблему?

Выполнить
Код:
set QTDIR=f:\Qt\qt-4.8.0-mingw-shared
set MAKEFLAGS=
set INCLUDE=%INCLUDE%;%QTDIR%/include
set PATH=%PATH%;C:\QtSDK\mingw\bin;%QTDIR%/bin
set QMAKESPEC=win32-g++

cd %QTDIR%

configure.exe -opensource -release -shared -debug-and-release

Дождаться момента, когда начнет собираться qmake, и прекратить далнейшее выполнение configure.exe

Затем
Код:
cd ./qmake
make -j9
Записан

LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #27 : Февраль 06, 2012, 09:38 »

К слову, альтернативный метод распараллеливание компиляции в MinGW:
Проекты > Настройки сборки > Сборка: mingw32-make.exe in … > Параметры make:
-j9 -f Makefile.Release
(ну и -j9 -f Makefile.Debug для дебажной версии).
Вот так:


Плюсы:
+ ничего не надо собирать

Минусы:
- указанные строчки надо указывать в каждой MinGW-сборке каждого проекта
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #28 : Февраль 12, 2012, 12:28 »

distcc вам в помощь, очень хорошая штука, проверено многократно. проект, который собирался 3 минуты, теперь собирается за минуту двадцать сек.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.153 секунд. Запросов: 23.