【问题标题】:Makefile: How to apply an equivalent to filter on multiple wildcardsMakefile:如何应用等效项来过滤多个通配符
【发布时间】:2012-09-01 04:52:41
【问题描述】:

我正在编写一个 Makefile,但遇到了过滤器功能限制。 实际上,过滤器只需要一个通配符。

我想做的是: 我有一个文件列表,有些匹配正则表达式 blabla,有些不匹配。但为此我需要 2 个通配符,因此我不能使用过滤功能。

我想将我的原始列表分成 2 个列表,一个包含所有包含 blabla 字符串的元素(过滤器等效项),另一个包含不匹配的元素(过滤器等效项)。

感谢您的帮助。

【问题讨论】:

  • 您使用的是 GNU make 还是其他一些变体?并显示您当前的代码,目前尚不清楚问题所在。
  • 请提供文件示例列表、过滤器表达式和所需结果。你现在描述的方式,我不清楚为什么 $(filter ...)$(filter-out ...) 函数对你来说不够好。
  • 感谢您的回复。我正在使用 gnu make。我没有要显示的代码,因为我不知道如何编写它。假设我有 LIST= a_old_tt x_old_da a_new_da q_ty_we。我想对 LIST 内容进行排序: LIST_OLD 包含 LIST 的所有成员,其中包含表达式 old(在我的示例中为 a_old_tt 和 x_old_da),以及 LIST_NOT_OLD 包含 LIST 的所有成员不包含表达式 old(在我的示例中为 a_new_da q_ty_we)。

标签: filter makefile wildcard


【解决方案1】:

您可以在不运行任何外部命令的情况下执行此操作。定义两个宏

containing = $(foreach v,$2,$(if $(findstring $1,$v),$v))
not-containing = $(foreach v,$2,$(if $(findstring $1,$v),,$v))

现在你可以做

LIST := a_old_tt x_old_da a_new_da q_ty_we
LIST_OLD := $(call containing,old,$(LIST))
LIST_NOT_OLD := $(call not-containing,old,$(LIST))

【讨论】:

  • +1,看起来很合理,我个人会以同样的方式实现它。
  • 限制是否需要完整的正则表达式来计算“包含”布尔值,但它适用于这种特殊情况。我个人不会担心外部命令,因为 Make 的性能/内部循环很可能在目标中,在构建/编译命令中。
  • 当然,正如 Beta 在他的回答中所说,make 根本无法处理正则表达式,所以如果你需要它们(但 OP 不需要),你显然不能使用这个答案。对这个问题的第一反应通常是拿出大炮并调用外部命令进行匹配,但正如本例所示,这可能是巨大的矫枉过正。为了便携性和速度,我尽可能避免运行外部命令。我已经看到在大型基于 make 的构建系统中摆脱不必要的外部命令带来了巨大的性能提升。
  • 这不适用于我作为使用 % 的目标依赖项列表的一部分。它只是作为一个空字符串出现。也许它正在搜索文字 % 符号?
【解决方案2】:

Make 最大的缺点之一是它处理正则表达式的能力很差。函数filterfilter-out 在单词中间找不到“old”。我建议这个黑客:

NOT_OLD = $(shell echo $(LIST) | sed 's/[^ ]*old[^ ]* *//g')
OLD = $(filter-out $(NOT_OLD), $(LIST))

【讨论】:

    【解决方案3】:

    您可以利用 shell 更高级的字符串处理功能。假设您有bash,您可以在makefile 中使用以下内容:

    LIST := a_old_tt x_old_da a_new_da q_ty_we
    LIST_NOT_OLD := $(shell l=($(LIST)); echo $${l[@]//*old*})
    LIST_OLD := $(filter-out $(LIST_NOT_OLD),$(LIST))
    

    您可以在how to delete elements from an array based on a pattern 中找到有关 bash 字符串替换机制的说明。需要双 $ 以在 shell 调用中保留 $ 符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多