如何使用GNU Make为每个目标运行预配方和后配方?

Bob*_*Bob 7 c++ makefile gnu-make

在中make,是否可以为每个目标定义前食谱和后食谱?

我想(隐式)在显式配方的第一行上方插入前食谱,然后(隐式)在显式配方的最后一行之后插入后食谱。

使用正则表达式插入行会很容易,但是隐式行会更干净。

Leo*_*eon 7

您可以创建一个特殊的辅助 shell,在其输入脚本之前和之后执行所需的前后操作,并告诉make使用该 shell 执行配方(SHELL为此使用变量)。

此外,如果您使用多行配方,则必须启用该.ONESHELL模式。

警告:在这种模式下,失败的命令(除了最后一个)不会违反规则,因此您必须使用 加入命令&&,或者附加 || exit 1到每个命令的末尾,或者使用-e 选项运行真实的 shell 。

例子:

前壳

#!/bin/bash

preaction()
{
    echo "Pre-action"
}

postaction()
{
    echo "Post-action"
}

preaction && /bin/bash "$@" && postaction
Run Code Online (Sandbox Code Playgroud)

生成文件

SHELL=./pre-post-shell

all: Hello Bye

.ONESHELL:

Hello:
    @echo Hello
    echo Hello again

Bye:
    @echo Bye
Run Code Online (Sandbox Code Playgroud)

输出:

$ make
Pre-action
Hello
Hello again
Post-action
Pre-action
Bye
Post-action
Run Code Online (Sandbox Code Playgroud)