Make: возможно ли иметь «ярлыки» целей для возобновления сборки - PullRequest
0 голосов
/ 21 февраля 2012

Допустим, у меня есть выходной файл, который стоит сделать дорого.Это также требует процесса настройки среды, который также является дорогостоящим для запуска.Рецепт для создания выходных данных также создает промежуточный файл, который затем используется для создания выходного файла.

output_file :
    expensive_env_setup ; \
    generate_file

Где generate_file также создает промежуточный_файл.С учетом промежуточного_файла и правильных параметров, генерирующий_файл может возобновить генерацию файла, если вторая часть генерации не удалась.

Я пытаюсь разрешить возобновить сборку из файла промежуточного_файла в процессе сборкине удалось после генерации промежуточного файла.Я не хочу разбивать процесс сборки на отдельные рецепты, так как настройка среды также стоит дорого, и это сделает процесс сборки более успешным для успешных сборок.

Например, я мог бы сделать следующее:

output_file : intermediate_file :
    expensive_env_setup ; \
    generate_file -resume intermediate_file

intermediate_file :
    expensive_env_setup ; \
    generate_file -intermediate intermediate_file

Там, где рецепт промежуточного файла только генерирует этот файл, но это будет означать, что процесс настройки среды необходимо будет запустить дважды.

Есть ли способ указать, чторецепт output_file может генерировать конкретный промежуточный файл, и make будет перестраивать с использованием рецепта промежуточного_файла, если промежуточный_файл был сгенерирован, но выходной_файл не был (т.е. вторая часть завершилась неудачно)?

1 Ответ

1 голос
/ 19 декабря 2018

Очень старый вопрос, но поскольку я только что решил похожую проблему ... Сделать условные обозначения одним из решений, мы можем использовать их для проверки наличия промежуточного файла:

ifeq ($(wildcard intermediate_file),intermediate_file)
GENERATEFLAGS := -resume
DEPS          := intermediate_file
else
GENERATEFLAGS := -intermediate
DEPS          :=
endif

output_file: $(DEPS)
    expensive_env_setup; \
    generate_file $(GENERATEFLAGS) intermediate_file

clean:
    rm -f output_file intermediate_file

Демонстрация (смодифицированный Makefile для эмуляции обработки, печати информации о ходе выполнения и разрешения прерывания длительной обработки):

$ cat Makefile
ifeq ($(wildcard intermediate_file),intermediate_file)
GENERATEFLAGS := -resume
DEPS          := intermediate_file
else
GENERATEFLAGS := -intermediate
DEPS          :=
endif

output_file: $(DEPS)
    @printf 'expensive_env_setup\n'; \
    printf 'generate_file $(GENERATEFLAGS) intermediate_file\n'; \
    touch intermediate_file; \
    if [ -n "$(STOP)" ]; then printf 'Interrupted\n'; exit 0; fi; \
    touch intermediate_file; \
    touch output_file

clean:
    rm -f output_file intermediate_file
$ make
expensive_env_setup
generate_file -intermediate intermediate_file
$ ls
Makefile  intermediate_file  output_file
$ touch intermediate_file
$ make
expensive_env_setup
generate_file -resume intermediate_file
$ ls
Makefile  intermediate_file  output_file
$ make
make: 'output_file' is up to date.
$ make clean
rm -f output_file intermediate_file
$ make STOP=1
expensive_env_setup
generate_file -intermediate intermediate_file
Interrupted
$ ls
Makefile  intermediate_file
$ make
expensive_env_setup
generate_file -resume intermediate_file
$ ls
Makefile  intermediate_file  output_file
$ make
make: 'output_file' is up to date.

Примечание: переменная $(DEPS) гарантирует, что в случае intermediate_file и output_file оба существуют, но intermediate_file новее, мы обновляем output_file с опцией -resume.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...