【问题标题】:fswatch-ing a list of files, make-ing only the changed onesfswatch-ing 文件列表,仅生成已更改的文件
【发布时间】:2016-10-16 15:43:58
【问题描述】:

这是使用 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 文件,它也会构建所有 个可能的目标(PDFS 中的所有内容)。我想要这个代码的一个版本,它可以监视所有md 文件的更改,但只为更改 md 文件构建一个pdf。 (我意识到这对于目前的案例来说毫无意义,但它在另一个更复杂的用例中很有用。)

【问题讨论】:

    标签: makefile fswatch


    【解决方案1】:

    以下似乎有效:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,但这似乎不起作用:make[1]: *** 没有将目标设为“1”的规则。停止。
      • 我猜你不应该真的需要{}。好吧,我不知道 fswatch 是如何工作的。显然,它的输出与预期不符(例如,它不仅仅是打印已修改的文件列表,每行一个文件名)。我建议您将 -t--verbose 选项添加到 xargs 并查看 xargs 命令实际调用的内容。此外,您应该在 shell 提示符下单独运行 fswatch 命令并查看它生成的输出。
      • 我刚刚查看了在线文档:emcrisostomo.github.io/fswatch/doc/1.9.3/fswatch.html/… 你不想要-o 选项,很明显。那只是打印更改的数量。您需要打印实际更改的文件的主模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多