MinGW — это сокращение от «Minimalist GNU for Windows», минималистичное окружение разработки приложений Windows, состоящее из GNU утилит.

Представляет собой полный набор инструментов с открытым исходным кодом для программирования, который подходит для разработки собственных приложений MS-Windows и не зависит от сторонних DLL-библиотек (собранные приложения зависят только от DLL, предоставляемых Microsoft в качестве компонентов операционной системы, в отличии от cygwin).

Среди основных компонентов: компилятор gcc и binutils (ассемблер, линковщик, архиватор и т.д.), которые архитектурно разрабатываются под стандарт POSIX. При портировании на Windows разработчики вынуждены эмулировать вызовы библиотеки языка C стандарта POSIX, к примеру, тот же fork(). В целом быстродействие снижается и это нормально, никак это не исправить — компиляция с помощью gcc из-под Windows будет всегда медленнее, чем из-под Linux. Но есть неочевидная особенность, которая позволяет увеличить скорость сборки MinGW от 10% до 10 раз.

Медленная сборка MinGW

В коде MinGW есть вызов функции NetUserGetInfo при инициализации процесса (не оставлял ссылку со строчкой или коммитом, чтобы Вы лично могли убедиться что на момент посещения поста происходит в актуальной версии MinGW).

Этот вызов может быть очень и очень медленным в том случае, если домен по которому пытается достучаться функция недоступен. Симптоматика в данном случае простая: утилиты, к примеру sh.exe, запускаются со значительной задержкой, в моём случае было от 1 до 20 секунд. Отследить это можно, к примеру вызвав сборку через make.exe с параметром -d.

В зависимости от версии условия этого выполнения меняются, одно время было:

if (!getenv ("HOMEPATH") || !getenv ("HOMEDRIVE"))

На данный момент условие чуть сложнее и можно представить (упустив детали) как:

if ((!getenv ("HOMEPATH") || !getenv ("HOMEDRIVE")) && logsrv ()) // logsrv() == true если переменная окружения LOGONSERVER задана
// эта информация, возможно, уже устарела

Если ваша сборка MinGW очень медленная, то это вероятная причина.

Ускорить компиляцию MinGW

Как мне видится, универсальное решение — это задать корректные значения переменным окружения:

  • HOMEPATH
  • LOGONSERVER

В качестве HOMEPATH можно использовать либо домашнюю папку пользователя, либо папку сборки, либо директорию тулчейна. Для LOGONSERVER можно установить значения или \\LOCALHOST, или \\ИМЯ_КОМПЬЮТЕРА.

Сделать это можно как в самой Windows глобально на конкретной машине, так и в конфигурации сборки — том же Makefile или комманде запуска компиляции по вашему вкусу:

:: какой-то bat файл, запускающий сборку
set LOGONSERVER=\\LOCALHOST
set HOMEPATH=C:\Users\Ozi

make.exe all

С разными версиями (проблемными и не особо) это позволило уменьшить время сборки MinGW от 10% до 10 раз в моём случае.

Навигация по записям