Как сделать Makefile для записи команды и ее вывода в файл? - PullRequest
0 голосов
/ 28 февраля 2019

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

myrule:  
  mycommand >> logfile  

Но это только регистрирует выходные данные команды.Не сама команда.
Следует ли также выводить команду и перенаправить этот вывод в файл журнала?

myrule:
  @echo mycommand >> logile
  mycommand >> logfile

Это дублирование «mycommand» не выглядит хорошо, и оно занимает место врецепт.Особенно, если рецепт длинный.

Должен ли я создать функцию и вызывать ее для каждой команды, которую я хочу записать в журнал?

define log_and_run
@echo $(1) >> logfile
$(1) >> logfile
endef

myrule:
  $(call log_and_run,mycommand)

Теперь мне не нужно дублировать 'mycommand'.Но теперь «моя команда» менее заметна в рецепте.Внимание обращено на «вызов», а не на «мою команду».

А что если mycommand - что-то вроде

$(CC) -o $@ -Wl,--linkeroption $<

Запятая разделит команду на два аргумента при вызове log_and_run.

Есть ли у кого-нибудь решение для этого, которое не отвлекает внимание от команд и работает для произвольных команд?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Пусть снаряд сделает всю тяжелую работу, может быть?Т.е. как то так:

.PHONY: all myrule myrule-with-macro
all: myrule myrule-with-macro

mycommand = echo "Running $@..."

myrule:
    (set -x; $(mycommand)) >>$@.log 2>&1

define log_and_run
(set -x; $(1)) >>$@.log 2>&1
endef

myrule-with-macro:
    $(call log_and_run,$(mycommand))

Тестовый прогон:

$ make
(set -x; echo "Running myrule...") >>myrule.log 2>&1
(set -x; echo "Running myrule-with-macro...") >>myrule-with-macro.log 2>&1

$ ls myrule*.log
myrule.log  myrule-with-macro.log

$ cat myrule*.log
+ echo 'Running myrule...'
Running myrule...
+ echo 'Running myrule-with-macro...'
Running myrule-with-macro...
0 голосов
/ 28 февраля 2019

Это стандартное поведение make для печати команды и ее вывода в stdout.Очевидное решение - просто набрать

myrule:  
    mycommand 

, а затем вызвать make myrule > logfile.

Если вы хотите выполнить перенаправление из Makefile, вы можете вызвать make recursively от специальной цели, основанной на некоторой переменной, которая установлена ​​(или не установлена).

...