make:执行依赖于第一个目标的多个目标在创建第一个目标后停止

make: Execution of multiple targets dependant on first one stops after making the first target

我想使用 make 执行以下 "stuff":

  1. 将文件夹中的 .pdf 文件转换为 .txt 文件,但重命名其扩展名 从 .txt 到 .textfile.
  2. 删除它们的页码并将它们保存为 .nopage 文件。
  3. 将所有 .nopage 文件保存到存档中。存档的名称应为 archive.tgz.

我的目标是:textfilenopagearchiveall 应该和 archive 一样。

这是我的代码:

SRC=$(wildcard *.pdf)
OBJ=$(SRC:.pdf=.converted)

.PHONY: all archive trimmed converted search-% help clean

.SECONDARY:

help:
    @echo "$$helptext"

textfile: $(OBJ)                        
%.textfile: %.pdf
    pdftotext $< $@

nopage: textfile
%.nopage: %.textfile
    @cat $< | sed 's/Page [0-9]*//g' > $@

archive: nopage
archive.tgz: %nopage
    tar -c --gzip $@ $<

all: archive

使用变量 SRCOBJ,我收集了所有 .pdf 文件名,以便 textfile 可以从 "first operation" 开始,以下目标是一切取决于。 但是,我的 Makefile 在执行 textfile 后停止。因此,如果我调用 "make nopage",它只会创建 .textfile 文件并停在那里。后面的目标也一样。

关于如何解决这个问题的任何想法?

看看这两条规则:

nopage: textfile
%.nopage: %.textfile
    @cat $< | sed 's/Page [0-9]*//g' > $@

是的,这是两条规则。第一个是你打电话的那个;它的 target 是 nopagee,它有 textfile 作为先决条件,并且没有命令。所以在 make 执行完 textfile 规则后,就不再做任何事了。模式规则 (%.nopage: ...) 根本不会执行。

这是一个很好的方法:

NOPAGES := $(patsubst %.pdf, %.nopage, $(SRC))
# or you could use NOPAGES := $(SRC:.pdf=.nopage)

.PHONY: nopages
nopages: $(NOPAGES)
%.nopage: %.textfile
    @sed 's/Page [0-9]*//g' $< > $@

并且一定要更改存档规则:

archive.tgz: $(NOPAGES)
    tar -c --gzip $@ $^

请注意在最后一个命令中使用 $^ 而不是 $<。另请注意,我从您的 makefile 中复制了 tar 语法;我的 tar 版本不接受该命令,它在“$@”之前需要“-f”。