【问题标题】:GNU Make: Remove string from array with subdirectories if string contains "dirToExclude"GNU Make:如果字符串包含“dirToExclude”,则从带有子目录的数组中删除字符串
【发布时间】:2021-08-10 16:01:48
【问题描述】:

我有一个包含很多包含源文件的子目录的目录。因此,我正在寻找 .c 文件的每个子目录:cSources = $(shell dir /s /b *.c)

但是,有些子目录包含我不想编译的源文件。如果我有一个变量 dirToExclude = dirName 我如何删除 cSources 中包含 'dirName' 的每个字符串?

我知道有findstring-函数。但我不知道如何在数组中的每个字符串上使用findstring。我正在寻找某种方法来获得像(伪代码)这样​​的嵌套循环:

foreach (var in cSources)
   if (var.contains(dirToExclude))
       cSources -= var
   endif

【问题讨论】:

  • 不使用模式匹配来识别您的来源怎么样?这样做是一种反模式。
  • @JohnBollinger 也许你能给我一个更好的解决方案的提示?
  • 常规方式是明确列出相关源文件或其对应的目标文件,然后从那里开始。如果想区分不同的源文件集,则可以使用多个变量,或者可能使用递归 make 和多个 makefile。

标签: makefile gnu-make gnu


【解决方案1】:

如果你知道dirToExclude 总是在字符串的开头,你可以写:

cSources := $(filter-out $(dirToExclude)%,$(cSources))

如果要删除字符串出现在任何位置的任何文件名,可以使用:

cSources := $(foreach S,$(cSources),$(if $(findstring $(dirToExclude),$(S)),,$(S)))

https://www.gnu.org/software/make/manual/html_node/Functions.html

【讨论】:

  • 第二个解决方案为我指明了正确的方向。但我想应该是cSources := $(foreach S,$(cSources),$(if $(findstring $(dirToExclude),$(S)),,$(S)))
  • 但是输出看起来仍然向cSources 添加了一个空字符串。你知道是否也可以删除它吗?
  • 我不知道您所说的“空字符串”是什么意思。您能否编辑您的问题并剪切和粘贴您看到的内容以及为什么会出现问题?
  • 如果我打印cSources,它看起来像:Path Path Path Path Path 在一行中的多个空格中,看起来这是一个包含dirToExclude 的路径。但它不会引起任何问题。
  • 好吧,如果你不想要额外的空间,你可以通过$(strip ...) 运行整个事情(参见上面的函数链接)。但它们可能不会伤害任何东西。
猜你喜欢
  • 1970-01-01
  • 2020-02-14
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多