【问题标题】:Make: make all that fit ruleMake:制定所有适合的规则
【发布时间】:2011-08-15 15:42:31
【问题描述】:

我正在尝试学习 makefile。 我有以下 Makefile:

ctx/%.ctx: rst/%.rst
    texlua rst_parser.lua $< $@

pdf: ctx
    mkdir -p pdf
    cd pdf; context ../ctx/main.ctx

ctx: rst
    mkdir -p ctx

.PHONY: clean
clean:
    rm -f pdf/*.log pdf/*.aux pdf/*.pgf pdf/*.top pdf/*.tuc

如您所见,所有三个先决条件都是目录; rstctxpdf。先决条件递归到“rst”。我将手动编辑ctx 中的文件和rst 中的文件,这些文件将转换为ctx 中的文件。

我应该怎么做才能使make 使pdf :) 如下方式:

  1. 查看ctx 中的某些内容和/或rst 中的某些内容是否发生了变化。
  2. 如果仅更改了 ctx 中的某些内容,则为 pdf,否则为 ctx
  3. 如果rst中的某些内容发生了变化,请使用第一条规则在ctx中制作相应的文件,然后制作ctx,然后再制作pdf

我现在的问题是我不知道如何告诉make “为了在rst 中的文件更改时生成ctx,使用第一条规则(ctx/%.ctx: ctx/%.rst)来生成每个匹配的文件在ctx 中来自rst 中对应的一个”

【问题讨论】:

  • 为什么一个普通的make 能读懂我的想法并表现得像make pdf

标签: makefile


【解决方案1】:

您的问题有点不清楚(例如,您将目录 pdf/ 与 makefile 目标 pdf 混淆了),但这应该符合我的想法:

TARGETS := $(wildcard rst/*.rst)
TARGETS := $(patsubst rst/%.rst,%,$(TARGETS))

ctx/%.ctx: rst/%.rst    # I assume you didn't mean ctx/%.rst
  texlua rst_parser.lua $< $@

pdf: ctx
  mkdir -p pdf
  cd pdf; context ../ctx/main.ctx

.PHONY:cxt
ctx: $(patsubst %,ctx/%.ctx, $(TARGETS))
  mkdir -p ctx

而一个普通的make 构建pdf 的原因是,当您在没有目标的情况下调用 Make 时,它​​会选择默认目标,这是第一个目标(除非您进行一些修补),在这种情况下是 @987654326 @。 (模式规则不算在内。)

编辑:
现在我想起来了,我在上面发布的内容有点笨拙,即使没有任何改变,它也会始终运行pdf 规则。这有点好:

# You're right, this is better.        
CTX_TARGETS := $(patsubst rst/%.rst,ctx/%.ctx, $(wildcard rst/*.rst))

pdf: $(CTX_TARGETS)
  mkdir -p pdf
  cd pdf; context ../ctx/main.ctx

$(CTX_TARGETS): ctx/%.ctx: rst/%.rst ctx
  texlua rst_parser.lua $< $@    

ctx:
  mkdir -p ctx

我创建了ctx PHONY,因为我正在处理 目录 存在但 规则 仍应运行的情况。事实证明这是不必要的(正如您可能从我没有发现错字这一事实中猜到的那样)。

是的,先决条件是文件或目录的名称(或PHONY 目标)。我的观点是,如果 pdf 既是目录又是构建它的规则(并执行其他操作),那么像“make pdf”这样的短语会有点令人困惑。

使用目录作为目标的问题是它们不遵守修改时间的直观规则:如果您修改目录中的文件,目录的修改时间不会改变。故意改变mod时间也很棘手,因为touch不这样做(不要问我为什么touch一个目录如果它什么都不做是合法的)。可以做到,例如通过添加和删除一个虚拟文件,但它很丑。

【讨论】:

  • 谢谢,我会尽力了解您的所作所为,然后接受您的回答。 @targets/dirs:但先决条件确实代表同名的文件/目录?
  • 现在我明白了,谢谢!只有一件事:为什么 ctx(这里是错字).PHONY
  • 哦,有什么原因,你为什么不做$(patsubst rst/%.rst,ctx/%.ctx,$(TARGETS))
猜你喜欢
  • 2017-10-13
  • 2016-08-14
  • 2016-12-20
  • 2012-01-28
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多