2012-11-06 21 views
11

Gần đây tôi đã tìm thấy đoạn mã ví dụ này từ GNU làm tài liệu đề cập đến hàm eval. Tôi thực sự thích nó, nhưng khi tôi thử kiểm tra nó trên máy tính của tôi (tạo 3,81/Debian), tất cả những gì nó làm là cố gắng liên kết máy chủ mà không cần biên dịch các tệp c trước ... tại sao? Làm cho 3.81 không tương thích?GNU tạo 3,81: hàm eval không hoạt động?

Shell đầu ra:

$ 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) 

Trả lời

18

Tôi nghĩ rằng nó sẽ làm việc nếu bạn loại bỏ các = từ define dòng:

define PROGRAM_template 
    ... 
endef 

Tôi đã thử nghiệm này với GNUMake 3.81. Đối với lý do tại sao hoạt động và phiên bản trong sách hướng dẫn không, tôi không có ý tưởng.

+0

Cảm ơn, điều này đã hiệu quả. Lạ lùng tại sao họ ghi lại nó sai. – user1344105

+14

Vấn đề là '=' là một tính năng được thêm vào trong GNU tạo 3.82 và GNU làm thủ công (bao gồm cả bản sao trên gnu.org, nơi Google sẽ gửi hầu hết mọi người) không đưa ra gợi ý nhỏ nhất khi một tính năng cụ thể đến 3,82. So sánh http://developer.apple.com/library/mac/#documentation/developertools/gnumake/make_3.html#SEC22 (3.81) với http://www.gnu.org/software/make/manual/html_node/Reading -Makefiles.html # Đọc-Makefiles (3.82) – reinierpost

+0

Cảm ơn bạn đã giải thích! – user1344105

Các vấn đề liên quan