как понять установку переменных в нижеприведенном make-файле - PullRequest
0 голосов
/ 26 марта 2020
OS := $(shell uname)

ifeq ($(OS),Linux)
   ext = o
   cmd = build.sh
else
   ext = exe
   cmd = build.bat
endif

serverNM := server.$(ext)
clientNM := client.$(ext)
programs := $(serverNM) $(clientNM)

$(serverNM) libs = priv protocol $(wildcard *.conf)
$(serverNM) objs = server impl.$(ext) server access.$(ext)
$(clientNM) objs = client impl.$(ext) client api.$(ext)
$(clientNM) libs = protocol

all: $(programs)

define ProgramTmp =
$(1): $$($(1) objs) $$($(1) libs)
endef

$(foreach prog,$(programs),$(eval $(call ProgramTmp,$(prog))))

$(programs):
    $(cmd) $@ $^

%.conf : %.$(ext)
    genConf $^ -o $@

ifeq ($(OS),Linux)
   demo.o : demo.c linux.conf 
        install $^ -o $@
else
   demo.exe : demo.c win.conf
        install.bat $^ -o $@
endef

как понять "$ (serverNM) libs = priv protocol $ (wildcard * .conf)", почему до libs еще есть переменная $ (serverNM)? это значит установить их вместе?

1 Ответ

0 голосов
/ 26 марта 2020

В более старых версиях GNU сделайте настройку, подобную этой:

ext = o

serverNM := server.$(ext)

$(serverNM) libs = priv protocol $(wildcard *.conf)

установит переменную make server.o libs (да, имя переменной содержит пробел), а затем ссылку, подобную этой:

$(server.o libs)

расширяется до значения этой переменной.

В более новых версиях GNU make этот make-файл содержит синтаксические ошибки, поскольку имена переменных, содержащие пробелы, были объявлены недопустимыми в GNU make 3.82 (выпущено в июле 2010).

...