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)
Danke, das hat funktioniert. Seltsam, warum sie es falsch dokumentieren. – user1344105
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
Vielen Dank für die Erklärung! – user1344105