如何使用正则表达式在cmake中包含后缀为(.h、.hpp和.hxx)的文件?

如何使用正则表达式在cmake中包含后缀为(.h、.hpp和.hxx)的文件?,cmake,glob,Cmake,Glob,我想在一个目录下安装所有的头文件 我知道正则表达式可以做到这一点。但是我经常在谷歌上搜索,没有发现如何将这三种文件合并在一起 我使用的命令如下: file(GLOB INFRA ${LOCAL_SRC_PATH}/infra/*.h[|p|x][|p|x]) 使INFRA变量保存所有头文件,但我发现它忽略了.h 我知道这很容易,你能帮忙吗?全局表达式不是正则表达式;您需要使用3个单独的命令来匹配.h、.hpp和.hxx文件。即使作为正则表达式,这也会失败,因为字符组匹配字符|、p和x,但它们与

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

我知道正则表达式可以做到这一点。但是我经常在谷歌上搜索,没有发现如何将这三种文件合并在一起

我使用的命令如下:

file(GLOB INFRA ${LOCAL_SRC_PATH}/infra/*.h[|p|x][|p|x])
使
INFRA
变量保存所有头文件,但我发现它忽略了
.h


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

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

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

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)")

请注意,
file(GLOB)
使用全局表达式,而不是常规表达式。据我所知,choice操作符(
|
)不属于globbing语法。假设您有一个可能的扩展名列表:
set(headers\u ext.h.hpp.hxx)
您可以为查找这些头创建一个全局表达式列表:
list(TRANSFORM headers\u ext PREPEND“${LOCAL SRC\u PATH}/infra/*”OUTPUT\u VARIABLE headers\u glob)
并在全局命令中使用它:
文件(glob infra${headers\u ext})
@Tsyvarev谢谢,glob与常规expr不同,明白吗