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

Let's start with what you have:

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

Then use some automatic variables to reduce the redundancy:

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

Then rearrange things a little:

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

At this point you could write a loop that would be equivalent to the first fifty lines, and another to generate the long list of targets in the final rule, but it's probably a good idea to look first at how you define these variables. Chances are there's a way to reduce all of this into a single pattern rule.

于 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 に答える