代码之家  ›  专栏  ›  技术社区  ›  Dan Moulding

空目标规则是否可以替代GNU Make中的默认目标?

  •  2
  • Dan Moulding  · 技术社区  · 17 年前

    考虑:

    bar: a b c
            ${MAKE_BAR_COMMANDS}
    
    foo: x y z
            ${MAKE_FOO_COMMANDS}
    

    使用上面假设的Makefile,运行 make

    .DEFAULT_GOAL := foo    # Build foo by default, even if it's not first.
    
    bar: a b c
            ${MAKE_BAR_COMMANDS}
    
    foo: x y z
            ${MAKE_FOO_COMMANDS}
    

    ... 然后Make(版本3.81)将构建“foo”,如果我们只运行 制作 .

    我发现这个.DEFAULT\u目标变量在我构建的模块化、可重用的Makefile“框架”中非常有用。然而,我发现许多系统仍然有GNU Make 3.80或更高版本,并且它们不支持这个变量。

    在玩游戏时,我注意到简单地指定一个空的目标规则似乎与.DEFAULT_GOAL具有相同的效果,即使在GNU Make的3.81之前版本上也是如此:

    foo:    # Empty target rule
    
    bar: a b c
            ${MAKE_BAR_COMMANDS}
    
    foo: x y z
            ${MAKE_FOO_COMMANDS}
    

    我想我在想为什么。如果你能用一个简单的空目标规则实现同样的目标,那么默认的目标就被引入了。这让我怀疑他们可能不会导致 确切地 同样的行为。

    所以底线问题是:使用.DEFAULT_目标和空目标规则之间是否存在外部可检测的差异?

    2 回复  |  直到 17 年前
        1
  •  2
  •   Michiel Buddingh    17 年前

    我不能给你一个明确的答案,但我可以为它的引入提出其他理由:

    1. .DEFAULT_GOAL 做i、 e.标签上的内容。单行空目标的存在和意义很容易被掩盖,尤其是在较大的Makefile中
    2. 您实际上可以读取 $(.DEFAULT_GOAL)
        2
  •  2
  •   mmaruska    14 年前

    您的“foo:#空目标规则”与双冒号规则冲突。

    如果排除这些(::规则),则仅当它是第一条规则时才有效。因此,如果您在开始时“include clear variables.mk”,并且通常有一个包含文件的复杂网络, 这个“.DEFAULT_目标”将使它变得显而易见& 选中的