我想将命令及其输出都记录到日志文件中。看起来很容易。只需将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”时,逗号会将命令分为两个参数。
有人对此有一个解决方案,它不会将注意力从命令转移到任意命令上吗?
答案 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...