如何制作 Makefile 以将命令及其输出记录到文件中?
How do I make a Makefile to log both command and its output to a file?
我想将命令及其输出都记录到日志文件中。这似乎很容易。只需将标准输出重定向到日志文件。
myrule:
mycommand >> logfile
但这只会记录命令的输出。不是命令本身。
我是否也回显命令并将输出重定向到日志文件?
myrule:
@echo mycommand >> logile
mycommand >> logfile
'mycommand' 的重复看起来不太好,它在食谱中占用了 space。特别是如果食谱很长。
我是否应该创建一个函数并为我要记录的每个命令调用它?
define log_and_run
@echo $(1) >> logfile
$(1) >> logfile
endef
myrule:
$(call log_and_run,mycommand)
现在我不必重复 'mycommand'。但是现在 'mycommand' 在食谱中不那么明显了。注意 'call',而不是 'mycommand'。
如果 'mycommand' 类似于
会怎样
$(CC) -o $@ -Wl,--linkeroption $<
调用'log_and_run'时,逗号会将命令分成两个参数。
有没有人对此有解决方案,不会将注意力从命令上移开并适用于任意命令?
将命令及其输出打印到标准输出是 make 的默认行为。
一个明显的解决方案是
myrule:
mycommand
然后调用 make myrule > logfile
.
如果你想从 Makefile 中进行重定向,你可以 invoke make recursively 从一个基于某些变量设置(或未设置)的特殊目标。
让 shell 完成所有繁重的工作,也许吗? IE。像这样:
.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...
我想将命令及其输出都记录到日志文件中。这似乎很容易。只需将标准输出重定向到日志文件。
myrule:
mycommand >> logfile
但这只会记录命令的输出。不是命令本身。
我是否也回显命令并将输出重定向到日志文件?
myrule:
@echo mycommand >> logile
mycommand >> logfile
'mycommand' 的重复看起来不太好,它在食谱中占用了 space。特别是如果食谱很长。
我是否应该创建一个函数并为我要记录的每个命令调用它?
define log_and_run
@echo $(1) >> logfile
$(1) >> logfile
endef
myrule:
$(call log_and_run,mycommand)
现在我不必重复 'mycommand'。但是现在 'mycommand' 在食谱中不那么明显了。注意 'call',而不是 'mycommand'。
如果 'mycommand' 类似于
会怎样$(CC) -o $@ -Wl,--linkeroption $<
调用'log_and_run'时,逗号会将命令分成两个参数。
有没有人对此有解决方案,不会将注意力从命令上移开并适用于任意命令?
将命令及其输出打印到标准输出是 make 的默认行为。 一个明显的解决方案是
myrule:
mycommand
然后调用 make myrule > logfile
.
如果你想从 Makefile 中进行重定向,你可以 invoke make recursively 从一个基于某些变量设置(或未设置)的特殊目标。
让 shell 完成所有繁重的工作,也许吗? IE。像这样:
.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...