web-dev-qa-db-ja.com

cmake "include"コマンドの場合、ファイルとモジュールの違いは何ですか?

ライブラリを使用するすべてのプロジェクトの一部としてビルドしたくないライブラリを使用しています。非常にわかりやすい例はLLVMで、78個の静的ライブラリがあります。すべてのcmakefileでこれらを見つけてインポートするためのcmakeコードを用意することさえ、過剰です。

明白な解決策は、 "include"コマンドを使用し、cmakeスクリプトの関連するチャンクを* .cmakeファイルに分解し、CMAKE_MODULE_PATH環境変数を設定することです。

それを除いて、単純に機能しません。 Cmakeは、includeコマンドで指定したファイルを見つけられません。

オフチャンスでは、環境変数でパスをいくつかの方法で指定しようとしました-一度はバックスラッシュで、もう1つはスラッシュで...-そして毎回コマンドプロンプトを再起動し、環境変数が存在し、正しいことを確認しました。

Cmakeマニュアルでは、これは「ファイル」が「モジュール」とは異なることを暗に示しています-モジュールだけが自動的にパスの追加とパスの検索を処理します。しかし、違いが何であるかについての説明はありません。 (標準モジュールの場合と同様に)不足している拡張で十分かもしれないと思いましたが、明らかにそうではありません。

マニュアルを「モジュール」で検索しても、Wordが過負荷になっているように見えるため、あまり役に立ちません。たとえば、モジュールはLoadLibrary/dl_openを使用してロードされる動的ライブラリでもあります。

このコンテキストでのファイルとモジュールの違いは何か、そしてcmake includeコマンドがそれを見つけて使用できるように独自のモジュールを作成する方法を誰かが説明できますか?

Windowsでcmake 2.8.1を使用しています。

[〜#〜]編集[〜#〜]

ここでの問題は、cmakeがどのように機能するかを理解していないことにはかなり自信があります。私はすべきことがしていることはfind_packageは使用できます。

とはいえ、私自身の質問に答えることはまだできていません。

38
Steve314

CMakeの「モジュール」は、単純に _find_package_ ディレクティブで使用できるファイルだと思います。つまり、find_package(Module)を実行すると、MODULE_PATHで_FindModule.cmake_という名前のファイルが検索されます。

とはいえ、拡張子のないファイルをincludeした場合も、MODULE_PATHでその_file.cmake_を検索します。私が取り組んでいるCMakeプロジェクトでは、あなたが提案するものと非常によく似たディレクトリ構造があります。

_+ root/
  + CMakeLists.txt
  + cmake/
  | + FindMatlab.cmake
  | + TestInline.cmake
  | + stdint.cmake
  + src/
  + include/
_

CMakeLists.txtには次のようになっています。

_set (CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package (Matlab) # runs FindMatlab.cmake
include(TestInline) # defines a macro:
test_inline (CONFIG_C_INLINE)
include(stdint) # simply executes flat CMake code
_

おそらく、問題は、環境からモジュールパスを定義しようとしていることです。代わりに、モジュール/ファイルにアクセスしようとするCMakeList自体withinを単純に追加してみてください。

39
Matt B.

CMake include()コマンドのドキュメントを読んだ後、同じ質問がありました。それは述べています:

指定されたファイルからCMakeコードをロードして実行します。 [...簡潔にするために抜粋...]ファイルの代わりにモジュールが指定されている場合、.cmakeという名前のファイルが最初にCMAKE_MODULE_PATHで検索され、次にCMakeモジュールディレクトリで検索されます。

CMakeモジュールは結局ファイルシステム上のファイルであるため、これはCMakeがモジュールとファイルのどちらを考慮するかについて多くの解釈を残します。違いは何ですか?

CMakeのソースコードは、答えを見つけることができる唯一の場所です。基本的にCMakeは、include()の引数が絶対パスのように見える場合、ファイルと見なします。これの意味は:

  • Linux/Unixの場合
    • 引数は '/'または '〜'で始まります
  • Windowsの場合
    • 引数の2番目の文字は「:」です(C:など)
    • 引数は「\」で始まります

CMakeは、上記の基準を満たさないものはすべてモジュールであると想定しています。その場合、引数に '.cmake'を追加し、CMAKE_MODULE_PATHを検索します。

10
mshildt

ファイルはCMakeリストファイルで、例はCMakeLists.txtです。次のコマンドを使用して、で使用されるコマンドのリストを取得します

cmake --help-command-list 

モジュールはcmakeコマンドを含むcmakeファイル(* .cmake)です。

Matt B.が述べたように、CMAKE_MODULE_PATHはシェルの環境変数ではなく、cmake変数です。

モジュールパスをCMAKE_MODULE_PATHに追加するには

LIST(APPEND CMAKE_MODULE_PATH ${YourPath})

または、モジュールを最初に使用するように設定した場合

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath})
5
Ding-Yi Chen