【问题标题】:Makefile pattern rule for no extension?没有扩展名的Makefile模式规则?
【发布时间】:2013-03-21 01:32:18
【问题描述】:

我有一堆使用相同类型的 make 规则构建的应用程序:

apps = foo bar baz

all: $(apps)

foo: foo.o $(objects)
    $(link)

bar: bar.o $(objects)
    $(link)

baz: baz.o $(objects)
    $(link)

如果他们有扩展名(例如 .x),我可以制定如下模式规则:

%.x: %.o $(objects)
    $(link)

而且我不必为每个应用编写新规则。

但他们没有扩展,我很确定:

%: %.o $(objects)
    $(link)

不会起作用(因为它指定要构建 any 文件,您可以使用此规则)。

是否可以指定一条规则来涵盖所有$(apps) 构建规则?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这看起来像是 static pattern rule 的工作:

    $(apps) : % : %.o $(objects)
        $(link)
    

    【讨论】:

      【解决方案2】:
      %: %.o $(objects)
          $(link)
      

      以上应该可以工作。

      您可以通过将其转换为static pattern rule 来限制规则的范围,以便仅将其用于您的目标列表:

      $(apps) : % : %.o $(objects) # only consider this for $(apps) targets
          $(link)
      

      【讨论】:

        【解决方案3】:

        不是您正在寻找的答案,而是可以解释为什么这种级别的通用代码可能不会产生良好结果的原因。 ....

        静态模式依赖于词干的存在来匹配和构建依赖链。 与隐式规则几乎相同(用于没有任何接收者的目标。)

        我明白你想要达到的目标,制定一个通用规则,以满足代码中对象和链接的所有目标检查。

        类似这样的东西 ::

         % : % : $(rule1)
                 echo / generic code ;
        

        以便在不同场景中为所有应用调用它

        因为您不想添加扩展名(这成为某些问题的根源) 这样做的问题是目标也会反映在依赖中,因为无法区分依赖和目标。

        因此,如果您确实尝试过,我认为您会到达这里...

         $ make -nf mk.t
           mk.t:18: *** mixed implicit and static pattern rules.  Stop.
        

        :) ,我明天再试一次,看看我是否能以真正通用的方式让它工作。不过问题很好。

        【讨论】:

        • 我不确定我是否理解,你是说Beta的答案不正确?
        • 不,我没这么说! ,发布的两个答案在理论上都是正确的 - 事实上我正在尝试同样的事情。为这些场景制作静态模式规则是显而易见的选择......但试图让它们过于通用是行不通的。我刚刚发布了我的观察结果,这对我来说似乎是合乎逻辑的,只是为了让你知道。
        猜你喜欢
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多