make:执行第一个目标后,取决于第一个目标的多个目标的执行

时间:2018-06-30 23:08:27

标签: makefile dependencies chain targets

我想使用 make 跟随“东西”:

  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可以从“第一个操作”开始,以下目标均取决于“第一个操作” 。 但是,我的Makefile在执行textfile之后停止了。因此,如果我称“ make nopage”,它将仅创建.textfile文件并在那里停止。对于后续目标也是如此。

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

1 个答案:

答案 0 :(得分:2)

看看这两个规则:

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

是的,这是两个规则。第一个是您所呼叫的那个;它的目标是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”。