Как уже отмечалось, GNU make
проверяет GNUmakefile
до makefile
или Makefile
, я использовал тривиальное исправление, такое как вы описали, по умолчанию (приманка) Makefile
, которое вызывает ошибку / предупреждение :
default:
@echo "This requires GNU make, run gmake instead"
exit 70
GNU делает документацию рекомендует использовать имя GNUmakefile
, когда Makefile
является GNU make конкретным, так что это мое предпочтительное решение.
На платформах, где нативный make
предпочитает другое имя Makefile, вы можете внести изменения в это, например, во FreeBSD у меня есть вышеупомянутая приманка в BSDmakefile
, которая используется вместо Makefile
(таким образом, система make
не может испортить мою сборку). AFAICT в AIX или Solaris make
не имеют альтернативного имени, которое вы могли бы использовать таким образом.
Одна проблема с оболочкой Makefile
, которая пытается вызвать GNU make
, передает все аргументы.
Кажущийся переносимым тест (до сих пор он работал на смеси древних систем OSF1, BSD и Solaris), вы можете использовать SOMETHING=$(shell ...)
, чтобы определить, работает ли GNU make
, не версии GNU не установлено SOMETHING
. Из-за отложенной оценки переменных вы не можете использовать это так легко, как можно было бы ожидать. Это основывается на реализации, которая молча обрабатывает имена макросов с пробелами при расширении с помощью $()
(т. Е. Обрабатывает $(shell foo)
как имя переменной / макроса, а не функцию , даже если присвоение такому имени в этом реализация вызовет ошибку).
Единственный переносимый способ, которым вы можете напечатать ошибку clear , - это иметь фиктивную цель, которая всегда выполняется, используя вышеописанный трюк:
GNUMAKE=$(shell echo GNUMAKE)
default: gnumake all
gnumake:
@[ "$(GNUMAKE)" = "GNUMAKE" ] || { echo GNU make required ; exit 70; }
Предполагается, что у вас есть оболочка POSIX sh
.
(Я видел тесты, которые проверяют $(MAKE) -v
, когда обе системы и GNU make называются "make
", система make
сговаривается против вас и вызывает GNU make
... Вам понадобятся некоторые тщательная проверка переменных среды PATH
, MAKE
и, возможно, SHELL
для обработки каждого случая.)