我想编写一个搜索特定库的CMake脚本; 首先使用CMake的Find_PACKAGE(),如果失败,我会做其他事情.我开始了
FIND_PACKAGE(BLAS)
IF (BLAS_FOUND)
# do stuff
ELSE()
# do other stuff
ENDIF()
Run Code Online (Sandbox Code Playgroud)
如果FindBLAS.cmake在系统上可用(通常是这样,至少在最后几个CMake版本中),这种方法很有效.如果寻找更虚假的东西,我首先要检查CMake是否已经有一个模块,即做类似的事情
SET(Spurious_FOUND FALSE)
IF (HAS_MODULE_Spurious)
FIND_PACKAGE(Spurious)
ENDIF()
IF (Spurious_FOUND)
# do stuff
ELSE()
# do other stuff
ENDIF()
Run Code Online (Sandbox Code Playgroud)
怎么判断HAS_MODULE_*?
你可以使用类似这样的功能:
function(CheckHasModule Module)
find_package(${Module} QUIET)
if(NOT DEFINED ${Module}_DIR)
set(HAS_MODULE_${Module} TRUE PARENT_SCOPE)
elseif(${Module}_DIR)
set(HAS_MODULE_${Module} TRUE PARENT_SCOPE)
else()
set(HAS_MODULE_${Module} FALSE PARENT_SCOPE)
endif()
endfunction()
Run Code Online (Sandbox Code Playgroud)
这利用了以下事实:如果找不到包配置文件VAR,则将缓存变量VAR_DIR设置为VAR_DIR-NOTFOUND.因此,如果找到包配置文件,则未定义此变量,或者将其设置为有效路径(无论是否find_package找到所请求的包).
所以,如果你这样做
CheckHasModule(Spurious)
CheckHasModule(Threads)
message("\${HAS_MODULE_Spurious} - ${HAS_MODULE_Spurious}")
message("\${HAS_MODULE_Threads} - ${HAS_MODULE_Threads}")
Run Code Online (Sandbox Code Playgroud)
你的输出应该是:
Run Code Online (Sandbox Code Playgroud)${HAS_MODULE_Spurious} - FALSE ${HAS_MODULE_Threads} - TRUE
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |