12

私は最近、eval 関数を参照する GNU make ドキュメントからこのサンプル コードを見つけました。とても気に入っていますが、自分のマシン (make 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 $@

 clean:
         rm -f $(ALL_OBJS) $(PROGRAMS)
4

1 に答える 1

19

=行からを削除するとうまくいくと思いますdefine

define PROGRAM_template
  ...
endef

これを GNUMake 3.81 でテストしました。これが機能し、マニュアルのバージョンが機能しない理由については、私にはわかりません。

于 2012-11-07T04:41:42.957 に答える