如何制作Makefile来将命令及其输出记录到文件中?

时间:2019-02-28 19:51:16

标签: logging makefile gnu-make

我想将命令及其输出都记录到日志文件中。看起来很容易。只需将stdout重定向到日志文件即可。

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”在配方中不再可见。注意是在“呼叫”上,而不是在“ mycommand”上。

如果'mycommand'是这样的

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

在调用“ log_and_run”时,逗号会将命令分为两个参数。

有人对此有一个解决方案,它不会将注意力从命令转移到任意命令上吗?

2 个答案:

答案 0 :(得分:0)

make的默认行为是将命令及其输出都打印到stdout。 一个明显的解决方案是只拥有

myrule:  
    mycommand 

但请致电make myrule > logfile

如果要从Makefile中进行重定向,则可以基于已设置(或未设置)的某个变量从特殊目标invoke make recursively进行操作。

答案 1 :(得分:0)

让外壳完成所有繁重的工作,也许吗?即像这样的东西:

.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...