首页 文章

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

提问于
浏览
12

我有一个带有一组布尔值的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 回答

  • 0

    或者只是使用 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')
    
  • 13

    一个像 . 的结构

    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中完成 .

  • 0

    首先,使用您的方法或thiton创建两个以空格分隔的列表 . 然后你使用section 6.2 of the GNU make manual末尾的小技巧来创建一个包含单个空格的变量,一个用逗号保存 . 然后,您可以在 $(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)
    

相关问题