Makefile:使用循环定义和规则避免代码重复 - 是否可能?

时间:2013-04-28 15:44:24

标签: makefile

我遇到了制作多个目标的问题,并希望避免Makefile中的代码重复。

我有很多这些:

$(TARGET1): $(OFILES1)
    $(LD) $(LDFLAGS) $(OFILES1) -o $(TARGET1)
...
$(TARGET50): $(OFILES50)
    $(LD) $(LDFLAGS) $(OFILES50) -o $(TARGET50)

1)如何在循环中编写它,是否可能?

2)它适用于定义吗? :

i=1 ; while [[ $$i -le $(MAX_TARGETS) ]] ; do \
    -include $(OFILES$(i):.o=.d); \
    ((i = i + 1)) ; \
done

谢谢!

2 个答案:

答案 0 :(得分:3)

让我们从你拥有的东西开始:

$(TARGET1): $(OFILES1)
    $(LD) $(LDFLAGS) $(OFILES1) -o $(TARGET1)
$(TARGET2): $(OFILES2)
    $(LD) $(LDFLAGS) $(OFILES2) -o $(TARGET2)
...
$(TARGET50): $(OFILES50)
    $(LD) $(LDFLAGS) $(OFILES50) -o $(TARGET50)

然后使用一些自动变量来减少冗余:

$(TARGET1): $(OFILES1)
    $(LD) $(LDFLAGS) $^ -o $@
$(TARGET2): $(OFILES2)
    $(LD) $(LDFLAGS) $^ -o $@
...
$(TARGET50): $(OFILES50)
    $(LD) $(LDFLAGS) $^ -o $@

然后重新安排一些事情:

$(TARGET1): $(OFILES1)
$(TARGET2): $(OFILES2)
...
$(TARGET50): $(OFILES50)
$(TARGET3) $(TARGET2) ... $(TARGET50):
    $(LD) $(LDFLAGS) $^ -o $@

此时你可以编写一个等于前50行的循环,另一个循环在最终规则中生成一长串目标,但看起来可能是个好主意首先介绍如何定义这些变量。有可能将所有这些减少为单一模式规则。

答案 1 :(得分:1)

我同意Beta。此外,在某处您必须定义所有这些变量,无论如何:为什么不创建先决条件列表呢?但是,如果您真的想这样做,可以使用$(eval ...),如下所示:

define PREREQ
$(TARGET$I) : $(OFILES$I)
ALLTARGETS += $(TARGET$I)
endef

ALLTARGETS :=
INDEXES := $(shell seq 1 50)

$(foreach I,$(INDEXES),$(eval $(PREREQ)))

$(ALLTARGETS) :
        $(LD) $(LDFLAGS) -o $@ $^

eval函数可能很难理解,所以我建议人们避免它,除非他们真的需要它。