Force Makefile выполнить script до создания целей
Я использую Makefile.
Однако, есть команда (zsh script), которую я хочу выполнить до того, как будут выполнены какие-либо цели.
Как это сделать?
Спасибо!
Ответы
Ответ 1
Существует несколько методов для выполнения кода до создания целей. Какой из них вы должны выбрать, зависит от того, что вы хотите сделать, и почему вы хотите это сделать. (Что делает zsh script? Зачем вам это нужно?)
Вы можете либо сделать, как @John предлагает; помещая zsh script в качестве первой зависимости. Затем вы должны пометить цель zsh
как .PHONY
, если она фактически не генерирует файл с именем zsh
.
Другим решением (в GNU make, по крайней мере) является вызов функции $(shell ...)
как часть присваивания переменной:
ZSH_RESULT:=$(shell zsh myscript.zsh)
Это выполнит script, как только будет обработан makefile, и до того, как будут выполнены цели. Он также выполнит script, если вы вызовете make файл рекурсивно.
Ответ 2
Просто заставьте зависеть от одной из других целей
foo.obj : zsh foo.c
rule for compileing foo.c
zsh:
rule for running zsh script.
или, в качестве альтернативы, сделать вашу первую цель зависеть от нее
goal: zsh foo.exe
Ответ 3
Решение как для предварительной обработки, так и для постпроцессинга в make файлах с использованием MAKECMDGOALS и двойных правил двоеточия.
MAKECMDGOALS - это цели, перечисленные в командной строке.
Первый шаг - получить первую и последнюю цели из командной строки,
или если в списке нет указанных целей, используйте цель по умолчанию.
ifneq ($(MAKECMDGOALS),)
FIRST_GOAL := $(word 1, $(MAKECMDGOALS))
LAST_GOAL := $(word $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
else
FIRST_GOAL := all
LAST_GOAL := all
endif
Двойные правила двоеточия позволяют использовать несколько рецептов для одной и той же цели в порядке. Вам нужно будет изменить все цели командной строки на двойные правила двоеточия.
#Dummy rule to set the default
.PHONY: all
all ::
#Preprocessing
$(FIRST_GOAL) ::
echo "Starting make..."
all :: normal_prerequistes
normal_recipe
other_stuff
#Postprocessing
$(LAST_GOAL) ::
echo "All done..."