make:执行依赖于第一个目标的多个目标在创建第一个目标后停止
make: Execution of multiple targets dependant on first one stops after making the first target
我想使用 make 执行以下 "stuff":
- 将文件夹中的 .pdf 文件转换为 .txt 文件,但重命名其扩展名
从 .txt 到
.textfile
.
- 删除它们的页码并将它们保存为
.nopage
文件。
- 将所有 .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
可以从 "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”。
我想使用 make 执行以下 "stuff":
- 将文件夹中的 .pdf 文件转换为 .txt 文件,但重命名其扩展名
从 .txt 到
.textfile
. - 删除它们的页码并将它们保存为
.nopage
文件。 - 将所有 .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
可以从 "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”。