【问题标题】:Wildcard to obtain list of all directories通配符获取所有目录的列表
【发布时间】:2012-12-03 14:12:07
【问题描述】:

在我的 Makefile 中,我需要获取其他目录中存在的所有目录的列表。

要获取与我的Makefile 在同一文件夹中的所有目录的列表,我使用:

DIRECTORIES = $(wildcard */)

all:
    echo $(DIRECTORIES)

效果很好,并给了我想要的列表。但是,如果我想拥有另一个目录中所有目录的列表,则使用

DIRECTORIES = $(wildcard ../Test/*/)

all:
    echo $(DIRECTORIES)

我得到了该目录中所有文件(带路径)的列表,包括 .h.cpp 文件。

任何建议为什么会发生这种情况以及如何解决它?也欢迎其他获取列表的解决方案。

【问题讨论】:

  • 你确定通配符是个好主意吗?
  • @JonathanLeffler 我不想手动添加每个目录,因为它是一个更大的项目。如果您知道如何避免使用通配符,请告诉我。
  • 您看到此行为的原因是您的 GLIBC 版本中存在错误:sourceware.org/bugzilla/show_bug.cgi?id=10278

标签: makefile wildcard gnu-make


【解决方案1】:

sortdir 函数与wildcard 一起使用:

DIRECTORY = $(sort $(dir $(wildcard ../Test/*/)))

来自 GNU make 手册:

$(目录名...) 提取名称中每个文件名的目录部分。文件名的目录部分是直到(包括)最后一个斜杠的所有内容。如果文件名不包含斜线,则目录部分是字符串'./'。

$(排序列表) 按词汇顺序对列表中的单词进行排序,删除重复的单词。输出是由单个空格分隔的单词列表。

另请看本文第二种和第三种方法:Automatically Creating a List of Directories

【讨论】:

  • 是的,这就是工作。非常感谢。
  • 这对我来说似乎是不必要的复杂。例如,我不知道您为什么需要sort。您可以使用:$(dir $(wildcard ../Test/*/.))(注意在末尾添加.,以确保最后一个字符不是斜线),它可以在任何地方使用。
  • @MadScientist,sort 确保目录按字母顺序遍历。例如,如果您希望能够一眼看出构建进行了多远,这将非常有用。当我省略它时,我发现在 Windows 上,目录是按字母顺序遍历的,但在 Linux 上,它们不是。
  • @MadScientist 听从您的建议,. 不会删除尾部斜杠,但会从列表中删除当前目录。
  • 对不起,我没听懂您的评论。
【解决方案2】:

试试:

$(shell find <directory> -maxdepth 1 -type d)

这将为您提供给定目录中的目录列表,而无需进入子目录。您可能需要清理该列表,因为它会在列出的每个目录之前包含 ../

【讨论】:

  • 要获取没有&lt;directory&gt; 的列表,您可以使用-mindepth 1 -maxdepth 1
  • 如何消除../
  • @Danijel 在foreach 循环中的所有目录上使用notdir 函数:$(foreach dir,$(shell find -mindepth 1 -maxdepth 1 -type d),$(notdir $(dir))
【解决方案3】:

用途:

$(wildcard ../Test/*/.)

这很好用。

【讨论】:

  • 为什么会这样? FWIW,它确实工作,但每个目录条目看起来像path/to/dir/.。所以cdmake -C. 在某些情况下确实有效,但是如果您正在打印进度信息并且您在控制台中看到它,就像我一直在做的那样,它看起来有点奇怪。加上dir 删除,比如$(dir $(wildcard ../Test/*/.))
猜你喜欢
  • 2016-12-22
  • 2010-11-01
  • 2010-12-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多