2012-11-06 12 views
11

Kürzlich habe ich dieses Beispielcode aus der GNU make-Dokumentation gefunden, die sich auf die eval-Funktion bezieht. Ich mag es wirklich, aber als ich versuchte, es auf meinem Rechner zu testen (make 3.81/Debian), versucht es nur, den Server zu verbinden, ohne zuerst die c-Dateien zu kompilieren ... warum? Ist make 3.81 nicht kompatibel?GNU make 3.81: Eval-Funktion funktioniert nicht?

Shell Ausgabe:

$ make 
cc  -o server 
cc: no input files 

Code:

PROGRAMS = server client 

server_OBJS = server.o server_priv.o server_access.o 
server_LIBS = priv protocol 

client_OBJS = client.o client_api.o client_mem.o 
client_LIBS = protocol 

# Everything after this is generic 

.PHONY: all 
all: $(PROGRAMS) 

define PROGRAM_template = 
    $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) 
    ALL_OBJS += $$($(1)_OBJS) 
endef 

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog)))) 

$(PROGRAMS): 
     $(LINK.o) $^ $(LDLIBS) -o [email protected] 

clean: 
     rm -f $(ALL_OBJS) $(PROGRAMS) 

Antwort

18

ich denke, es wird funktionieren, wenn Sie die = aus der define Linie entfernen:

define PROGRAM_template 
    ... 
endef 

ich das getestet habe mit GNUMake 3.81. Wie für warum dies funktioniert und die Version in der Bedienungsanleitung nicht, habe ich keine Ahnung.

+0

Danke, das hat funktioniert. Seltsam, warum sie es falsch dokumentieren. – user1344105

+14

Das Problem ist, dass das '=' ein Feature in GNU make 3.82 ist und das GNU make manual (einschließlich der Kopie auf gnu.org, wohin Google die meisten Leute schickt) gibt nicht den geringsten Hinweis, wenn ein Feature spezifisch ist bis 3.82. Vergleichen Sie http://developer.apple.com/library/mac/#documentation/developertools/gnumake/make_3.html#SEC22 (3.81) mit http://www.gnu.org/software/make/manual/html_node/Reading -Makefiles.html # Reading-Makefiles (3.82) – reinierpost

+0

Vielen Dank für die Erklärung! – user1344105