Навязать заказ на предпосылки цели - PullRequest
0 голосов
/ 27 августа 2018

У меня есть фрагмент makefile:

all: $(objects)
fresh: clean all
clean: ;rm $(objects)

Здесь я хочу убедиться, что когда я делаю, make fresh - clean должно предшествовать all.

Но как я могу убедиться в этом, учитывая, что когда я делаю make all, clean не должно быть сделано?


Я могу представить, что один из способов может быть таким

fresh: clean
    make all

Это правильный (или единственный) способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Если вы используете GNU make:

all:
    @echo $@
    @sleep 1
    @echo end $@

clean:
    @echo $@
    @sleep 1
    @echo end $@

fresh:: clean
fresh:: all

.PHONY: clean fresh all

Обратите внимание на двойное двоеточие после цели s fresh!См. документацию :

Правила двойного двоеточия для цели выполняются в том порядке, в котором они указаны в файле makefile.

Если вы запуститеmake -j2 fresh показывает, что работает как ожидалось:

clean
end clean
all
end all

Но с fresh:: clean all не работает должным образом параллельно (возможно, неожиданно).

С BSD make:

 all:
    @echo $@
    @sleep 1
    @echo end $@

clean:
    @echo $@
    @sleep 1
    @echo end $@

fresh:  clean all
    @echo $@

.ORDER: clean all
.PHONY: clean all fresh

Обратите внимание, что строка начинается с .ORDER.Он также хорошо работает при распараллеливании (см. man make ).Без распараллеливания учитывается порядок зависимостей в строке fresh:.

0 голосов
/ 27 августа 2018

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

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

.PHONY: fresh
fresh: clean
    $(MAKE) -f $(CURRENT_MAKEFILE) all

Это накладывает порядок, поскольку цель fresh зависит от предпосылки clean, рецепт clean будет выполнен до рецепта fresh, который, в свою очередь, выполнит рецепт all.

Обратите внимание, что я использую здесь $(MAKE) вместо make для рекурсии.

...