首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Make:错误时停止编译

Make:错误时停止编译
EN

Stack Overflow用户
提问于 2016-02-29 13:38:17
回答 1查看 1.5K关注 0票数 2

我开始使用GNU Make作为我的前端构建工具,而且大多数东西都很好用。唯一令人讨厌的是,当其中一个步骤达到错误时,编译似乎不会停止。Makefile的相关部分:

代码语言:javascript
复制
js_files=$(filter-out $(ignore_js),$(wildcard \
             js/ll/*.js js/ll/**/*.js))
ignore_js=js/ll/dist% js/ll/%.min.js

%.min.js: %.js
    @echo ">>> Uglifying $?"
    @$(BABELJS) $(BABELJSFLAGS) $? | $(UGLIFYJS) --source-map $(UGLIFYJSFLAGS) > $@

min_js_files=$(js_files:%.js=%.min.js)
main.js: $(min_js_files)
    @echo ">>> Concatenating JavaScript"
    mkdir -p $(DIST_DIR)
    cat $^ > $(DIST_DIR)$@

prod: main.js clean

运行make prod的输出如下所示:

代码语言:javascript
复制
>>> Uglifying js/ll/DateEx.js              
SyntaxError: js/ll/DateEx.js: Invalid number (22:36)
  20 |     day = today.getDate();          
  21 |   }                                 
> 22 |   return new Date(year, month, day, 01, 0, 0);
     |                                     ^
  23 | }
  24 |
  25 | function newDateS(s)
>>> Uglifying js/ll/Anonymization.js
>>> Uglifying js/ll/DummyStorage.js
(...)

我有这样的印象,这是因为这些步骤是并行的,但我不知道如何支持这一点。当其中一个步骤返回非零时,如何使编译停止?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 15:59:10

您所要求的是良好的默认行为的Make。构建链中的某些内容没有正确地设置失败时的非零退出代码,或者您正在掩盖它。

特别是,shell管道的退出代码始终是管道中最终命令的退出代码。换句话说,您的菜谱中BABELJS的任何错误都将丢失。

也许重构不使用管道,也许是这样的:

代码语言:javascript
复制
%.min.js: %.js.tmp
    $(UGLIFYJS) --source-map $(UGLIFYJSFLAGS) <$< >$@
%.js.tmp: %.js
    $(BABELJS) $(BABELJSFLAGS) $< >$@

.PHONY: clean
clean:
    rm *.js.tmp

临时文件的使用有点麻烦,是否在第一步使用单独的配方是一种任意性的选择。我更喜欢这种风格,因为它更符合Make的精神(显式声明依赖关系,让Make跟踪),但是如果您想要对流进行细粒度的控制,则可以采用相反的方式。

我还从@规则中删除了BABELJS前缀。这是我的一次私事--把你的Makefile乱扔在里面,会让调试变得困难,如果你想要和平和安静,正确的解决方案就是使用make -s

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35701016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档