因此,我正在编写一个CMake模块来查找一些正在我们公司中使用的库。这些库都有不同的版本,在这里很混乱。在某个库中,甚至头文件和二进制文件的名称也不匹配。所以我正在编写一个CMake脚本来处理所有找到每个库的所有问题。我脑海里想写的东西就是我们如何找到boost软件包,但也包括每个组件的版本。事情是这样的:CMake找到其名称包含特定字符串的文件的路径
find_package(OrgName COMPONENTS librarya-1.4.3 libraryb-2.3.1 libraryc-3.6.0)
所以我创建了一个FindOrgName.cmake
文件和迭代所请求的组件,然后我处理的,它传递的字符串,并与它的版本信息像这样一起获得的库名(没关系包括和二进制文件之间的差异):
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 })。首先,我该怎么做?其次,我是否正确地做事?我的意思是有更简单的方法来完成这项任务?