我一直在使用一个使用二级扩展的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的文档 - 我无法在任何地方找到它。答案 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