2015-06-07 87 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命令中實現它,但沒關係,我會把它放在這裏,以防萬一有人像我一樣困惑。

相關問題