我遇到了这个有用的提示,如果您经常处理文件并且希望它们自动构建,您可以运行:
手表制作
它每隔几秒钟就会重新运行一次,然后事情就会建立起来。
然而......它似乎一直在吞噬所有的输出。我认为它可能更聪明 - 可能会显示输出流,但会抑制“所有”都没有做任何事情,这样如果没有构建任何内容,输出就不会滚动。
使用循环和 grep 会想到一些 shell 脚本方法……但也许还有更优雅的方法?有人看到了吗?
使用经典的 gnumake
和inotifywait
,没有基于间隔的轮询:
watch:
while true; do \
make $(WATCHMAKE); \
inotifywait -qre close_write .; \
done
这种方式会在当前目录树中的每个文件写入时触发。您可以通过运行指定目标
make watch WATCHMAKE=foo
这个单线应该做到这一点:
while true; do make --silent; sleep 1; done
它每秒运行make
一次,并且仅在实际执行某些操作时才打印输出。
这是一个单行:
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:Nothing to be done for TARGET”消息填充终端。
它也不像某些文件观察器解决方案那样保留一堆打开的文件描述符,这可能导致 ulimit 错误。
怎么样
# In the makefile:
.PHONY: continuously
continuously:
while true; do make 1>/dev/null; sleep 3; done
?
这样你可以运行
不断地制作
并且仅在出现问题时才获得输出。
Twitter Bootstrapwatchr
为此使用了 ruby gem。
https://github.com/twbs/bootstrap/blob/v2.3.2/Makefile
https://github.com/mynyml/watchr
两年后,该watchr
项目似乎不再维护。请在答案中寻找另一种解决方案。就个人而言,如果目标只是获得更好的输出,我会推荐这里的答案wch
我在我的 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”的东西会删除一些不必要的 make 输出。
@Dobes Vandermeer——我有一个名为“mkall”的脚本,它在每个子目录中运行 make 。我可以将该脚本指定为每五分钟、一分钟或三十秒运行一次的 cron 作业。然后,为了查看输出,我将 gcc 结果(在每个单独的 makefile 中)重定向到每个子目录中的日志。
类似的东西对你有用吗?
它可能非常复杂,以避免使其无能为力。例如,脚本可以节省每个源文件的修改时间,并在那个人发生变化时进行制作。
您可以尝试使用类似 inotify-tools 的工具。当文件更改或保存或 inotify 可以监视的任何其他事件时,它将让您监视目录并运行命令。一个监视保存并在保存文件时启动制作的简单脚本可能会很有用。
这个 shell 脚本使用make
自己来检测-q
标志的变化,然后当且仅当有变化时才进行完全重建。
#!/bin/sh
while true;
do
if ! make -q "$@";
then
echo "#-> Starting build: `date`"
make "$@";
echo "#-> Build complete."
fi
sleep 0.5;
done
除了make
.
您可以将普通make
参数(例如-C mydir
)传递给它,因为它们被传递给make
命令。
如问题中所要求的,如果没有要构建的内容但不吞下输出,则它是沉默的。
您可以方便地保存此脚本,例如~/bin/watch-make
跨多个项目使用。