检查CMake模块是否存在

Nic*_*mer 2 cmake

我想编写一个搜索特定库的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_*

Fra*_*ser 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()
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)

你的输出应该是:

${HAS_MODULE_Spurious} - FALSE
${HAS_MODULE_Threads} - TRUE
Run Code Online (Sandbox Code Playgroud)