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..."