Іноді вам потрібен Makefile, щоб мати змогу запускатися на різних цільових ОС, і ви хочете, щоб збірка вийшла з ладу рано, якщо потрібний виконуваний файл не PATH
замість запуску протягом тривалого часу, перш ніж вийти з ладу.
Відмінне рішення, що надається інженером, вимагає досягнення цілі . Однак якщо у вас є багато виконуваних файлів для тестування, а ваш Makefile має багато незалежних цілей, кожна з яких вимагає тестів, то кожна ціль вимагає тестової цілі як залежності. Це спричиняє багато додаткового набору тексту, а також часу обробки, коли ви робите більше однієї цілі за один раз.
Рішення, що надається 0xf, може перевірити виконуваний файл без досягнення цілі. Це економить багато часу на друк та виконання, коли існує кілька цілей, які можна будувати окремо або разом.
Моє вдосконалення останнього рішення полягає у використанні which
виконуваного файлу ( where
в Windows), а не покладатися на те, що --version
в кожному виконуваному файлі буде опція безпосередньо в ifeq
директиві GNU Make , а не визначати нову змінну та використовувати GNU Make error
функція для зупинки збірки, якщо потрібний виконуваний файл не входить ${PATH}
. Наприклад, для перевірки на lzop
виконуваний файл:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Якщо у вас є кілька виконуваних файлів для перевірки, можливо, ви захочете використовувати foreach
функцію з which
виконуваним файлом:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Зверніть увагу на використання :=
оператора присвоєння, який необхідний для негайної оцінки виразу RHS. Якщо ваш Makefile змінить PATH
, то замість останнього рядка вище вам знадобиться:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Це має дати результат, подібний до:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.