Создание разделенных запятыми списков в GNU Make - PullRequest
16 голосов
/ 23 сентября 2011

У меня есть Makefile с набором логических значений, которые должны использоваться для управления флагами для внешнего приложения.Проблема в том, что флаг должен передаваться в виде строки, разделенной запятыми.

Примерно так (нерабочий псевдокод):

WITH_LIST = ""
WITHOUT_LIST = ""

ifeq ($(BOOL_A),y)
    # Append A to list "WITH_LIST"
else
    # Append A to list "WITHOUT_LIST"
endif

ifeq ($(BOOL_B),y)
    # Append B to list "WITH_LIST"
else
    # Append B to list "WITHOUT_LIST"
endif

ifeq ($(BOOL_C),y)
    # Append C to list "WITH_LIST"
else
    # Append C to list "WITHOUT_LIST"
endif

Теперь предполагается, что BOOL_A == y, BOOL_B== n и BOOL_C == y, мне нужно выполнить следующую команду:

./app --with=A,C --with-out=B

Как я могу сгенерировать эту строку с помощью Gnu Make?

Ответы [ 3 ]

17 голосов
/ 23 сентября 2011

Сначала вы создаете два списка, разделенных пробелами, используя ваш метод или метод Титона.Затем вы используете небольшой трюк из конца раздела 6.2 руководства по сборке GNU , чтобы создать переменную, содержащую один пробел, а одну - запятую.Затем вы можете использовать их в $(subst ...), чтобы изменить два списка на разделенные запятыми.

PARTS  := A B C

BOOL_A := y
BOOL_B := n
BOOL_C := y

WITH_LIST    := $(foreach part, $(PARTS), $(if $(filter y, $(BOOL_$(part))), $(part)))
WITHOUT_LIST := $(filter-out $(WITH_LIST), $(PARTS))

null  :=
space := $(null) #
comma := ,

WITH_LIST    := $(subst $(space),$(comma),$(strip $(WITH_LIST)))
WITHOUT_LIST := $(subst $(space),$(comma),$(strip $(WITHOUT_LIST)))

all:
    ./app --with=$(WITH_LIST) --with-out=$(WITHOUT_LIST)
0 голосов
/ 23 сентября 2011

Или просто используйте sed: безобразно (и не проверено), но просто

WITH_LIST = $(shell echo A$(BOOL_A) B$(BOOL_B) C$(BOOL_C) | sed -e 's/[ABC][^yABC]*//g' -e 's/y//g' -e 's/ /,/g')
WITHOUT_LIST = $(shell echo A$(BOOL_A) B$(BOOL_B) C$(BOOL_C) | sed -e 's/[ABC]y[^ABC]*//g' -e 's/[^ABC ]//g' -e 's/ /,/g')
0 голосов
/ 23 сентября 2011

Конструкция, подобная

OPTIONS+=$(if $(filter y,$(BOOL_A)),--with=A,--with-out=A)

, должна работать.

Редактировать: Извините, упустил из виду необходимое сопоставление.

PARTS=A B C
YESSES=$(foreach i,$(PARTS),$(if $(filter y,$(BOOL_$(i))),$(i)))

all:
        echo with=$(shell echo $(YESSES) | tr ' ' ',')

Идея состоит в том, чтобы проверять каждое возможноечасть X, установлено ли оно на да, и вставьте его в список, если да.Этот список разделен пробелами и его трудно разделить запятыми с помощью make, но это легко сделать в оболочке.

...