【发布时间】:2017-12-17 17:21:28
【问题描述】:
我正在使用 Makefile 和 GNU make 基于源 Markdown 文件创建各种文档输出目标。
这包括使用latex 或pdflatex 创建 DVI 文件。使用 EPS 或 PS 格式以外的图像会导致错误。
我可以在源 Markdown 文件中搜索和替换图像名称,并且已经这样做了。
我想做的是为images/ 子目录中的所有图像文件创建一个makefile 规则,并运行convert 来创建这些文件的eps 版本。
所以:
images/myimage1.png
images/myimage2.jpeg
保留,但创建了其他版本:
images/myimage1.eps
images/myimage2.eps
(是的,我必须保持跟踪,否则其他地方没有名称冲突。)
要运行的命令类似于:
convert -format eps images/myimage1.png images/myimage1.eps
我想在任何非 EPS 图像文件上运行它:gif、jpg、jpeg、png、bmp 等。这些将在 Makefile 中特别列出。
这是第一次迭代
它可以工作(以其他错误为模),虽然它有点长,如果扩展 Imagemagick 支持的全部 193 种图形格式将是... 笨重。
我的目标是构建 DVI,所以我展示了相关的目标
dvi: docfs-Manifesto.dvi
latex: docfs-Manifesto.tex
epsimg.md: docfs-Manifesto.md
docfs-Manifesto.tex: docfs-Manifesto-epsimg.md all-img
pandoc -s --from=markdown --to=latex -o docfs-Manifesto.tex docfs-Manifesto-epsimg.md
docfs-Manifesto-epsimg.md: docfs-Manifesto.md
./img-ref-to-eps.sed docfs-Manifesto.md > docfs-Manifesto-epsimg.md
docfs-Manifesto.dvi: latex
pdflatex -output-format dvi -halt-on-error docfs-Manifesto.tex 2>pdflatex.log
MG_DIR=images
EPS_DIR=images-eps
# We can handle any of about 193 formats Imagemagick will read, but
# let's start with some basics
# ... Source formats
SRC_GIF = $(wildcard $(IMG_DIR)/*.gif)
SRC_JPG = $(wildcard $(IMG_DIR)/*.jpg)
# ... Destination formats
EPS_GIF = $(patsubst $(IMG_DIR)/%.gif,$(EPS_DIR)/%.eps,$(SRC_GIF))
EPS_JPG = $(patsubst $(IMG_DIR)/%.jpg,$(EPS_DIR)/%.eps,$(SRC_JPG))
# And the actual conversions. This ... could be shorter?
all-img: $(EPS_DIR) $(EPS_GIF) $(EPS_JPG)
@echo "Done"
$(EPS_DIR) :
mkdir $(EPS_DIR)
$(EPS_DIR)/%.eps : $(IMG_DIR)/%.gif
convert -format eps $< $@
$(EPS_DIR)/%.eps : $(IMG_DIR)/%.jpg
convert -format eps $< $@
(我认为这就是所有相关规则)
它成功了,因为它失败了我的转换脚本 转换失败。
但这不是 Make 的错。
现在通过 foreach 循环处理代码长度
我们做到了! 77 行代码减少到 17 行(包括空格)。
IMG_DIR=images
EPS_DIR=images-eps
# We can handle any of about 193 formats Imagemagick will read, but
# let's start with some basics
# Thanks @kebs: https://stackoverflow.com/a/47857821/9105048
IMG_EXT=bmp dot gif jpg jpeg png raw tiff xcf pnm ppm ps
# ... Source formats
IMG_FILES = $(wildcard $(IMG_DIR)/*)
# Rename files s/./_/ so: img1.gif => img1_gif Then add extension
IMG_FILES2 = $(subst .,_,$(IMG_FILES))
EPS_FILES = $(patsubst $(IMG_DIR)/%,$(EPS_DIR)/%.eps,$(IMG_FILES2))
all-img: $(EPS_DIR) $(EPS_FILES)
@echo "all-img: done"
$(EPS_DIR) :
mkdir $(EPS_DIR)
$(foreach \
prereq, \
$(IMG_EXT), \
$(eval $(EPS_DIR)/%_$(prereq).eps: $(IMG_SRC)/%.$(prereq); convert -format eps $$< $$@) \
)
当前输出(跟随make clean):
$ make all-img
convert -format eps images/browser-of-a-scientist.jpg images-eps/browser-of-a-scientist_jpg.eps
convert -format eps images/nukewaste.jpg images-eps/nukewaste_jpg.eps
convert -format eps images/standards.png images-eps/standards_png.eps
$ ls images-eps/
browser-of-a-scientist_jpg.eps standards_png.eps
nukewaste_jpg.eps
【问题讨论】:
-
好的,所以你需要一些通配符匹配和模式规则。但在继续之前,您能否向我们展示您已经拥有的代码?
-
@kebs:这里没有与问题相关的代码。我有一个 Makefile 可以生成我想要的大部分输出,尽管 DVI 生成器由于使用 JPG 和 PNG 文件而失败,如前所述。目录结构是
docs,带有一个降价文件和一个images/子目录。如图所示,我现在在 shell 中运行了 Imagemagick 代码。 -
要检查变量,添加一个没有依赖关系的规则(例如,
print:),并以@echo $(SRC_GIF); @echo $(EPS_GIF)作为配方。