Makefile:操作子目录中的所有文件?
我使用Makefile和gnumake根据源标记文件创建各种文档输出目标 这包括使用Makefile:操作子目录中的所有文件?,makefile,gnu-make,Makefile,Gnu Make,我使用Makefile和gnumake根据源标记文件创建各种文档输出目标 这包括使用latex或pdflatex创建DVI文件。使用EPS或PS格式以外的图像会导致错误 我可以在源标记文件中搜索和替换图像名称,并且已经这样做了 我要做的是为images/子目录中的所有图像文件创建一个makefile规则,并运行convert创建这些文件的eps版本 因此: 保留,但创建了其他版本: images/myimage1.eps images/myimage2.eps (是的,我必须保持跟踪,否则其他
latex
或pdflatex
创建DVI文件。使用EPS或PS格式以外的图像会导致错误
我可以在源标记文件中搜索和替换图像名称,并且已经这样做了
我要做的是为images/
子目录中的所有图像文件创建一个makefile规则,并运行convert
创建这些文件的eps版本
因此:
保留,但创建了其他版本:
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 $< $@
试着这样做:
SRC_DIR=images
SRC_FILES1 = $(wildcard $(SRC_DIR)/*.png)
SRC_FILES2 = $(wildcard $(SRC_DIR)/*.jpeg)
DEST_FILES1 = $(patsubst $(SRC_DIR)/%.png,$(SRC_DIR)/%.eps,$(SRC_FILES1))
DEST_FILES2 = $(patsubst $(SRC_DIR)/%.jpeg,$(SRC_DIR)/%.eps,$(SRC_FILES2))
all: $(DEST_FILES1) $(DEST_FILES2)
@echo "Done"
$(SRC_DIR)/%.eps : $(SRC_DIR)/%.png
convert -format eps $< $@
$(SRC_DIR)/%.eps : $(SRC_DIR)/%.jpeg
convert -format eps $< $@
然后,构建一个包含所有图像的变量(假设这里只有图像,这是请求的):
然后我们需要构建包含所有输入文件的相应目标变量,但扩展名为.eps。我们不能直接使用patsubst
,因为它不能进行多重扩展。所以我们需要一个技巧:用img1\u gif
替换img1.gif
,然后添加.eps扩展名。这分两个步骤完成:
首先,将输入文件中的
替换为\
:
DEST1 = $(subst .,_,$(SRC_FILES))
其次,添加.eps扩展名(假设输出文件夹是out
):
好了,现在我们完成了:
all: $(DEST2)
@echo "Done"
嗯,不完全是。最后一个技巧是:使用foreach
函数从EXT
变量自动生成所有需要的配方:
$(foreach \
prereq, \
$(EXT), \
$(eval out/%_$(prereq).eps: $(SRC_DIR)/%.$(prereq); convert -format eps $$< $$@) \
)
$(foreach)\
预请求\
$(分机)\
$(eval out/%\u$(prereq).eps:$(SRC\u DIR)/%.$(prereq);转换-格式eps$$<$@)\
)
这将在
prereq
中实例化EXT
中的所有值,并调用eval
函数来生成配方。好的,因此需要一些通配符匹配和模式规则。但是在继续之前,你能给我们看看你已经有的代码吗?@kebs:这里没有与这个问题相关的代码。我有一个Makefile,它可以生成我想要的大部分输出,尽管DVI生成器由于使用JPG和PNG文件而失败。目录结构是带有标记文件的docs
,以及images/
子目录。我现在在shell中运行Imagemagick代码,如图所示。若要检查变量,请添加一个规则(例如,print:
),该规则没有依赖项,并且具有@echo$(SRC\u GIF)@echo$(EPS\U GIF)
作为配方。那么,OOS的好位置是什么呢?子目录“图像/每股收益”?或者一个并行目录,比如images/和eps/?名称冲突问题的替代方法是重命名包含源扩展名的文件,因此:myimage1.png=>myimage1.png.eps。笨拙但更安全。我正在处理这个问题,并进行一些扩展。事实证明,大约有193种可能的图像文件转换,因此,合理化这些转换可能是有意义的(基于identification-list格式
)。现在我有12种格式(bmp、dot、gif、jpg、jpeg、png、raw、tiff、xcf、pnm、ppm、ps),这些格式足够了。另外,如果我要用我得到的makefile更新我的问题,那么这些部分的标准实践是什么?什么是好的OOS位置代码>当然是第二种选择,将输出文件夹作为源文件的子文件夹是一种不好的方法。非常感谢。事实证明,这确实是有效解决方案的基础。
EXT=gif png jpg jpeg
SRC_FILES = $(wildcard $(SRC_DIR)/*)
DEST1 = $(subst .,_,$(SRC_FILES))
DEST2 = $(patsubst $(SRC_DIR)/%,out/%.eps,$(DEST1))
all: $(DEST2)
@echo "Done"
$(foreach \
prereq, \
$(EXT), \
$(eval out/%_$(prereq).eps: $(SRC_DIR)/%.$(prereq); convert -format eps $$< $$@) \
)