2015-06-07 53 views
0

因此,我正在编写一个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 })。首先,我该怎么做?其次,我是否正确地做事?我的意思是有更简单的方法来完成这项任务?

回答

0

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

file(GLOB files "Mylib*") 

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

相关问题