在GNU Make中创建逗号分隔列表

20

我有一个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个回答

26

首先,您需要创建两个以空格分隔的列表,可以使用您的方法或thiton的方法进行创建。 然后,您可以使用来自GNU make手册第6.2节末尾的小技巧来创建一个变量,其中保存一个空格和一个逗号。 然后,您可以在$(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)

2
一个类似于如下结构的语句:
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很难用逗号分隔,但在shell中很容易实现。


接受参数的应用程序无法理解:--with=A --with-out=B --with=C,参数必须格式化为这样:--with=A,C --with-out=B。 - Allan
@Allan:抱歉,我没注意到那个。新的解决方案应该包含它。 - thiton

1

或者只需使用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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接