通配符获取所有目录的列表

Haa*_*hii 31 makefile wildcard gnu-make

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

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

DIRECTORIES = $(wildcard */)

all:
    echo $(DIRECTORIES)
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,并给我所需的清单.但是,如果我想要使用另一个目录中的所有目录的列表

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

all:
    echo $(DIRECTORIES)
Run Code Online (Sandbox Code Playgroud)

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

任何建议为什么会发生这种情况以及如何解决它?其他获得该清单的解决方案也是受欢迎的.

Lei*_*Mou 39

使用sortdir功能wildcard:

DIRECTORY = $(sort $(dir $(wildcard ../Test/*/)))
Run Code Online (Sandbox Code Playgroud)

从GNU make手册:

$(dir names ...)以名称提取每个文件名的目录部分.文件名的目录部分是通过(并包括)其中最后一个斜杠的所有内容.如果文件名不包含斜杠,则目录部分为字符串'./'.

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

另请参阅本文中的第二种和第三种方法:自动创建目录列表

  • 这对我来说似乎不必要地复杂.我不知道为什么你需要`sort`例如.您可以使用:`$(dir $(wildcard ../ Test/*/.))`(注意在末尾添加`.`以确保最终字符不是斜杠)并且它可以在任何地方使用. (3认同)
  • 是的,这就完成了这项工作.非常感谢. (2认同)
  • @MadScientist,`sort` 确保按字母顺序遍历目录。例如,如果您想一目了然地知道构建进行了多远,这将非常有用。当我省略它时,我发现在 Windows 上,目录是按字母顺序遍历的,但在 Linux 上,它们不是。 (2认同)

reg*_*his 16

尝试:

$(shell find <directory> -maxdepth 1 -type d)
Run Code Online (Sandbox Code Playgroud)

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

  • 要获得没有"<directory>"的列表,可以使用`-mindepth 1 -maxdepth 1`. (7认同)

yua*_*eng 6

用:

$(wildcard ../Test/*/.)
Run Code Online (Sandbox Code Playgroud)

这工作正常。