你能在GNU的make中包装每个命令吗?

时间:2011-05-13 22:22:29

标签: bash makefile gnu-make

我想在make文件中的每个shell命令上注入透明包装命令。像time shell命令之类的东西。 (但是,不是 time命令。这是一个完全不同的命令。)

有没有办法为gmake会发出的每个shell命令指定某种包装器或decorator

3 个答案:

答案 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

,您可以编写自己的shell包装器,其中包含您想要的命令。
#!/bin/sh
eval time "$2"

这将导致time在每个命令前面运行。您需要eval,因为$2通常不是单个命令,可以包含需要扩展或处理的各种shell元字符。