【问题标题】:CMake's GLOB_RECURSE seems to recurse more than what I asked it toCMake 的 GLOB_RECURSE 似乎比我要求的递归更多
【发布时间】:2021-07-29 13:26:16
【问题描述】:

在我的项目中,我有一个名为foo 的子目录,我想要foo 下的所有.cpp 文件及其子目录的列表。所以 - 这对我来说是 GLOB_RECURSE。现在,查看CMake documentation,我看到语法是:

file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
     [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
     [<globbing-expressions>...])

就我而言:

file(GLOB_RECURSE my_list "foo/" "*.cpp")

不幸的是,我得到的是我的项目中所有.cpp文件的路径——不仅仅是foo/。这是为什么呢?

【问题讨论】:

    标签: cmake glob


    【解决方案1】:

    您误解了&lt;path&gt; 占位符在语法中的作用。仅在使用 RELATIVE 关键字时才有意义 - 而您没有使用 RELATIVE

    因此,您实际提供的GLOB_RECURSE两个 通配符。

    奇怪的是,每个 globbing 表达式都被认为同时包含 both 递归的根目录 globbing 模式。在您的情况下,这将是:

    file(GLOB_RECURSE my_list "foo/*.cpp")
    

    CMake 会将该字符串拆分,以便在 foo/ 的所有子目录中查找 .cpp 文件。

    【讨论】:

    • Documentation 你指的有一个通配表达式的例子:/dir/*.py - match all python files in /dir and subdirectories。不知道为什么使用类似的表达对你来说看起来“很奇怪”。至于&lt;path&gt; 参数,文档似乎很清楚它的作用:它是RELATIVE 选项的一部分。
    • @Tsyvarev:我没想到 CMake 会在最后一个 / 处分解单个字符串参数,并使用一部分作为根,另一部分作为模式。
    • 在您的原始调用中,"foo/""*.cpp"单独的通配表达式。 CMake 首先生成与第一个表达式匹配的文件列表,然后生成与第二个表达式匹配的文件列表。然后将这些列表组合成一个列表(通过附加)。
    • @Tsyvarev:是的,这就是我发现问题所在。也许我应该在回答中澄清这一点。
    • 是的,现在答案比以前更有意义了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2018-05-31
    • 2019-05-11
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多