替代GNU的makefile中的二次扩展make 3.79.1

时间:2011-02-22 15:08:24

标签: c++ makefile design-patterns

我一直在使用一个使用二级扩展的makefile,不知道此功能仅在 GNU make 的3.81版本之后才存在。不幸的是,这里有一些旧机器只安装了3.79.1,当然,在这些机器上,makefile不起作用。是否有二次扩张的替代方案?

我使用C ++程序的规则如下所示:

.SECONDEXPANSION:

# Pattern rule for linking
%_$(SYSTEM) : $$(%_ofiles) $(EXEC)/%_$(SYSTEM).o
    $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)

# Example for an ofiles variable
prog1_ofiles = $(C1) $(C2)

C1 = $(OFILES)/C1.o

C2 = $(OFILES)/C2.o

我知道 - 最好的解决方案是安装当前的make版本。但我们的系统管理员并不热衷于此;)所以我期待着您的建议。

不过,有谁知道在哪里可以获得GNU make 3.79.1的文档 - 我无法在任何地方找到它。

3 个答案:

答案 0 :(得分:2)

只需在源代码树中添加make-3.81个来源即可。您的主Makefile首先应使用可用的make编译make-3.81,然后使用make-3.81编译其他所有内容。

答案 1 :(得分:1)

功能/宏怎么样?使用eval将获得与二次扩展相同的结果。当然不是那么干净,而是比所有明确的规则更少的打字。

define PROGRAM_template
$(1)_$(SYSTEM) : $$($(1)_ofiles) $(EXEC)/$(1)_$(SYSTEM).o
       $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
endef

$(foreach target, prog1 prog2 prog3, \
    $(eval $(call PROGRAM_template, $(target)))

也许您可以在原始代码中使用eval包装$$(%_ ofiles)并省略foreach。不确定......

答案 2 :(得分:1)

没有$(eval)?,哇!您必须编写一些shell以将特定的make语法发送到file.mk(比如说​​),然后将include发送到Makefile中。您通过告诉Make Makefile依赖于file.mk来引导该过程。首先必须在之前更新Makefile 。因此,它将创建file.mk,包含它,然后重新启动。

对于您的情况,file.mk看起来只包含依赖项而不包含配方。简要说明:

%_${SYSTEM}: ${EXEC}/%_${SYSTEM}.o
    $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)

file.mk:
    echo '%_${SYSTEM}: ${prog1_ofiles}' >$@

Makefile: file.mk

include file.mk