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 に答える