我遇到了制作多个目标的问题,并希望避免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
谢谢!
答案 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
函数可能很难理解,所以我建议人们避免它,除非他们真的需要它。