Каковы различия между MinGW make и MSYS, и какой из них доступен?

Извините, если это довольно глупый вопрос, но я работаю над созданием С++ в NetBeans (что требует MinGW). В документации для C/С++ части NetBeans говорится, что она будет работать только с MSYS, а не с MinGW. Я хотел знать разницу между ними, поэтому я сделал Googled и придумал этот вопрос, в котором говорится, что в MinGW есть два разных способа, mingw32-make (MinGW make) и make (MSYS make). Затем я немного выкопал на вики Wiki MinGW и нашел это сообщение, заложенное в FAQ:

"Нативный" (то есть: зависимый от MSVCRT) порт make отсутствует в некоторых функциональность и измененная функциональность из-за отсутствия POSIX на Win32. Существует также версия make в дистрибутиве MSYS что зависит от времени выполнения MSYS. Этот порт работает больше, чем предназначалось для работы и дает меньше головных болей во время выполнения. Исходя из этого, разработчики/разработчики/упаковщики MinGW решили это было бы лучше всего переименовать собственную версию, чтобы как "родные", версия и версия MSYS могут присутствовать одновременно без столкновение имен файлов.

Итак, если есть две копии make, какая из них доступна в оболочке MSYS и какая из них доступна в cmd.exe? Каковы основные различия между ними?

Ответы

Ответ 1

Основное практическое отличие между двумя версиями MSYS и собственной версией заключается в том, что бывший использует оболочку MSYS для выполнения своих команд, а в дальнейшем использует cmd. Это означает, что с версией MSYS вы можете писать рецепты так же, как и в системе Unix или Linux, в то время как с родной версией Windows вам, возможно, придется делать что-то по-другому. Для простого выполнения команд они работают одинаково, но для более сложных действий рецепты должны отличаться, потому что cmd имеет сильно отличающийся синтаксис, чем оболочки Unix.

Например, вы можете обрабатывать рекурсивные сборки, подобные этому с помощью MSYS:

recurse-subdirs:
    for i in $(SUBDIRS);            \
    do                              \
        cd $$i && make all || exit; \
    done

В то время как с собственной версией make вам придется делать что-то вроде этого:

recurse-subdirs: FORCE
    for %%i in ($(SUBDIRS)) do     \
        cd %%i && make all || exit

С MSYS также можно с уверенностью предположить, что доступны обычные команды Unix (например, rm *.o), в то время как с помощью native make вы захотите вместо этого использовать команды Windows (например, del *.o).

Какая версия make доступна, зависит от того, как вы устанавливаете PATH. Если обе версии make, одна с именем make и одна с именем mingw32-make, можно найти, выполнив поиск PATH, тогда обе команды будут доступны. Это правда, используете ли вы оболочку MSYS или cmd.