8

プロジェクトのコンパイルを管理するために cmake を使用していますが、cmake を使用するのは初めてです。このツールは、必要なすべてのライブラリが特定のコンピューターにインストールされているかどうかを確認できるスクリプトと関数が多数あるため、非常に便利です。ただし、これらの一般的な sripts は特定のケースをカバーしていないか、特定のライブラリではまったく使用できない場合があります。私の質問は次のとおりです。

特定のヘッダー ファイル (hpp または h) がインクルード パスで利用可能かどうかを確認する正しい cmake スタイルの方法は何ですか?

理由:

最も簡単な方法は、おそらく CHECK_INCLUDE_FILE マクロを使用することです。たとえば、UnitTest++ ライブラリを使用したい場合は、次のように記述できます。

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX)
IF(NOT HAVE_UNITTESTXX)
  message( FATAL_ERROR "UnitTest++ is not found" )
ENDIF()

残念ながら、この方法で実行すると、変数 HAVE_UNITTESTXX がキャッシュに格納されます。システムに UnitTest++ ライブラリをインストールすると、cmake はまだ UnitTest++.h がインストールされていないと文句を言います。キャッシュを手動で削除できますが、標準のパッケージ検索機能ではそれは必要ありません。このようにコードをアップグレードすることもできます

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX)
IF(NOT HAVE_UNITTESTXX)
  UNSET(HAVE_UNITTESTXX CACHE)
  message( FATAL_ERROR "UnitTest++ is not found" )
ENDIF()

このソリューションは機能しますが、見栄えがよくありません。このタスクを行うためのcmakeの方法を知りたいです。

よろしくお願いします!

4

1 に答える 1

4

あなたが探している答えは、すでにCMake Wikiにあります。CMakeCache.txtそれらは、手動で気になるファイルまたはキャッシュラインを削除するように明確に指示します.

残念ながら、これを行うよりクリーンな方法はありません。あなたのものはすでに可能な限り優れています。私は、CMake は、すべてがうまくいっているときに便利になろうとしていると思います。つまり、キャッシュであり、失敗したときにキャッシュを強制的に削除して再生成しようとします。

一方、CHECK_INCLUDE_FILE_CXX_ERROR毎回同じコードを繰り返す必要がないように、致命的なエラー メッセージをラップするマクロ (またはわかりやすい名前) を作成できます。

macro(CHECK_INCLUDE_FILE_CXX_ERROR INCLUDE_FILE HAVE_FILE)
    CHECK_INCLUDE_FILE_CXX(${INCLUDE_FILE} ${HAVE_FILE})
    IF(NOT ${HAVE_FILE})
        UNSET(HAVE_UNITTESTXX CACHE)
        message( FATAL_ERROR "${INCLUDE_FILE} is not found" )
    ENDIF()
endmacro()

そして、次のように使用します。

CHECK_INCLUDE_FILE_CXX_ERROR("UnitTest++.h" HAVE_UNITTESTXX)
于 2013-05-10T16:41:33.747 に答える