[英]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.