2

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

4

1 回答 1

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
于 2013-03-29T17:49:03.717 回答