Наложить порядок для предпосылок только для заказа цели

У меня есть фрагмент make-файла:

all: $(objects) 
fresh: all | clean directory
directory: ;mkdir -p OutputDirectory
clean: ;rm $(objects); rm -rf OutputDirectory

Здесь я хочу убедиться, что когда я делаю make fresh - clean, следует directory, за которым следует all.

Семантически здесь может не иметь смысла, чтобы clean было обязательным условием только для порядка. Предположим, что это какое-то order only dependency, которое должно выполняться в каком-то порядке.


Следующая ссылка показывает аналогичную проблему, но для обычных зависимостей: > makefile - наложить порядок предварительных условий цели – 2 Ответа


person Porcupine    schedule 28.08.2018    source источник


Ответы (1)


В рецепте fresh вы могли вызвать make дважды рекурсивно в одном и том же make-файле для цели, создающей каталог, и цели all соответственно:

# At the very beginning of the makefile
CURRENT_MAKEFILE :=  $(lastword $(MAKEFILE_LIST))
# ...

.PHONY: all clean fresh

directory := OutputDirectory

all: $(objects) 
fresh: clean
    $(MAKE) -f $(CURRENT_MAKEFILE) $(directory)
    $(MAKE) -f $(CURRENT_MAKEFILE) all

$(directory): ;mkdir -p $@
clean: ;rm -f $(objects); rm -rf $(directory)

Таким образом, цели all предшествует цель $(directory), которой, в свою очередь, предшествует clean.

person 眠りネロク    schedule 28.08.2018
comment
Привет! ИМХО это не Order only dependency т.к. после первого запуска OutputDirectory существует, но создается заново, так как временная метка каталога меняется при создании в нем новых файлов. См.: Заказывайте только необходимые компоненты из документации GNU Make. - person Porcupine; 28.08.2018
comment
Он был создан снова, потому что directory был фальшивой целью. Однако если цель называется OutputDirectory (т. е. расширение $(directory)), что соответствует каталогу, который вы хотите создать, то после его создания и до тех пор, пока он существует, рецепт $(directory) больше не будет выполняться. - person 眠りネロク; 28.08.2018
comment
См. последний пример на странице GNU make: Prerequisite Types. - person Porcupine; 28.08.2018
comment
@Nikhil $(directory) выше не является требованием только для заказа, но ИМХО это не имеет значения. Если fresh соответствует, то его рецепт всегда выполняется, так как это фальшивая цель. Рецепт $(directory) будет запущен только в том случае, если каталог не существует, так как цель $(directory) не имеет предварительных требований. Я думаю, что чистый эффект в этом случае такой же. - person 眠りネロク; 28.08.2018