All*_*lan 16 makefile gnu-make
我有一个包含一组布尔值的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
Run Code Online (Sandbox Code Playgroud)
现在假设BOOL_A == y,BOOL_B == n和BOOL_C == y,我需要运行以下命令:
./app --with=A,C --with-out=B
Run Code Online (Sandbox Code Playgroud)
如何使用Gnu Make生成这些字符串?
eri*_*ous 18
首先,使用您的方法或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)