【问题标题】:recursive user defined function in makefile runs out of stack memorymakefile中的递归用户定义函数耗尽堆栈内存
【发布时间】:2015-06-02 13:11:28
【问题描述】:

我有一个函数可以返回目录中的所有文件。

# Returns all files in folder recursively that match pattern 
# 
# $(call rwildcard, folder,pattern)
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) 

参数1,即文件夹,是递归搜索文件的文件夹的路径,它是用户提供的

如果这个参数是“/”,这将耗尽内存并崩溃并出现异常。

有没有办法防止这种情况发生?除了过滤“/”作为参数。

注意:我使用的是 cygwin

【问题讨论】:

  • 我猜答案是“不”。如果 make 无法分配足够的内存来包含请求的值列表,事情就会变得很糟糕。我想您也许可以在其中添加逻辑以检查递归期间返回值的长度并手动错误/等。如果列表开始变得太长,但我不确定这实际上会有多容易。
  • 是的。这就是我的想法,虽然不知道如何轻松做到这一点。

标签: recursion makefile out-of-memory wildcard


【解决方案1】:

我怀疑你在内部通配符方面没有取得任何进展。如果匹配“。”每次,你都陷入了循环吗?

您可以使用其他工具来获取文件列表吗?

r := $(shell find $(dir) -type f -name \*$(likethis)\*)

【讨论】:

  • 使用像find这样的外部工具是个好主意,但递归并不是无限的;像* 这样的通配符与隐藏文件不匹配,因此/* 永远不会匹配/.(或/..)
  • 该功能适用​​于深度和目录数量相对较小的文件夹。解析整个根时会出现问题。我知道“查找”在这里会很好用,但我的意图是不使用任何外部工具
猜你喜欢
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2011-07-25
  • 2014-01-02
  • 2023-03-27
  • 2017-09-12
  • 2011-06-16
  • 2018-10-03
相关资源
最近更新 更多