После трёх лет разработки представлен релиз системы сборки GNU Make 4.0. Наиболее существенным новшеством является опциональная поддержка языка GNU Guile (одна из реализаций языка Scheme) для определения дополнительных функций в make-файлах. Проверить в скрипте поддержку Guile можно путём оценки наличия ключевого слова guile в переменной ".FEATURES". При наличии поддержки Guile, появляется возможность загрузки/определения Guile-скриптов с реализацией дополнительных функций и их использование в сценарии сборки.
Из других изменений отмечается:
Новый оператор "!=" для вызова внешних shell-команд, выступающий в качестве альтернативы функции $(shell ...) и реализованный для совместимости с BSD make. Например, вместо "var := $(shell echo *.c)" можно написать "var != echo *.c". Появление нового оператора может привести к нарушению обратной совместимости, так как присвоение значений переменным оканчивающимся на символ "!" теперь может интерпретироваться как вызов shell-команд. Чтобы избежать подобного поведения следует использовать пробел для явного отделения имени переменной ("var! = value" вместо "var!= value");
Новый оператор присвоения "::=", определённый в стандарте POSIX 2012 и идентичный ранее доступному оператору ":=";
Новая функция $(file ...) для организации записи в файл;
Новая опция командной строки "--output-sync" ("-O"), включающая режим группировки вывода по целям и рекурсивным вызовам make, что позволяет обеспечить наглядность вывода при сборке с распараллеливанием в несколько потоков (вывод разных экземпляров make не будет смешиваться);
Реализация режима трассировки, активируемого через указание опции "--trace". При включении режима выводятся полные сведения о всех шагах сборки с указанием файла и номера строки. Данные выводятся даже, если указана переменная .SILENT или применён префикс "@";
В опцию "--debug" добавлена поддержка флага "n" (none) для принудительного отключения всех отладочных настроек;
Сервер управления работами (jobserver), используемый для оптимизации выполнения параллельной сборки проектов в несколько потоков, адаптирован для работы на платформе Windows. Для Windows также обеспечена поддержка специальной сборочной цели .ONESHELL;
Указание опций "-r" и "-R" в переменной MAKEFLAGS внутри make-файла теперь приводит к удалению всех встроенных правил и переменных.
Из других изменений отмечается:
Новый оператор "!=" для вызова внешних shell-команд, выступающий в качестве альтернативы функции $(shell ...) и реализованный для совместимости с BSD make. Например, вместо "var := $(shell echo *.c)" можно написать "var != echo *.c". Появление нового оператора может привести к нарушению обратной совместимости, так как присвоение значений переменным оканчивающимся на символ "!" теперь может интерпретироваться как вызов shell-команд. Чтобы избежать подобного поведения следует использовать пробел для явного отделения имени переменной ("var! = value" вместо "var!= value");
Новый оператор присвоения "::=", определённый в стандарте POSIX 2012 и идентичный ранее доступному оператору ":=";
Новая функция $(file ...) для организации записи в файл;
Новая опция командной строки "--output-sync" ("-O"), включающая режим группировки вывода по целям и рекурсивным вызовам make, что позволяет обеспечить наглядность вывода при сборке с распараллеливанием в несколько потоков (вывод разных экземпляров make не будет смешиваться);
Реализация режима трассировки, активируемого через указание опции "--trace". При включении режима выводятся полные сведения о всех шагах сборки с указанием файла и номера строки. Данные выводятся даже, если указана переменная .SILENT или применён префикс "@";
В опцию "--debug" добавлена поддержка флага "n" (none) для принудительного отключения всех отладочных настроек;
Сервер управления работами (jobserver), используемый для оптимизации выполнения параллельной сборки проектов в несколько потоков, адаптирован для работы на платформе Windows. Для Windows также обеспечена поддержка специальной сборочной цели .ONESHELL;
Указание опций "-r" и "-R" в переменной MAKEFLAGS внутри make-файла теперь приводит к удалению всех встроенных правил и переменных.