【问题标题】:gnu makefile value to variable, but only if it does not already contain itgnu makefile 值到变量,但前提是它还没有包含它
【发布时间】:2019-01-14 15:05:42
【问题描述】:

所以基于某些标准我想附加到一个变量,让我们说:

LIST += BOB

但是我可能想添加 BOB 的地方可能不止一个,所以让我们使用以下代码 sn-p:

LIST += BOB
LIST += FRED
LIST += TED
LIST += BOB

我想最终得到包含BOB FRED TED 的 LIST,所以我不想要重复的附加 BOB。我也想保留订单(否则我想我可以使用sort)。

有没有聪明的方法来做到这一点? - 我想我可以先搜索变量中的文本,但它似乎很啰嗦。那么是否有“如果不存在则追加”类型的功能?

【问题讨论】:

  • 如果 LIST 只是扩展 (LIST :=) 你可以只是 LIST += $(filter-out $(LIST),BOB)...
  • @RenaudPacalet 应该可以工作,只有 makefile 不允许我递归引用变量 LIST
  • @RenaudPacalet 等等……你刚刚更新了你的评论……让我试试
  • 因为它只适用于简单的扩展变量。看我的回答。
  • @RenaudPacalet 啊酷 - 我误解了:=。一旦你使用:= 进行扩展,它(变量)是否会在其生命周期内保持简单扩展?...这是一个不错的技巧:)

标签: linux makefile gnu


【解决方案1】:

如果 LIST 只是简单地扩展 (LIST :=) 你可以只是 LIST += $(filter-out $(LIST),BOB):

$ 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.

注意:如果一个变量被声明为简单扩展,它保持不变,除非你改变它,例如LIST = ...

【讨论】:

  • 谢谢你,希望你不介意,我只是在底部的答案中添加了最后一条小评论作为注释
  • 没问题,用note可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2015-07-02
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2010-10-01
相关资源
最近更新 更多