CMake查找其名称包含特定字符串的文件的路径

时间:2015-06-07 12:54:49

标签: cmake

所以我正在编写一个CMake模块来查找一些在我们公司中被大量使用的库。这些库都有不同的版本,这里很乱。在某个库中,即使头文件和二进制文件的名称也不匹配。所以我正在编写一个CMake脚本来处理一劳永逸地找到每个库的所有问题。我的想法是写一些类似于我们如何找到boost包的东西,但也包括每个组件的版本。像这样:

find_package(OrgName COMPONENTS librarya-1.4.3 libraryb-2.3.1 libraryc-3.6.0)

所以我创建了一个FindOrgName.cmake文件并迭代了所请求的组件,然后我处理了传递的字符串并获得了库名以及它的版本信息(更别说include和binary之间的区别)文件):

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 })。首先,我该怎么做?第二,我做得对吗?我的意思是有更简单的方法来完成这项任务吗?

1 个答案:

答案 0 :(得分:0)

好的,经过大量的搜索和疲惫,我终于找到了解决方案。我只需要使用以下命令:

file(GLOB files "Mylib*")

这将创建一个名为files的列表,并将其名称与模式“Mylib *”匹配的每个文件添加到其中。我真的不知道为什么他们没有在find_file命令中实现它,但没关系,我会把它放在这里,万一有人像我一样感到困惑。