检查CMake模块是否存在

时间:2013-03-29 15:30:46

标签: cmake

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

1 个答案:

答案 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