Makefile:操作子目录中的所有文件?

Makefile:操作子目录中的所有文件?,makefile,gnu-make,Makefile,Gnu Make,我使用Makefile和gnumake根据源标记文件创建各种文档输出目标 这包括使用latex或pdflatex创建DVI文件。使用EPS或PS格式以外的图像会导致错误 我可以在源标记文件中搜索和替换图像名称,并且已经这样做了 我要做的是为images/子目录中的所有图像文件创建一个makefile规则,并运行convert创建这些文件的eps版本 因此: 保留,但创建了其他版本: images/myimage1.eps images/myimage2.eps (是的,我必须保持跟踪,否则其他

我使用Makefile和gnumake根据源标记文件创建各种文档输出目标

这包括使用
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 $$< $$@) \
)