【发布时间】:2019-02-03 12:37:58
【问题描述】:
我有我的项目的当前文件夹结构
.
├── Makefile
└── S6
├── CD_CS304.md
├── CN_CS306.md
├── DAA_CS302.md
└── graphviz
└── cs304_compilerphases.dot
2 directories, 5 files
我正在为每个 markdown 文件构建单独的 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) $^
我想将 dot 程序的输出嵌入到 Latex pdf 中,但这里的 Makefile 不会将 dot 文件转换为 png,而是直接编译 pdf。
这会使 pdf 编译遇到错误,因为 png 文件不存在。
【问题讨论】:
-
wildcard函数只接受简单的通配符。它不理解像**这样的高级通配符意味着“递归地用于所有子目录”。所以$(wildcard **/*.md)与写$(wildcard */*.md)完全相同:所有.md文件都在当前目录下的一个目录中。 -
似乎是这种情况,我已将其更改为 DOT_SOURCES := $(wildcard /*/.dot) 并且可以正常工作