我们如何 '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 什么输出文件名采用。它是如何计算出来的?