Automatically triggering make when editing files
Shortening the edit-build-test cycle as much as possible can greatly increase your productivity. This post presents an useful trick to run make, or any other command, every time a file is modified. I mainly use this when working with LaTeX to compile a PDF upon save, but I can imagine many other use-cases.
Without further ado, here’s the command as a make
rule:
.PHONY: watch
# other rules ...
watch:
while true; do \
find . -type d -not -path "./.git*" -not -path "./build*" \
| xargs inotifywait \
--event move,modify,close_write,moved_to,create,delete \
--exclude "./.git/\|./build/*" ; \
make ; \
done
So that invoking make
alone builds the project, while make watch
starts this
continuous edit-build loop. For example, I used this in my pandoc template for
beamer so that I can write slides in Markdown using vim or emacs on the
left half of the screen and a PDF preview on the right half. Thanks to this
trick, the PDF preview is updated as soon as I save even faster than Overleaf!
The central part of this command is the inotifywait
part: this little program
simply waits until a file or folder is created, deleted, or modified in one of
the paths that we specified as argument (more on this in a minute). When this
happens, inotifywait
just terminates, and at this point the following command,
in this case make
, is triggered. Finally, all of this is enclosed into a
while true
loop to repeat forever.
To tell inotifywait
where to watch for changes we use find
to look for all
folders in the current path, excluding .git
, build
and everything below them
(apparently, excluding files from find
is far from trivial).
This only works on Linux, but a similar version can be written for OS X and
Windows as well using fswatch instead of inotifywait
.