我想使用 make 跟随“东西”:
.textfile
。.nopage
文件。 archive.tgz
。我的目标是:textfile
,nopage
和archive
。 all
应该和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
使用变量SRC
和OBJ
,我收集了所有.pdf文件名,以便textfile
可以从“第一个操作”开始,以下目标均取决于“第一个操作” 。
但是,我的Makefile在执行textfile
之后停止了。因此,如果我称“ make nopage”,它将仅创建.textfile文件并在那里停止。对于后续目标也是如此。
关于如何解决该问题的任何想法?
答案 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”。