下面是从 asciidoc 生成 PDF 的
Makefile
。封面是一个 SVG 图像,我在构建时修改以注入年份、修订版本,并根据标题的长度调整某些元素的大小。
SHELL := /bin/bash
.DEFAULT_GOAL := all
# document revision
REV := "0.1.$(or $(shell git rev-parse HEAD), 0)"
# source directory
SRCDIR := ${CURDIR}/src
# theme directory
THEMEDIR := ../theme
# images directory
IMGDIR := images
# source files
ADOC_FILES := $(wildcard $(SRCDIR)/*.adoc)
# document cover
COVER_TEMPLATE := $(SRCDIR)/$(IMGDIR)/cover-template.svg
COVER := $(SRCDIR)/$(IMGDIR)/cover.svg
# output directories
OUTDIR := ${CURDIR}/build
HTML_OUTDIR := $(OUTDIR)/html
PDF_OUTDIR := $(OUTDIR)/pdf
# output files
BASENAME := $(shell basename `pwd`)-$(REV)
HTML_FILE := $(HTML_OUTDIR)/$(BASENAME).html
PDF_FILE := $(PDF_OUTDIR)/$(BASENAME).pdf
# custom attributes
APPNAME=MyApp
.PHONY: all html pdf clean $(COVER)
all: html pdf
html: $(HTML_FILE)
pdf: $(PDF_FILE)
clean:
@rm -rf $(OUTDIR) && rm -f $(COVER)
$(HTML_OUTDIR):
mkdir -p $@
$(PDF_OUTDIR):
mkdir -p $@
$(COVER):
echo; \
WIDTH=$$(magick -font Verdana -pointsize 30 label:"Kippis" -format "%[w]" info:) && \
YEAR=$$(date +%Y) && \
sed "s/\$$WIDTH/$${WIDTH}/g; s/\$$YEAR/$${YEAR}/g; s/\$$REV/${REV}/g" \
$(COVER_TEMPLATE) > $@
$(HTML_FILE): $(ADOC_FILES) | $(HTML_OUTDIR)
bundle exec asciidoctor \
-r asciidoctor-diagram \
-a revnumber=$(REV) \
-a appname=$(APPNAME) \
-a imagesdir=$(IMGDIR) \
$(SRCDIR)/main.adoc \
-o $@
$(PDF_FILE): $(COVER) $(ADOC_FILES) | $(PDF_OUTDIR)
bundle exec asciidoctor-pdf \
-r asciidoctor-diagram \
-a notitle \
-a revnumber=$(REV) \
-a appname=$(APPNAME) \
-a imagesdir=$(IMGDIR) \
-a pdf-themesdir=$(THEMEDIR) \
-a pdf-fontsdir="$(THEMEDIR);GEM_FONTS_DIR" \
-a pdf-theme=custom \
$(SRCDIR)/main.adoc \
-o $@
目标
$(PDF_FILE)
依赖于$(COVER)
来更新文档封面...问题是目标$(COVER)
永远不会被执行,除非我添加echo
命令。顺便说一句,我想始终运行 $(COVER)
(.FORCE
在这里没有效果),无论发生什么变化。我是不是错过了什么?
最后我发现,尽管 VSCode 显示了一个制表符,但 `$(COVER) 目标的第一行有 4 个空格而不是制表符。用制表符替换 4 个空格后,一切都按预期工作。