Сделать (параллельные задания) в Windows

Какая настройка работает для GNU, выполняет параллельные задания (-j) в Windows?

Я попытался установить оболочку в cmd.exe, используя MinGW make 3.81, это работает при создании нескольких процессов, но делает сбой с сообщением "ожидание работы".

Может ли это работать и что лучше всего настроить? (MinGW/Cygwin/???) Может ли кто-нибудь указать мне на рабочий пример для тестирования?

Ответы

Ответ 1

У меня никогда не было пробок с помощью make -jn под Cygwin. Он работает довольно хорошо. Я регулярно использую его с компилятором Microsoft cl.exe. Это просто работает для меня. Очень UNIX, как, Good It & Thing & trade;. Построить скрипты порт хорошо для Linux и Mac. Тщательно рекомендуется.

Никогда не нравился MinGW, так как я добрался до места, где 5 обратных слэшей было слишком мало, но шесть было слишком много. Вздох! (Чтобы сделать с помощью MinGW хаки, чтобы сделать обратные слеши разделенные имена путей допустимыми в make AFAIK.)

Ответ 2

Я нашел эту запись в блоге Danny Thorpe, которая объясняет проблемы с параллельной сборкой на Windows. В основном это означает, что сначала необходимо установить следующую переменную среды:

set SHELL=cmd.exe

С этим я смог запустить команду стиля make -j, но, к сожалению, не управляемую команду стиля make -jN.

Ответ 3

Я решил эту проблему, поэтому я разделяю решение для всех.

Вы можете попробовать MinGW-TDM (Домашняя страница: http://tdm-gcc.tdragon.net/) или MinGW-Equation (Страница загрузки: http://www.equation.com/servlet/equation.cmd?fa=fortran).

Установите 32-разрядную версию на D:\MinGW\MinGW32 например (и версию с 64-разрядной версией на D:\MinGW\MinGW64, если вы хотите использовать бинарные файлы с битами 64 бит)

Создайте пакетный файл следующим образом, затем запустите его в каталоге сборки:

Set MinGW_bin=D:\MinGW\MinGW32\bin
Set MSys_bin=D:\MinGW\msys\bin
Set Path=%MSys_bin%;%MinGW_bin%
mingw32-make SHELL=CMD.exe -j6 -f makefile

Вы можете скачать MSYS из http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS. В нем много утилит UNIX, которые требуют создания многих библиотек с открытым исходным кодом, приложений.

Где -j6 - возможность запуска 6 параллельных компиляции заданий.

СОВЕТ: вы можете установить опцию -jN, где N = количество ядер ЦП (потоков) на несколько. В моем случае у моего процессора 4 потока, поэтому я установил это значение в 6.

Примечание: вы можете запустить

make.exe -jN -f makefile

без SHELL=CMD.exe, а ваша компиляция выполняется параллельно, но в некоторых случаях она несовместима (где make.exe поступает из каталога MSYS).

Привет,

Ответ 4

Совет, который может помочь пользователям CMake

Параметр -jN не работает, когда вызовы make файла делают рекурсивно, как обычно делают make-make файлы cmake. Но есть средство, которое снова работает, потому что в сгенерированных make файлах CMake вызывает через такой синтаксис.

$(MAKE) -f CMakeFiles\Makefile2 <subproject>

Это означает, что вы можете изменить переменную MAKE:

mingw32-make "MAKE=mingw32-make -j3"

Теперь каждый раз, когда запускается подпроект, он снова получает параметр "-j3". Но учтите, что это фактически не ограничивает количество параллельных компиляций до 3, как вы могли ожидать. Если у вас более трех проектов, которые не зависят друг от друга в одной иерархии, все 3 проекта будут строить параллельно, и каждый из них запускает 3 этапа компиляции. Результат в 9 параллельных этапах компиляции.

Когда мы еще раз взглянем в верхний Makefile, сгенерированный cmake, тогда мы увидим, что цель "все" по существу только запускает sub make.

$(MAKE) -f CMakeFiles\Makefile2 all

Таким образом, мы можем удалить один слой подпроекта parallelism, вызвав

mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all

Но это жертвует отчет о прогрессе.

Я надеюсь, что это все равно поможет.

Ответ 5

Насколько я понимаю, GNU Выполняет параллельные задания в зависимости от базовой платформы для загрузки (CPU) информации о загрузке. Это, к сожалению, выполняется несовместимым с Windows способом, и только команда make -j делает что-то масштабируемое. Эта команда (без максимального количества заданий) потенциально опасна, поскольку она будет потреблять память, как бешеная голодающая собака (я пробовал ее на Qt, и она разбилась на QtWebkit, крупнейший проект в Qt, 4 ГБ оперативной памяти, Win7).

С другой стороны, я чувствую, что make -j3 работает быстрее, чем make, но в свете того, что я могу найти в Интернете (форумы, руководство...), он кажется очень функциональным для POSIX/Linux.

Кстати, я удивлен, что ваш вопрос был отклонен.