Makefile 使不在pdf之前构建点文件

Makefile 使不在pdf之前构建点文件,makefile,latex,Makefile,Latex,我有我的项目的当前文件夹结构 . ├── Makefile └── S6 ├── CD_CS304.md ├── CN_CS306.md ├── DAA_CS302.md └── graphviz └── cs304_compilerphases.dot 2 directories, 5 files 我正在为每个标记文件构建单独的PDF,这是我的Makefile # Generate PDFs from the Markdown source

我有我的项目的当前文件夹结构

.
├── Makefile
└── S6
    ├── CD_CS304.md
    ├── CN_CS306.md
    ├── DAA_CS302.md
    └── graphviz
        └── cs304_compilerphases.dot

2 directories, 5 files
我正在为每个标记文件构建单独的PDF,这是我的Makefile

# Generate PDFs from the Markdown source files
#
# In order to use this makefile, you need some tools:
# - GNU make
# - Pandoc

# All markdown files are considered sources
MD_SOURCES := $(wildcard **/*.md)
OUTPUT_PDFS := $(MD_SOURCES:.md=.pdf)
DOT_SOURCES := $(wildcard **/*.dot)
OUTPUT_DOTPNGS := $(DOT_SOURCES:.dot=.png)

all: $(OUTPUT_DOTPNGS) $(OUTPUT_PDFS) 

# Recipe for building png files from dot files
%.png: %.dot
    dot \
        -Tpng $< \
        -o $@

# Recipe for converting a Markdown file into PDF using Pandoc
%.pdf: %.md
    pandoc \
        --variable fontsize=12pt \
        --variable date:"\today" \
        --variable geometry:a4paper \
        --variable documentclass:book \
        --table-of-contents \
        --number-sections \
        --filter pandoc-fignos \
        -f markdown  $< \
        -o $@


.PHONY : clean

clean: $(OUTPUT_PDFS) $(OUTPUT_DOTPNGS)
    $(RM) $^
#从标记源文件生成PDF
#
#要使用此makefile,您需要一些工具:
#-GNU制造
#-潘多克
#所有降价文件都被视为源
MD_来源:=$(通配符**/*.MD)
输出\u pdf:=$(MD\u来源:.MD=.pdf)
DOT_来源:=$(通配符**/*.DOT)
输出\u DOTPNGS:=$(点\u源:.DOT=.png)
全部:$(输出点)$(输出点)
#从点文件构建png文件的方法
%.png:%.dot
圆点\
-Tpng$<\
-o$@
#使用Pandoc将降价文件转换为PDF的方法
%.pdf:%.md
潘多克\
--可变字体大小=12pt\
--可变日期:“\today”\
--可变几何:a4paper\
--变量文档类:book\
--目录\
--节数\
--过滤器pandoc fignos\
-f降价$<\
-o$@
.假冒:干净
清除:$(输出PDF)$(输出PDF)
美元(RM)$^
我想将dot程序的输出嵌入到latex pdf中,但这里的Makefile并没有将dot文件制作成png,而是直接编译pdf


这会导致pdf编译出错,因为png文件不存在。

如果要确保先生成一个文件,再生成另一个文件,请添加依赖项

更改此项:

%.pdf: %.md
为此:

%.pdf: %.md $(OUTPUT_DOTPNGS)

此依赖项表示,“除非您构建了每个png文件,否则不要构建此pdf文件。”

通配符函数只接受简单的全局搜索。它不理解像
**
这样的高级全局搜索意味着“递归地用于所有子目录”。因此,
$(wildcard**/*.md)
实际上等同于将
$(wildcard*/*.md)
:all
.md
文件写入当前目录下的一个目录中。我似乎将其更改为DOT\u SOURCES:=$(wildcard/*.DOT),并且它可以工作