2016-10-31 4 views
0

Im folgenden Beispiel Makefile:Makefile: berechnete Variablenname

EXTENS := .c .C .cc .c++ .cpp .cxx 
SOURCES := 1.c 2.C 3.cc 4.c++ 5.cpp 6.cxx 
OBJECTS := $(SOURCES) 

REPLACE_EXTENS = $(foreach f,$(EXTENS),$(eval $(1) := $(patsubst %$(f),%.o,$($(1))))) 
$(call REPLACE_EXTENS, OBJECTS) 

all: 
    @echo $(SOURCES) 
    @echo $(OBJECTS) 

Ich erwarte, dass die Linie @echo $(OBJECTS) zur Ausgabe:

1.o 2.o 3.o 4.o 5.o 6.o 

aber es nichts gibt. Was mache ich falsch und was wäre der richtige Weg?

+0

'$ (eval ...)' macht keinen Sinn, hier machen. – reinierpost

+0

'was wäre der richtige Weg, um es zu tun 'Sie sollten wahrscheinlich auf das, was Sie versuchen, damit zu lösen. – user657267

+0

@ user657267, ich dachte, es wäre ziemlich offensichtlich - Liste der Objektdateien aus der Liste der Quelldateien erstellen –

Antwort

1

Ändern Sie $(call REPLACE_EXTENS, OBJECTS) in $(call REPLACE_EXTENS,OBJECTS). Kein Leerzeichen zwischen Argumenten für den Aufruf.

+0

Ich wusste, es war etwas albern ... Danke. –

1

Der richtige Weg, dies zu tun ist, um die EXTENS zu werfen und REPLACE_EXTENS vollständig nennen, und schreibt:

SOURCES := 1.c 2.C 3.cc 4.c++ 5.cpp 6.cxx 
OBJECTS := $(addsuffix .o,$(basename $(SOURCES)) 

all: 
     @echo $(SOURCES) 
     @echo $(OBJECTS) 
+0

Danke. Obwohl es meine Frage nicht beantwortet, ist dies eine sehr gute alternative Lösung. Ich wünschte, ich könnte beide Antworten akzeptieren - kurz gesagt, ich habe Ihre Antwort aufgefrischt. –