2012-11-06 16 views
11

Kısa bir süre önce bu örnek kod dosyasını, eval işlevine başvuran GNU make belgelerinden buldum. Gerçekten çok hoşuma gidiyor, ama makinemde test etmeye çalıştığımda (3.81/Debian yap), tüm bunları önce c dosyalarını derlemeden sunucuya bağlamaya çalışıyor ... neden? 3.81 uyumlu değil mi?GNU make 3.81: eval işlevi çalışmıyor mu?

Kabuk çıkışı:

$ make 
cc  -o server 
cc: no input files 

Kodu: Bunu test ettik

define PROGRAM_template 
    ... 
endef 

: Sana define satırından = kaldırırsanız o işe yarayacak

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) 

cevap

18

GNUMake 3.81 ile. için neden bu çalışma ve kılavuzdaki sürümde bulunmuyorsa, hiçbir fikrim yok.

+0

Teşekkürler, bu işe yaradı. Garip neden yanlış bir şekilde belgelediler. – user1344105

+14

Sorun, '=', GNU make 3.82'de eklenmiş bir özellik ve GNU make manual (Google'ın çoğu kişiyi göndereceği gnu.org'daki kopya da dahil olmak üzere), bir özellik belirli olduğunda en ufak bir ipucu vermez 3,82'ye. Http://developer.apple.com/library/mac/#documentation/developertools/gnumake/make_3.html#SEC22 (3.81) http://www.gnu.org/software/make/manual/html_node/Reading ile karşılaştır -Makefiles.html # Okuma-Makefiles (3.82) – reinierpost

+0

Açıklama için büyük teşekkürler! – user1344105