【问题标题】:check if CMake module exists检查 CMake 模块是否存在
【发布时间】:2013-03-30 01:49:03
【问题描述】:

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    你可以使用类似这个函数的东西:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2012-10-15
      • 2013-03-03
      相关资源
      最近更新 更多