我想在make文件中的每个shell命令上注入透明包装命令。像time
shell命令之类的东西。 (但是,不是 time
命令。这是一个完全不同的命令。)
有没有办法为gmake会发出的每个shell命令指定某种包装器或decorator?
答案 0 :(得分:3)
有点儿。你可以告诉make使用不同的shell。
SHELL = myshell
其中myshell
是一个像
#!/bin/sh
time /bin/sh "$0" "$@"
但是,通常的方法是将变量作为所有命令调用的前缀。虽然我看不到SHELL
方法的任何显示停止,但前缀方法的优点是它更灵活(您可以为不同的命令指定不同的前缀,并在命令行上覆盖前缀值),以及可能会明显加快。
# Set Q=@ to not display command names
TIME = time
foo:
$(Q)$(TIME) foo_compiler
以下是shell包装器的完整实用示例:
#!/bin/bash
RESULTZ=/home/rbroger1/repos/knl/results
if [ "$1" == "-c" ] ; then
shift
fi
strace -f -o `mktemp $RESULTZ/result_XXXXXXX` -e trace=open,stat64,execve,exit_group,chdir /bin/sh -c "$@" | awk '{if (match("Process PID=\d+ runs in (64|32) bit",$0) == 0) {print $0}}'
# EOF
答案 1 :(得分:1)
我认为没有办法在GNUMake中做你想做的事。
我已经完成了修改Makefile中的PATH env变量的事情,所以我的脚本链接到我想要包装的所有名称的脚本的目录被执行而不是实际的bin。然后,该脚本将查看它是如何被调用的,并使用包装命令执行实际的bin。
即。 exec time "$0" "$@"
这些天我通常只更新Makefile本身的目标。保持对一个文件的所有修改通常比管理链接目录更好的IMO。
<强>更新强>
我尊重吉尔斯的回答。这是一个比我更好的答案。
答案 2 :(得分:0)
GNU make(1)
用于运行命令的程序由SHELL
make变量指定。它将以
$SHELL -c <command>
你不能把-c
放进去,因为这是大多数shell所必需的。 -c
作为第一个参数($1
)传递,<command>
作为单个参数字符串传递,作为第二个参数($2
)。
考虑到-c
:
#!/bin/sh
eval time "$2"
这将导致time
在每个命令前面运行。您需要eval
,因为$2
通常不是单个命令,可以包含需要扩展或处理的各种shell元字符。