【发布时间】:2011-12-18 09:00:00
【问题描述】:
我为生成一个简单的网页创建了一个生成文件。 makefile 背后的想法是这样的:
- 我们正在编译一个网页 index.html
- index.html 需要必须编译的手写笔 css
main.sty - 页面中使用了许多示例
- 例如
one的代码位于lib/examples/one - 每个示例包含三个部分
- 标记(
.jade模板文件) - 一些代码(
.coffee脚本文件) - 描述(
.md降价文件)
- 标记(
- 例如
- 构建脚本必须将每个示例呈现为单个 html 文件
- Jade、Pygments、Markdown 用于生成三个html文件
-
example.jade模板用于将这些组合到一个示例文件中-
example.jade必须复制到正确的构建示例目录,因为模板语言只能进行相对导入。所以为了导入example/one/code.html,我们必须将模板复制到example/one,并让它包含code.html。
-
- 完成后,每个示例
x将编译为tbuild/examples/x.html
-
lib/index.jade模板已移至build(以便它可以包含示例文件) - 然后使用Jade将
index.jade模板编译成html
这有点简化,但这样更容易理解。简化之处在于每个示例中实际上都有 两个 标记文件(left.html 和 right.html),并且代码文件都通过 pygments 运行 和 用作一个脚本,所以 code.html 和 code.coffee 都需要把它变成 build。
现在,makefile 看起来像这样:
LIB = lib
BUILD = build
LIBEX = $(LIB)/examples
BUILDEX = $(BUILD)/examples
EXAMPLES = $(addsuffix .html,$(addprefix $(BUILDEX)/,$(shell ls $(LIBEX) | grep -v '.jade')))
all: $(BUILD)/main.css index.html
index.html: $(BUILD)/index.jade $(EXAMPLES)
jade < $< --path $< > $@
$(BUILD)/index.jade: $(LIB)/index.jade
mkdir -p $(@D)
cp $< $@
$(BUILD)/main.css: $(LIB)/main.sty
mkdir -p $(@D)
stylus -u nib < $< > $@
$(BUILDEX)/%.html: $(BUILDEX)/%/template.jade $(BUILDEX)/%/left.html $(BUILDEX)/%/right.html $(BUILDEX)/%/code.html $(BUILDEX)/%/code.coffee $(BUILDEX)/%/text.html
jade < $< --path $< > $@
$(BUILDEX)/%/template.jade: $(LIBEX)/template.jade
mkdir -p $(@D)
cp $< $@
$(BUILDEX)/%/left.html: $(LIBEX)/%/left.jade
jade < $< --path $< > $@
$(BUILDEX)/%/right.html: $(LIBEX)/%/right.jade
jade < $< --path $< > $@
$(BUILDEX)/%/code.html: $(LIBEX)/%/code.coffee
pygmentize -f html -o $@ $<
$(BUILDEX)/%/code.coffee: $(LIBEX)/%/code.coffee
mkdir -p $(@D)
cp $< $@
$(BUILDEX)/%/text.html: $(LIBEX)/%/text.md
markdown < $< > $@
clean:
rm index.html -f
rm $(BUILD) -rf
这可行,但问题是当我触摸“lib/examples/intro/code.coffee”并重新运行 make 时,我得到以下信息:
mkdir -p build/examples/intro
cp lib/examples/template.jade build/examples/intro/template.jade
jade < lib/examples/intro/left.jade --path lib/examples/intro/left.jade > build/examples/intro/left.html
jade < lib/examples/intro/right.jade --path lib/examples/intro/right.jade > build/examples/intro/right.html
pygmentize -f html -o build/examples/intro/code.html lib/examples/intro/code.coffee
mkdir -p build/examples/intro
cp lib/examples/intro/code.coffee build/examples/intro/code.coffee
markdown < lib/examples/intro/text.md > build/examples/intro/text.html
jade < build/examples/intro/template.jade --path build/examples/intro/template.jade > build/examples/intro.html
jade < build/index.jade --path build/index.jade > index.html
rm build/examples/intro/right.html build/examples/intro/code.coffee build/examples/intro/code.html build/examples/intro/left.html build/examples/intro/text.html build/examples/intro/template.jade
您会注意到,这远远超出了重新生成示例所需的工作量。我希望的是更像这样的东西:
mkdir -p build/examples/intro
pygmentize -f html -o build/examples/intro/code.html lib/examples/intro/code.coffee
cp lib/examples/intro/code.coffee build/examples/intro/code.coffee
jade < build/examples/intro/template.jade --path build/examples/intro/template.jade > build/examples/intro.html
jade < build/index.jade --path build/index.jade > index.html
换句话说,我要问的是:
- 当我更改一些小的东西时,我需要做什么才能使 makefile 不会重建太多?
- 在上面的示例中,当我触摸 code.coffee 时,left.html、right.html 和 text.html 都会重新构建。我该如何防止这种情况发生?
- 为什么 make 将 rm 命令放在输出的末尾?这似乎可能会导致一些不必要的重建。
感谢您一直阅读这个问题!我知道我的 make-fu 不足,所以任何关于如何清理 makefile 和减少冗余的提示都非常受欢迎!
【问题讨论】: