Linux gnu makefile值转换为变量,但仅当它尚未包含它时

Linux gnu makefile值转换为变量,但仅当它尚未包含它时,linux,makefile,gnu,Linux,Makefile,Gnu,因此,根据我想附加到变量的某些标准,假设: LIST+=BOB 但我可能想在不止一个地方添加BOB,因此让我们看一下下面的代码片段: LIST += BOB LIST += FRED LIST += TED LIST += BOB 我想以包含BOB FRED TED的列表结束,这样我就不需要重复的额外BOB了。我还想保留订单(否则我想我可以使用sort) 有没有一个聪明的方法可以做到这一点我想我可以先搜索变量中的文本,但它似乎很冗长。那么是否存在“如果尚未存在则追加”类型的函数?如果只展开列表

因此,根据我想附加到变量的某些标准,假设:

LIST+=BOB

但我可能想在不止一个地方添加BOB,因此让我们看一下下面的代码片段:

LIST += BOB
LIST += FRED
LIST += TED
LIST += BOB
我想以包含
BOB FRED TED
的列表结束,这样我就不需要重复的额外BOB了。我还想保留订单(否则我想我可以使用
sort


有没有一个聪明的方法可以做到这一点我想我可以先搜索变量中的文本,但它似乎很冗长。那么是否存在“如果尚未存在则追加”类型的函数?

如果只展开
列表(
列表:=
),您可以只
列表+=$(过滤掉$(列表),BOB)


注意:如果一个变量被声明为简单展开,它将保持这种状态,除非您更改它,例如使用
LIST=…

如果
LIST
被简单展开(
LIST:=
),您可以只
LIST+=$(过滤掉$(LIST),BOB)
…@RenaudPacalet,这应该可以工作,只有makefile不允许我递归引用变量LIST@RenaudPacalet坚持你刚刚更新了你的评论。。。让我试试,因为它只适用于简单扩展的变量。看看我的答案。@RenaudPacalet啊,太酷了-我误解了
:=
。使用
:=
展开后,它(变量)在其生命周期内保持简单的展开状态,这是真的吗?。。。这是一个很好的技巧:)谢谢你,希望你不介意,我只是在底部的答案中添加了最后的一点评论作为注释。没问题,用注释可能会更好。
$ cat Makefile
LIST :=
LIST += $(filter-out $(LIST),BOB)
LIST += $(filter-out $(LIST),FRED)
LIST += $(filter-out $(LIST),TED)
LIST += $(filter-out $(LIST),BOB)

all:
    $(info $(LIST))
$ make
 BOB FRED TED 
make: 'all' is up to date.