加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

GNU Makefile等效于shell的“TRAP”命令,用于在退出时简要识别构

发布时间:2020-12-16 03:09:12 所属栏目:百科 来源:网络整理
导读:标准:Makefile是一个GNU Make Makefile – 我对makepp,qmake,cmake等不感兴趣.他们都很好(特别是cmake),但这是工作,在工作中我们使用GNU Make.最佳解决方案是纯粹的Makefile解决方案,而不是解析为您做的一个 shell脚本. 我也不想做一个“继续失败”的解决方
标准:Makefile是一个GNU Make Makefile – 我对makepp,qmake,cmake等不感兴趣.他们都很好(特别是cmake),但这是工作,在工作中我们使用GNU Make.最佳解决方案是纯粹的Makefile解决方案,而不是解析为您做的一个 shell脚本.

我也不想做一个“继续失败”的解决方案 – 如果它被破坏,它是坏的,需要修复.

情况是这样的,我有一个makefile来并行构建几个目录 – 如果其中一个失败,当然整个构建失败,但直到所有运行都运行完成(或失败)为止.这意味着实际失败的原因被埋在任何距离make输出结束的地方.

这是我所得到的一个例子:

all: $(SUBDIRS)

SUBDIRS = 
  apple 
  orange 
  banana 
  pineapple 
  lemon 
  watermelon 
  grapefruit

$(SUBDIRS):
  cd $@ && $(MAKE) $(MFLAGS) 2>&1 | sed -e "s/^/$(notdir $(@)): /g"

如果我运行’make -j 5’和’orange’发生故障 – 我想在最后看到一个这样的表
的制作过程

apple     - passed
  orange    - FAILED
  banana    - passed
  pineapple - passed
  lemon     - passed

我认为有一个&& echo“passed”> .result ||回显“FAILED”> .result,但仍然需要某种类型的TRAP或__onexit()清理命令才能在退出时打印出来.

任何Makefile ninjas都有一个pure-makefile解决方案?

取消编辑 – 我的解决方案实际上并没有像我曾经希望的那样工作.STYMIED!

解决方法

当你想让第一次失败中止时,立即结束并杀死所有的正在进行的工作,而不是等待他们完成,你需要补丁GNU Make这样
http://lists.gnu.org/archive/html/bug-make/2009-01/msg00035.html

那么你需要为每个调用的shell设置一个陷阱(如果你使用一个管道,也要设置-o pipefail),如本文http://lists.gnu.org/archive/html/help-make/2009-02/msg00011.html所述

简而言之:

target1:
    trap 'kill $$(jobs -p)'; command && something || something-else
target2:
    trap 'kill $$(jobs -p)'; set -o pipefail; command | sed '...'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读