GNU make 3.81: функция eval не работает?

Недавно я нашел этот фрагмент кода примера из документации GNU, которая ссылается на функцию eval. Мне это очень нравится, но когда я попытался проверить его на своей машине (сделайте 3.81/Debian), все, что он делает, пытается связать сервер без компиляции файлов c сначала... почему? Является ли make 3,81 несовместимым?

Выход оболочки:

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

Ответ 1

Я думаю, что он будет работать, если вы удалите = из строки define:

define PROGRAM_template
  ...
endef

Я тестировал это с помощью GNUMake 3.81. Что касается того, почему это работает, а версия в руководстве отсутствует, я понятия не имею.