2

CMakeについて質問があります。最近、GLEWやMercurialなど、多くのモジュールが標準インストールに追加されました。

ただし、多くのインストールベースには、すべての新しいモジュールが利用できない古いバージョンが含まれている可能性があるため、独自のバージョン(例:FindGLEW.cmake)を出荷する必要があります。

特定のFindXXXモジュールが使用可能かどうかを確認し、その場合はそれを使用することはできますか?そうでない場合は、適切な代替手段を提供してください。または、実行時にcmakeのバージョンを確認することもできます(ただし、常に信頼できるとは限らず、維持するのが面倒です)...?

助けてくれてありがとう。

4

2 に答える 2

1

CMakeのincludeコマンドwrtモジュールのデフォルトの検索動作は次のとおりです。

名前の付いたファイル<modulename>.cmakeは、最初にで検索されCMAKE_MODULE_PATH、次にCMakeモジュールディレクトリで検索されます。

(もう少しあります-ドキュメントを参照するか、実行してくださいcmake --help-command include

あなたが求めているのはこれとは逆のようです。最初にCMakeモジュールディレクトリで公式モジュールを確認し、存在しない場合はフォールバックして独自のモジュールを使用します。

モジュールがにあると仮定すると${CMAKE_SOURCE_DIR}/my_cmake_modules、次のようにしてCMakeのデフォルトの動作を逆にすることができます。

set(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/my_cmake_modules)

公式のモジュールとまったく同じように独自のモジュールに名前を付けると、これで目標を達成できるはずです。スクリプトの後半で通常のCMakeの動作に戻したい場合は、次の操作を実行できます。

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/my_cmake_modules)
于 2012-11-13T19:38:13.773 に答える
0

上記の解決策の可能な代替案として、私はこのcmakeポリシーを見つけました

CMP0017
   Prefer files from the CMake module directory when including from
   there.

   Starting with CMake 2.8.4, if a cmake-module shipped with CMake (i.e.
   located in the CMake module directory) calls include() or
   find_package(), the files located in the the CMake module directory
   are preferred over the files in CMAKE_MODULE_PATH.  This makes sure
   that the modules belonging to CMake always get those files included
   which they expect, and against which they were developed and tested.
   In call other cases, the files found in CMAKE_MODULE_PATH still take
   precedence over the ones in the CMake module directory.  The OLD
   behaviour is to always prefer files from CMAKE_MODULE_PATH over files
   from the CMake modules directory.

   This policy was introduced in CMake version 2.8.4.  CMake version
   2.8.9 warns when the policy is not set and uses OLD behavior.  Use the
   cmake_policy command to set it to OLD or NEW explicitly.

お役に立てれば。

于 2012-11-21T09:19:53.747 に答える