我为生成一个简单的网页创建了一个 makefile。makefile 背后的想法是这样的:
main.sty必须编译的手写笔 cssone位于lib/examples/one.jade模板文件).coffee脚本文件).md降价文件)example.jade模板用于这些组合成一个示例文件
example.jade必须复制到正确的构建示例目录,因为模板语言只能做相对导入。因此,为了导入example/one/code.html,我们必须将模板复制到example/one并包含它code.html。x都将编译为tbuild/examples/x.htmllib/index.jade模板被移动到build(以便它可以包括示例文件)index.jade模板编译为 html这有点简化,但这样更容易理解。简化是每个例子中实际上有两个标记文件(left.html和right.html),并且代码文件都是通过pygments运行并作为脚本使用的,所以code.html和code.coffee都需要使其成为构建。
现在,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
Run Code Online (Sandbox Code Playgroud)
这有效,但问题是当我触摸“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
Run Code Online (Sandbox Code Playgroud)
您会注意到,这比重新生成示例所需的工作要多得多。我希望的是更像这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
换句话说,我要问的是:
感谢您一直阅读这个问题的野兽!我知道缺少我的 make-fu,因此非常欢迎有关如何清理 makefile 和减少冗余的任何提示!
这个构建系统太大且太复杂,无法轻松重现——我讨厌发布我没有测试过的解决方案——但尝试添加以下行:
.SECONDARY:
Run Code Online (Sandbox Code Playgroud)
编辑:
我无法重现您描述的行为,但我可以提供一些建议。
这.SECONDARY:是一个规则;它可以放在 makefile 中的任何位置。基本上,如果 Make 检测到一系列隐式规则链,A->B->C,其中 A 是一个存在的文件,C 是目标,它会将 B 视为中间文件,并在工作完成后将其删除。该.SECONDARY:规则阻止删除。
您可以组合具有相同命令的规则。这个:
foo: bar
do something $< $@
baz: quartz
do something $< $@
quince: geef
do something $< $@
Run Code Online (Sandbox Code Playgroud)
可以改写为:
foo: bar
baz: quartz
quince: geef
foo baz quince:
do something $< $@
Run Code Online (Sandbox Code Playgroud)
这将消除您的 makefile 中的大量冗余,并且可能使事情更清晰。
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |