簡體   English   中英

在 makefile 中的每個目標之前和之后運行

[英]run before and after each target in a makefile

我想在 makefile 中的每個目標之前和之后運行一個命令。

所以像這樣

pre:
       @echo pre
       @echo running | mailx -s "Start {target}" user@foo.com
post:
       @echo post
       @echo post | mailx -s "Finish {target}" user@foo.com
j:
       long_running_command && echo $@ > $@
k: j
       long_running_command2 && echo $@ > $@

我想為 j 和 k 運行 pre 和 post。 理想情況下,我希望為每個開始和停止的任務收到一封電子郵件。

一種方法是修改 makefile 中的所有配方以調用某些命令。 您可以將它放入一個變量中,這樣它看起來就不會太粗糙:

START = mailto --subject 'Started target $@' me@my.host
END = mailto --subject 'Finished target $@' me@my.host

j:
        $(START)
        long_running_command && echo $@ > $@
        $(END)
k: j
        $(START)
        long_running_command2 && echo $@ > $@
        $(END)

這樣做的好處是你可以挑選你想要的目標; 也許他們中的一些人不需要它。 缺點是如果命令失敗,您根本不會收到任何“結束”電子郵件。

如果您真的想為每個目標都這樣做,那么您可以編寫一個 shell 腳本,該腳本模仿 shell 的行為,但在運行命令的同時還能發送郵件。

$ cat mailshell
#!/bin/sh
# get rid of the -c flag
shift
mailto --subject "started $*" me@my.host
/bin/sh -c "$@"
r=$?
mailto --subject "ended $* with exit code $r" me@my.host
exit $r

(請注意,這完全未經測試,但您會明白我希望的想法)。 然后在您的 makefile 中,將SHELL設置為該 shell:

SHELL := mailshell

j:
        long_running_command && echo $@ > $@
k: j
        long_running_command2 && echo $@ > $@

我想您仍然可以通過將SHELL設置為特定於目標的變量來進行選擇,僅針對您想要使用 shell 的那些目標。

這樣做的一個缺點是,如果您的食譜有多行,您將分別收到一封電子郵件。 您可以通過啟用.ONESHELL:來強制將整個配方傳遞給單個 shell 來解決此問題。 但是,我相信這可能需要您的mailshell工具更加復雜。

如果每個配方只有一個命令,則可以通過更改運行命令的 shell 的配置來實現。

讓配置文件直接運行pre命令並捕獲EXIT以運行 after 命令。

例如:

$ cat Makefile
SHELL := BASH_ENV=/dev/fd/3 3<<<'echo before; trap "echo after" EXIT' /bin/bash

default:
  echo default

other:
  echo first
  echo second
$ make default
echo default
before
default
after

但是,如果配方運行多個命令,這可能不是您想要的,因為每次都會運行前后代碼。

$ make other
echo first
before
first
after
echo second
before
second
after

而且我不知道有什么方法(在遞歸 Makefile 之外)讓不同的配方使用不同的外殼,所以如果你只想為幾個配方設置之前/之后,這將不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM