2013-03-23 87 views
3

我有一些latex文件,我希望能够方便地编译它们。我的makefile目前如下。Makefile命令有条件文件存在

targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex)) 
.PHONY: all 

all: $(targets) 

.SECONDEXPANSION: 
%.pdf: %.tex $$(wildcard $$*_inc/*.*) 
    pdflatex $< 

这样,如果一个包含文件夹存在,该文件夹内的所有内容将作为一个依赖治疗。

但是,我也想自动运行依赖python脚本。这可能是创作情节或计算要包含的价值。我试图做出以下修改。

targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex)) 

all: $(targets) 
.PHONY: all run_% 

.SECONDEXPANSION: 
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py)) 
    pdflatex $< 

run_%: % 
    $< 

但是,这不起作用,因为我期望。我有以下文件夹结构。

| 
|-Makefile 
|-paper.tex 
|-paper_inc/ 
|---a.txt 
|---b.py 

我希望它可以运行b.py,然后运行pdflatex paper.tex。但是,b.py未运行。如果我查看创建的依赖项,我看到paper_inc/a.txtpaper_inc/b.pypaper.pdf的依赖关系,但是run_paper_inc/b.py不是。

我不完全确定这是什么问题,因为它觉得它应该工作。另外,我还尝试了以下几条线以及%.pdf规则。

%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(addprefix run_,$$(wildcard $$*_inc/*.py)) 
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | sed 's/^/run/') 
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | awk '{print "prefix "$0}') 

对于每一项规则,不过,我收到错误消息make: *** No rule to make target 'paper.pdf'. Stop.

应该怎样做才能修复这个错误,或者,我应该怎么用的,而不是make

回答

0

你有两个问题。

第一:

run_%: % 
    $< 

the manual

当目标模式不包含斜杠(它通常不会 没有),在文件名的目录名被去掉。从文件名 开始,它与目标前缀和后缀进行比较。 将文件名与目标模式,目录 名称及其结尾的斜杠进行比较后,将添加到从模式规则的先决条件 模式和文件名生成的 必备文件名中。

这是一个有点难以遵循,但基本上时许尝试构建run_paper_inc/b.py,它会查找匹配b.py图案规则。上述规则不适用。但这:

%.py: 
    $(subst run_,,[email protected]) 

二:

.SECONDEXPANSION: 
%.pdf: ... $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py)) 
    ... 

一个制作的一大缺点是它的通配符的弱处理。在这种情况下,%不能同时适用于模式规则和patsubst。但有一种方法:

.SECONDEXPANSION: 
%.pdf: ... $$(addprefix run_,$$(wildcard %_inc/*.py)) 
    ... 
+0

啊,好吧。测试这个解决方案,它解决了部分问题,但不是全部。现在,不同的python文件在'pdflatex'命令之前运行。但是,只要乳胶文件被重新编译,python文件就会重新运行。为了弥补这一点,我尝试了以下改变。 .SECONDEXPANSION %.PDF:... $$(addsuffix运行,$$(通配符%_inc/* PY)。) ... %.pyrun:%的.py $ < 自% .py现在是%.pyrun的一个依赖项,我预计这只会再次运行python程序,python文件本身已经改变,但是它会在每次编译时运行。 – 2013-03-23 17:44:22

+0

@MereInterest:如果你不想在编译乳胶文件时运行python文件,为什么要使它们成为先决条件?当*做*你想让他们跑? – Beta 2013-03-23 19:07:19

+0

希望它在正在编译的latex文件之前运行,但只有在python文件已更改时才会运行。例如,我有一个python脚本来制作一个包含在latex文件中的绘图。如果python脚本已经改变,那么它应该再次运行以重新创建该图,否则应该使用现有的图。 – 2013-03-23 19:32:53