0

我面临制作多个目标的问题,并希望避免 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

谢谢!

4

2 回答 2

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 行的循环,然后再编写一个循环来生成最终规则中的一长串目标,但最好先看看如何定义这些变量。有一种方法可以将所有这些都简化为一个单一的模式规则。

于 2013-04-28T16:45:11.060 回答
1

我同意贝塔。此外,无论如何,您必须在某个地方定义所有这些 make 变量:为什么不直接创建先决条件列表呢?但是,如果你真的想这样做,你可以$(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功能可能难以理解,因此我建议人们避免使用它,除非他们真的需要它。

于 2013-04-28T16:54:49.513 回答