我们如何 'loop' 围绕 Makefile 中的文件
How can we 'loop' around files in Makefile
我在一个目录中有一些 tex 文件,其中一些进一步组织成子目录。
input/
|
|-- one.tex
|-- two.tex
|-- sub1/
| |
| |-- three.tex
|
|-- four.tex
|
|-- sub2/
| |
| |-- five.tex
|
|-- six.tex
然后我在每个 tex 文件上 运行 pdflatex 创建一个相应的 pdf 文件(在其名称后附加 "_out"
没有扩展名)具有相同的目录结构(可能使用mkdir -p
) 在输出目录中。
output/
|
|-- one_out.pdf
|-- two_out.pdf
|-- sub1/
| |
| |-- three_out.pdf
|
|-- four_out.pdf
|
|-- sub2/
| |
| |-- five_out.pdf
|
|-- six_out.pdf
如果任何tex文件被修改,我需要使用make
更新相应的pdf文件。
有谁知道如何做到这一点?
我做了类似的事情,但它只处理一个文件(第一个)。
SOURCE_DIR := input
BUILD_DIR := output
TEX_FILES := $(shell find $(SOURCE_DIR) -type f -name "*.tex")
PDF_FILES := $(patsubst $(SOURCE_DIR)/%.tex, $(BUILD_DIR)/%.pdf, $(TEX_FILES))
.PHONY: all
all: $(PDF_FILES)
# $< are inp files and $@ are out files
$(BUILD_DIR)/%.pdf: $(SOURCE_DIR)/%.tex
pdflatex -jobname=$(addsuffix _out,$(basename $@)) $<
PS:使用其他工具可能有更简单的方法(我也很乐意了解它们!)但我正在寻找一种使用 gnu 完成此操作的方法)make作为一种更好地了解它的方式。
如果您展示了一个包含一些实际文件名的小示例以及您在 运行 制作时获得的实际输出,将会很有帮助。我在这个 makefile 中看不出为什么它应该以一个文件停止的明显原因,除非所有其他文件已经存在并且是最新的。
我确实看到了一些奇怪的东西,但由于我对 pdflatex
的工作原理一无所知,所以也许这是意料之中的:
# $< are inp files and $@ are out files
$(BUILD_DIR)/%.pdf: $(SOURCE_DIR)/%.tex
pdflatex -jobname=$(addsuffix _out,$(basename $@)) $<
你的评论(正确地)说 $@
是输出文件,但我在你的 pdflatex
命令行上没有看到你告诉 pdflatex
什么输出文件名采用。它是如何计算出来的?
我在一个目录中有一些 tex 文件,其中一些进一步组织成子目录。
input/
|
|-- one.tex
|-- two.tex
|-- sub1/
| |
| |-- three.tex
|
|-- four.tex
|
|-- sub2/
| |
| |-- five.tex
|
|-- six.tex
然后我在每个 tex 文件上 运行 pdflatex 创建一个相应的 pdf 文件(在其名称后附加 "_out"
没有扩展名)具有相同的目录结构(可能使用mkdir -p
) 在输出目录中。
output/
|
|-- one_out.pdf
|-- two_out.pdf
|-- sub1/
| |
| |-- three_out.pdf
|
|-- four_out.pdf
|
|-- sub2/
| |
| |-- five_out.pdf
|
|-- six_out.pdf
如果任何tex文件被修改,我需要使用make
更新相应的pdf文件。
有谁知道如何做到这一点?
我做了类似的事情,但它只处理一个文件(第一个)。
SOURCE_DIR := input
BUILD_DIR := output
TEX_FILES := $(shell find $(SOURCE_DIR) -type f -name "*.tex")
PDF_FILES := $(patsubst $(SOURCE_DIR)/%.tex, $(BUILD_DIR)/%.pdf, $(TEX_FILES))
.PHONY: all
all: $(PDF_FILES)
# $< are inp files and $@ are out files
$(BUILD_DIR)/%.pdf: $(SOURCE_DIR)/%.tex
pdflatex -jobname=$(addsuffix _out,$(basename $@)) $<
PS:使用其他工具可能有更简单的方法(我也很乐意了解它们!)但我正在寻找一种使用 gnu 完成此操作的方法)make作为一种更好地了解它的方式。
如果您展示了一个包含一些实际文件名的小示例以及您在 运行 制作时获得的实际输出,将会很有帮助。我在这个 makefile 中看不出为什么它应该以一个文件停止的明显原因,除非所有其他文件已经存在并且是最新的。
我确实看到了一些奇怪的东西,但由于我对 pdflatex
的工作原理一无所知,所以也许这是意料之中的:
# $< are inp files and $@ are out files
$(BUILD_DIR)/%.pdf: $(SOURCE_DIR)/%.tex
pdflatex -jobname=$(addsuffix _out,$(basename $@)) $<
你的评论(正确地)说 $@
是输出文件,但我在你的 pdflatex
命令行上没有看到你告诉 pdflatex
什么输出文件名采用。它是如何计算出来的?