fswatch-ing 文件列表,仅生成更改的文件

fswatch-ing a list of files, make-ing only the changed ones

这是使用 pandoc 将 md 编译为 pdf 的最小 makefile。 make watch 命令监视更改的 md 文件(使用 fswatch)并触发 make 如果是。

SRCS=$(wildcard *.md)
PDFS=$(SRCS:.md=.pdf)

all:    $(PDFS)

%.pdf: %.md
    @pandoc $< -o $@

watch: $(SRCS)
    @fswatch -o $^ | xargs -n1 -I{} make

目前,watch 不是很有选择性:即使只更改一个 md 文件,它也会构建 所有 个可能的目标([=中的所有内容] =19=]).我想要此代码的一个版本,它监视所有 md 文件的更改,但只为 changed md 文件构建一个 pdf。 (我意识到这对于目前的案例来说有点毫无意义,但它在另一个更复杂的用例中很有用。)

为什么不在命令行中将要重新创建的目标作为目标目标传递?

@fswatch -o $^ | xargs -n1 -I{} $(MAKE) '{}'

以下似乎有效:

@fswatch -0 $^ | xargs -0 -n1 sh -c 'ALT=`basename "$"`; make $${ALT/.md/.pdf}' _

$ 最终由 fswatch 返回的 /path/to/changed_file.md 标识。几个字符串操作给出 changed_file.pdf,它被馈送到 make.