如何在Makefile中捕获退出(ctrl+c)信号?

问题描述 投票:0回答:3

我正在尝试 trap 退出(ctrl+c)信号来执行一些清理活动。

在 shell 脚本中我按照下面的函数来捕获,

#To trap ctrl-c signals
trap ctrl_c INT

#To trap exit signals
trap on_exit EXIT

function ctrl_c() {
    echo "exited by user"
    exit
}

function on_exit() {
    echo "exited by user"
    exit
}

如何在 Makefile 中实现相同的目标?

linux makefile build signals gnu-make
3个回答
4
投票

你不能在 make 中捕获信号。尝试使用

.INTERMEDIATE
进行清理并阅读 5.6 中断或终止 make

all: test.out

test.out: test.tmp
    sleep 10

test.tmp:
    echo x>test.tmp

.PHONY: all

.INTERMEDIATE: test.tmp

Make 捕获中断信号并删除此类文件(如果它们是图形的一部分并且在启动之前不存在):

$ make
echo x>test.tmp
sleep 10
make: *** [Makefile:4: test.out] Interrupt
make: *** Deleting intermediate file 'test.tmp'

如果你确实需要在 make 退出时执行某些程序,请在某个变量的初始化中生成一个后台进程,并让它等待主 make 进程终止:

DUMMY := $(info launching the moniror process...)$(shell some-command& )

3
投票

可以显式调用 bash 解释器并在那里定义陷阱:

test.out:
    bash -c "trap 'rm test.tmp' EXIT; \
             echo x>test.tmp; \
             cp test.tmp test.out"

0
投票

我在 makefile 的开头使用以下内容:

ifdef MAKELEVEL
    ifeq "${MAKELEVEL}" "0"
        export SD:=$(shell mktemp -d ./.make-tmp_XXXXXXXX)
        $(info Launching clean up task for ${SD})
        $(shell { trap 'rm -rf ${SD};' EXIT; tail --pid=$$PPID -f /dev/null; }\
              </dev/null >/dev/null 2>/dev/null &)
  endif
endif

首先检查make级别是否为零,因此正在运行的make不是子make。 (这可能是特定于我的用例的,其中子制造商应该使用此目录及其中的文件。)

如果是这种情况,请使用

mktemp
创建临时目录并将文件名保存在 make 变量 SD 中。

然后在后台启动一个 shell,等待其 PID 为 $PPID 的父级退出。父进程是 make 进程,因此会等到主 make 进程完成。 shell 有一个“退出陷阱”,一旦退出就会删除临时目录。这适用于 make 进程的定期退出或使用 ctrl-c 中断它。

使用

tail
进行的 hack 是
tail
的特殊功能,可能仅在 Linux 上。从手册页来看:“--pid=PID...在进程 ID 之后终止,PID 死亡”。内置的 bash
wait
不起作用,因为它只等待孩子们......

背景:

我使用文件将一些信息从子品牌传达到主品牌。当主 make 退出时,所有这些信息都将通过删除临时目录来删除。请注意,在我的例子中,子 make 使用相同的 makefile。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.