我想编写一个搜索特定库的CMake脚本;首先使用CMake的Find_PACKAGE(),如果失败,我会做其他事情。我从
开始FIND_PACKAGE(BLAS)
IF (BLAS_FOUND)
# do stuff
ELSE()
# do other stuff
ENDIF()
如果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()
如何确定HAS_MODULE_*
?
答案 0 :(得分:5)
你可以使用类似这样的功能:
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()
这利用了以下事实:如果找不到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}")
你的输出应该是:
${HAS_MODULE_Spurious} - FALSE ${HAS_MODULE_Threads} - TRUE