有没有比“制表”更聪明的替代品?

时间:2011-09-24 14:16:55

标签: makefile watch

我遇到了这个有用的提示,如果你正在处理很多文件而你想让它们自动构建你运行:

观看制作

它会重新运行,每隔几秒就可以生成一些东西。

然而......它似乎总是吞下所有的输出。我认为它可能更聪明 - 也许显示输出流但是禁止为'all'做任何事情,这样如果没有构建,输出就不会滚动。

使用循环和grep可以想到一些shell脚本方法...但也许更优雅的东西在那里?有人见过什么吗?

10 个答案:

答案 0 :(得分:39)

使用经典gnu makeinotifywait,不使用基于间隔的轮询:

watch:
    while true; do \
        make $(WATCHMAKE); \
        inotifywait -qre close_write .; \
    done

这样make就会在当前目录树中的每个文件写入时触发。您可以通过运行

指定目标
make watch WATCHMAKE=foo

答案 1 :(得分:9)

这个单行应该这样做:

while true; do make --silent; sleep 1; done

它每秒运行make一次,它只会在实际执行某些操作时打印输出。

答案 2 :(得分:6)

怎么样

# In the makefile:
.PHONY: continuously
continuously:
    while true; do make 1>/dev/null; sleep 3; done  

这样你可以运行

  

持续

只有在出现问题时才会输出。

答案 3 :(得分:6)

Twitter Bootstrap使用watchr ruby​​ gem。

https://github.com/twbs/bootstrap/blob/v2.3.2/Makefile

https://github.com/mynyml/watchr

编辑:

两年后watchr项目似乎不再维护了。请在答案中寻找其他解决方案。就个人而言,如果目标只是为了获得更好的输出,我建议the answer from wch here

答案 4 :(得分:5)

这是一个单行:

while true; do make -q || make; sleep 0.5; done

使用make -q || make代替make只会在有事情要做的情况下运行构建,否则不会输出任何消息。

您可以将此项添加为项目的Makefile:

watch:
    while true; do $(MAKE) -q || $(MAKE); sleep 0.5; done

然后使用make watch来调用它。

这项技术将阻止Make填充终端" make:TARGET"消息。

它也没有像一些文件监视器解决方案那样保留一堆打开的文件描述符,这可能会导致ulimit错误。

答案 5 :(得分:2)

我在Makefile中这样做:

watch:
    (while true; do make build.log; sleep 1; done) | grep -v 'make\[1\]'

build.log: ./src/*
    thecompiler | tee build.log

所以,它只会在我的源代码比我的build.log更新时构建,并且" grep -v" stuff删除了一些不必要的make输出。

答案 6 :(得分:1)

有几个自动构建系统可以执行此操作以及更多 - 基本上当您检查更改为版本控制时,它们将构建/构建 - 查找持续集成

简单的是TeamCityHudson

答案 7 :(得分:1)

@Dobes Vandermeer - 我有一个名为“mkall”的脚本,它在每个子目录中运行make。我可以将该脚本指定为cron作业,每隔五分钟,或一分钟或三十秒运行一次。然后,为了查看输出,我将gcc结果(在每个单独的makefile中)重定向到每个子目录中的日志。

这样的事情对你有用吗?

这可能是相当复杂的,以避免使什么都不做。例如,脚本可以保存每个源文件的修改时间,并在该人员更改时执行make。

答案 8 :(得分:1)

您可以尝试使用inotify-tools之类的东西。它可以让您在更改或保存文件或者inotify可以监视的任何其他事件时查看目录并运行命令。

一个简单的脚本,可以在保存文件时监视保存并启动make。

答案 9 :(得分:0)

您可以更改make文件以输出growl(OS X)或notify-send(Linux)通知。对于Ubuntu中的我来说,这会在屏幕的右上角显示一个通知气泡。

然后你只会在失败时注意到它。

您可能希望将watch设置为仅以这些通知可以显示的速度循环(因此它们不会堆积起来)。