如何强制make始终执行目标

问题描述 投票:0回答:1

下面是从 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
在这里没有效果),无论发生什么变化。我是不是错过了什么?

shell makefile
1个回答
0
投票

最后我发现,尽管 VSCode 显示了一个制表符,但 `$(COVER) 目标的第一行有 4 个空格而不是制表符。用制表符替换 4 个空格后,一切都按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.