CMake查找名称包含特定字符串的文件的路径
CMake to find path to a file which its name contains a certain string
所以我正在编写一个 CMake 模块来查找我们公司经常使用的一些库。这些库都有不同的版本,而且这里乱七八糟。在某个库中,甚至头文件和二进制文件的名称都不匹配。因此,我正在编写一个 CMake 脚本来一劳永逸地处理查找每个库的所有问题。我的想法是写一些类似我们如何找到提升包的东西,但也包括每个组件的版本。像这样:
find_package(OrgName COMPONENTS librarya-1.4.3 libraryb-2.3.1 libraryc-3.6.0)
所以我创建了一个 FindOrgName.cmake
文件并迭代了请求的组件,然后我处理了传递的字符串并获得了库名称及其版本信息,就像这样(不要介意 include 之间的区别和二进制文件):
IF(OrgName_FIND_COMPONENTS)
FOREACH(comp ${OrgName_FIND_COMPONENTS})
SET(OrgName_${comp}_FOUND 0)
STRING(FIND ${comp} "-" dashind REVERSE)
STRING(LENGTH ${comp} length)
STRING(SUBSTRING ${comp} 0 ${dashind} name)
MATH(EXPR s "${dashind}+1")
MATH(EXPR l "${length}-${dashind}-1")
STRING(SUBSTRING ${comp} ${s} ${l} version)
SET(OrgName_${name}_INCLUDE_DIR "/usr/local/include/OrgName/${comp}/")
find_library(OrgName_${comp}_LIBRARIES NAMES "${comp}" HINTS "/usr/lib")
IF(OrgName_${comp}_INCLUDE_DIR AND OrgName_${comp}_LIBRARIES)
SET(OrgName_${comp}_FOUND 1)
ENDIF()
IF(NOT OrgName_${comp}_FOUND AND OrgName_FIND_REQUIRED_${comp})
MESSAGE(FATAL_ERROR "OrgName ${comp} not available.")
ENDIF()
SET (OrgName_INCLUDE_DIR ${OrgName_INCLUDE_DIR} ${OrgName_${comp}_INCLUDE_DIR})
SET (OrgName_LIBRARIES ${OrgName_LIBRARIES} ${OrgName_${comp}_LIBRARIES})
ENDFOREACH()
ENDIF()
现在问题来了,假设有人没有在组件名称中输入版本部分。我想搜索他安装的版本(假设库的路径总是相同的)并使用它能找到的最后一个版本,所以我必须搜索名称包含库名称的文件(${name }).首先我该怎么做?第二,我做的事情对吗?我的意思是有没有更简单的方法来完成这项任务?
好的,经过大量的搜索和疲惫,我终于找到了解决方案。我只需要使用以下命令:
file(GLOB files "Mylib*")
这将创建一个名为文件的列表,并将其名称与模式 "Mylib*" 匹配的每个文件添加到其中。我真的不知道为什么他们没有在 find_file 命令中实现它,但没关系,我会把它放在这里以防有人像我一样感到困惑。
所以我正在编写一个 CMake 模块来查找我们公司经常使用的一些库。这些库都有不同的版本,而且这里乱七八糟。在某个库中,甚至头文件和二进制文件的名称都不匹配。因此,我正在编写一个 CMake 脚本来一劳永逸地处理查找每个库的所有问题。我的想法是写一些类似我们如何找到提升包的东西,但也包括每个组件的版本。像这样:
find_package(OrgName COMPONENTS librarya-1.4.3 libraryb-2.3.1 libraryc-3.6.0)
所以我创建了一个 FindOrgName.cmake
文件并迭代了请求的组件,然后我处理了传递的字符串并获得了库名称及其版本信息,就像这样(不要介意 include 之间的区别和二进制文件):
IF(OrgName_FIND_COMPONENTS)
FOREACH(comp ${OrgName_FIND_COMPONENTS})
SET(OrgName_${comp}_FOUND 0)
STRING(FIND ${comp} "-" dashind REVERSE)
STRING(LENGTH ${comp} length)
STRING(SUBSTRING ${comp} 0 ${dashind} name)
MATH(EXPR s "${dashind}+1")
MATH(EXPR l "${length}-${dashind}-1")
STRING(SUBSTRING ${comp} ${s} ${l} version)
SET(OrgName_${name}_INCLUDE_DIR "/usr/local/include/OrgName/${comp}/")
find_library(OrgName_${comp}_LIBRARIES NAMES "${comp}" HINTS "/usr/lib")
IF(OrgName_${comp}_INCLUDE_DIR AND OrgName_${comp}_LIBRARIES)
SET(OrgName_${comp}_FOUND 1)
ENDIF()
IF(NOT OrgName_${comp}_FOUND AND OrgName_FIND_REQUIRED_${comp})
MESSAGE(FATAL_ERROR "OrgName ${comp} not available.")
ENDIF()
SET (OrgName_INCLUDE_DIR ${OrgName_INCLUDE_DIR} ${OrgName_${comp}_INCLUDE_DIR})
SET (OrgName_LIBRARIES ${OrgName_LIBRARIES} ${OrgName_${comp}_LIBRARIES})
ENDFOREACH()
ENDIF()
现在问题来了,假设有人没有在组件名称中输入版本部分。我想搜索他安装的版本(假设库的路径总是相同的)并使用它能找到的最后一个版本,所以我必须搜索名称包含库名称的文件(${name }).首先我该怎么做?第二,我做的事情对吗?我的意思是有没有更简单的方法来完成这项任务?
好的,经过大量的搜索和疲惫,我终于找到了解决方案。我只需要使用以下命令:
file(GLOB files "Mylib*")
这将创建一个名为文件的列表,并将其名称与模式 "Mylib*" 匹配的每个文件添加到其中。我真的不知道为什么他们没有在 find_file 命令中实现它,但没关系,我会把它放在这里以防有人像我一样感到困惑。