2012-11-06 4 views
11

최근에 eval 함수를 참조하는 GNU make 문서에서 예제 코드를 발견했습니다. 정말 맘에 들지만 컴퓨터에서 테스트 해 보았을 때 (3.81/Debian 만들기), 먼저 C 파일을 컴파일하지 않고 서버를 연결하려고합니다 ... 왜? make 3.81과 호환되지 않습니까?GNU make 3.81 : 평가 기능이 작동하지 않습니까?

쉘 출력 :

$ make 
cc  -o server 
cc: no input files 

코드 :이 테스트 한

define PROGRAM_template 
    ... 
endef 

: 난 당신이 define 줄에서 =를 제거하면 작동 생각

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) 

답변

18

GNUMake 3.81. 에 관해서는이 작동하고 설명서의 버전이 아닙니다. 나는 잘 모릅니다.

+0

감사합니다. 왜 그들이 잘못 문서화하는지 이상합니다. – user1344105

+14

문제는'='가 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

+0

설명에 큰 감사드립니다! – user1344105

관련 문제