11
我最近從GNU make文檔中找到了一段代碼,它引用了eval函數。我真的很喜歡它,但是當我試圖在我的機器上測試它(製作3.81/Debian)時,它所做的只是試圖鏈接服務器而不先編譯c文件...爲什麼?是不是兼容?GNU make 3.81:eval函數不工作?
殼牌輸出:
$ make
cc -o server
cc: no input files
代碼:
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)
謝謝,這工作。奇怪他們爲什麼錯誤地記錄它。 – user1344105
問題在於'='是GNU make 3.82中添加的一個特性,GNU make手冊(包括gnu.org上的副本,Google會向大多數人發送)不會在功能特定時提供絲毫暗示到3.82。使用http://www.gnu.org/software/make/manual/html_node/Reading比較http://developer.apple.com/library/mac/#documentation/developertools/gnumake/make_3.html#SEC22(3.81) -Makefiles.html#Reading-Makefiles(3.82) – reinierpost
非常感謝您的解釋! – user1344105