【问题标题】:how to use regular expression to include file with postfix (.h, .hpp and .hxx) in cmake?如何使用正则表达式在 cmake 中包含带有后缀(.h、.hpp 和 .hxx)的文件?
【发布时间】:2021-05-14 07:43:01
【问题描述】:

我想把所有的头文件都安装在一个目录下。

我知道正则表达式可以做到这一点。但是我google了很多,没有找到如何将这三种文件包含在一起。

我使用这样的命令:

file(GLOB INFRA ${LOCAL_SRC_PATH}/infra/*.h[|p|x][|p|x])

使INFRA 变量保存所有头文件,但我发现它忽略了.h

我知道这很容易,你能帮忙吗?

【问题讨论】:

  • 请注意,file(GLOB) 使用通配符,而不是常规。据我所知,选择运算符 (|) 不属于通配符语法。假设您有一个可能的扩展列表:set(headers_ext .h .hpp .hxx),您可以创建一个通配表达式列表来查找这些标头:list(TRANSFORM headers_ext PREPEND "${LOCAL_SRC_PATH}/infra/*" OUTPUT_VARIABLE headers_glob) 并在通配命令中使用它:file(GLOB INFRA ${headers_ext})
  • @Tsyvarev 谢谢,glob 与常规 expr 不同,明白了

标签: cmake glob


【解决方案1】:

通配表达式不是正则表达式;您需要使用 3 个单独的命令来匹配 .h.hpp.hxx 文件。即使作为正则表达式也会失败,因为字符组匹配字符 |px,但它们不匹配空字符串。

在这种情况下,您可能会使用

set(PATH_PREFIX "${LOCAL_SRC_PATH}/infra/*")
file(GLOB INFRA_H "${PATH_PREFIX}.h")
file(GLOB INFRA_HPP "${PATH_PREFIX}.hpp")
file(GLOB INFRA_HXX "${PATH_PREFIX}.hxx")

set(INFRA ${INFRA_H} ${INFRA_HPP} ${INFRA_HXX})

在这种情况下,我建议使用install(DIRECTORY);这也允许您使用正则表达式而不是通配表达式:

install(DIRECTORY "${LOCAL_SRC_PATH}/infra"
        TYPE INCLUDE
        FILES_MATCHING REGEX ".*\\.(h|hpp|hxx)")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2018-08-14
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多