gpt4 book ai didi

makefile - 我需要帮助减少 makefile 中的依赖项

转载 作者:行者123 更新时间:2023-12-05 00:02:30 26 4
gpt4 key购买 nike

我为生成一个简单的网页创建了一个 makefile。 makefile 背后的想法是这样的:

  • 我们正在编译一个网页,index.html
  • index.html 需要手写笔 css main.sty必须编译
  • 页面中使用了许多示例
  • 代码例如one住在lib/examples/one
  • 每个示例包含三个部分
  • 标记(一个 .jade 模板文件)
  • 一些代码(一个 .coffee 脚本文件)
  • 描述(.md Markdown 文件)
  • 构建脚本必须将每个示例呈现为单个 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都需要使其成为构建。

    现在,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 不会重建太多?
  • 在上面的例子中,left.html、right.html和text.html都是在我触摸code.coffee时重建的。我怎样才能防止这种情况?
  • 为什么 make 将 rm 命令放在输出的末尾?这似乎可能会导致一些不必要的重建。

  • 感谢您一直阅读这个问题的野兽!我知道缺少我的 make-fu,因此非常欢迎有关如何清理 makefile 和减少冗余的任何提示!

    最佳答案

    这个构建系统太大且太复杂,无法轻松重现——我讨厌发布我没有测试过的解决方案——但尝试添加以下行:

    .SECONDARY:

    编辑:
    我无法重现您描述的行为,但我可以提供一些建议。
    .SECONDARY:是规则;它可以放在 makefile 中的任何位置。基本上,如果 Make 检测到一系列隐式规则,A->B->C,其中 A 是一个存在的文件,C 是目标,它会将 B 视为中间文件,并在工作完成后将其删除。 .SECONDARY:规则阻止删除。

    您可以组合具有相同命令的规则。这个:
    foo: bar
    do something $< $@

    baz: quartz
    do something $< $@

    quince: geef
    do something $< $@

    可以改写为:
    foo: bar

    baz: quartz

    quince: geef

    foo baz quince:
    do something $< $@

    这将消除您的 makefile 中的大量冗余,并且可能使事情更清晰。

    关于makefile - 我需要帮助减少 makefile 中的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947920/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com