【问题标题】:Make not building dot files before pdf在pdf之前不要构建点文件
【发布时间】: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) 并且可以正常工作

标签: makefile latex


【解决方案1】:

如果要确保在另一个文件之前构建一个文件,请添加依赖项。

改变这个:

%.pdf: %.md

到这里:

%.pdf: %.md $(OUTPUT_DOTPNGS)

这个依赖说,“除非你已经构建了每个 png 文件,否则不要构建这个 pdf 文件。”

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多