2015-07-21 48 views
0

我有以下目录结构:如何使用带有通配符的makefile在所有子目录中生成文件?

superfolder 
    makefile 
    subfolder1 
     file.tex 
    subfolder2 
     file.tex 
    ... 
    subfolderN 
     file.tex 

这是我目前superfolder/makefile

file.pdf : file.tex 
    pdftex file.tex 

如果我当前的工作目录,例如,superfolder/subfolder1我可以用make --file ../makefile创建superfolder/subfolder1/file.pdf

假设我目前的工作目录是superfolder。我如何编辑我的生成文件,使make all将在每个子文件夹中创建file.pdf
(即创建subfolder1/file.pdfsubfolder2/file.pdf,...,subfolderN/file.pdf
如果它使事情变得更容易,你可以假设每个子文件夹包含总是file.tex

+0

端起来只需使用bash命令: 所有: \t求S,则可以通过更换第一线。 -maxdepth 1 -mindepth 1 -type d -exec sh -c'cd“$$ 0”&& make --file ../makefile'{} \; –

回答

2

试试这个:

OUTPUTS := subfolder1/file.pdf 
OUTPUTS += subfolder2/file.pdf 
OUTPUTS += ... 
OUTPUTS += subfolderN/file.pdf 

all: $(OUTPUTS) 

$(OUTPUTS): %.pdf: %.tex 
    (cd $(dir $<) && pdftex $(notdir $<)) 

.PHONY: all 

这样,您就可以管理文件将被make建成。而且,因为它使用真实文件目标(而不是假目标),所以make将只重建所需的文件。

因此,您应该可以在superfolder目录中执行make(或make all)来构建所有文件。如果你只需要一个file建设,做到这一点:

make subfolderN/file 

如果你是在一个subfolder目录,你可以重建所需的文件是这样的:

make --file ../Makefile 

或者重建文件在你的目录:

make --file ../Makefile $(basename $(pwd))/file 

编辑:要自动化进程列表的程序

OUTPUTS := $(patsubst %.tex,%.pdf,$(wildcard */file.tex)) 
+0

谢谢你的回答。我最好寻找一种既能重建所需文件又不会强迫我手动将每个目标添加到生成文件的方法。我应该在上面说过,'superfolder'目录中的子文件夹数量会随着时间的推移而增加。如果没有人回复更一般/自动的解决方案,我会接受这个答案。 –

+0

@Wk_of_Angmar查看我对自动化解决方案的评论。我首先相信你想手动管理每个文件来建立 – jml

+0

太棒了!现在必须修复空格的文件夹。例如'superfolder/sub folder' –

相关问题