Дата в рецептах Makefile - PullRequest
       7

Дата в рецептах Makefile

1 голос
/ 26 февраля 2020

Я хочу создать файлы журнала с отметками времени. В моем Makefile я получаю следующую дату:

DATE                = $(shell date '+%Y-%m-%d-%H:%M:%S')

В моем рецепте я делаю пару grep для файла журнала:

my_long_run: 
cd $(MYDIR); Running a tool for a long time | tee -i ./Log/my_long_run_log.$(DATE)
@sleep 2
@grep -iq "Status of the Job:0" Log/my_long_run_log.$(DATE)
@if [ ! -z "$(SOME_ENV_VAR)" ]; then ln -fs $(ANOTHER_ENV_VAR)/my_generate_file; fi; \
echo "$$dependencyTree" > $@; \
echo -e "\nWarning Summary:" >> $@; \
if grep -iq "warn.*total" Log/my_long_run_log.$(DATE)  ; then grep -i "warn.*total" Log/my_long_run_log.$(DATE) >> $@;  fi; \
if grep -iq "warn.*check" Log/my_long_run_log.$(DATE) ; then grep -i "warn.*check" Log/my_long_run_log.$(DATE) >> $@; fi; \
echo -e "\nError Summary:" >> $@; \
if grep -iq "error.*total" Log/my_long_run_log.$(DATE) ; then grep -i "error.*total" Log/my_long_run_log.$(DATE) >> $@; fi; \
if grep -iq "error.*check" Log/my_long_run_log.$(DATE) ; then grep -i "error.*check" Log/my_long_run_log.$(DATE) >> $@; fi;

Проблема заключается в следующем: на первом Дата расширяется как: 2020-02-26-09: 14: 09 . Но команда grep ищет файл с отметкой времени: 2020-02-26-09: 14: 10 grep: Log / my_long_run_log.2020-02-26-09: 14: 10: такого файла нет или каталог gmake: *** [my_long_run] Ошибка 2. И затем, конечно, мне нужно повторить этот запуск со временем выполнения 6-7 часов только из-за этого сбоя grep.

sleep 2

является преднамеренным. Поскольку у меня есть некоторые лаги в моем сервере, и файлы требуют времени, чтобы появиться. Но тем не менее, насколько мне известно, Makefile расширяет все рецепты перед выполнением команд. Почему $ (DATE) имеет два значения для одного рецепта? извините, за то, что не предоставил MWE, скорее абстрагированный. Любая помощь приветствуется.

1 Ответ

1 голос
/ 26 февраля 2020

Вам нужно использовать := для определения вашей переменной вместо =. При использовании = он оценивается каждый раз, когда на него ссылаются, в то время как при использовании := он оценивается только при его определении, а затем его значение используется позже.

Это объясняется в Руководстве по сборке GNU: два варианта переменных , где переменные, определенные с помощью :=, называются simply expanded variables, а переменные, определенные с помощью =, называются recursively expanded variables .

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

Ваш Makefile тогда будет просто так:

DATE := $(shell date '+%Y-%m-%d-%H:%M:%S')
...