1. ホーム
  2. cmake

[解決済み] cmakeのincludeコマンドにおいて、ファイルとモジュールの違いは何ですか?

2022-03-06 21:57:58

質問

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

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

ただ、これがうまくいかないんです。インクルードコマンドで指定したファイルが見つからないのです。

念のため、環境変数にバックスラッシュやフォワードスラッシュでパスを指定する方法も試してみました。- その都度コマンドプロンプトを再起動し、環境変数が正しく存在していることを確認しました。

cmakeのマニュアルでは、quot;file"とquot;module"は異なるもので、モジュールだけが自動的に拡張子の追加とパスの検索が行われることを暗示しているようなものです。しかし、その違いが何であるかの説明はありません。私は、拡張子がないだけで(標準的なモジュールと同じように)十分なのではないかと推測しましたが、明らかにそうではありません。

マニュアルで "module" を検索しても、この単語はオーバーロードされているようで、あまり役に立ちません。例えば、モジュールはLoadLibrary/dl_openでロードされたダイナミックライブラリでもあります。

この文脈でファイルとモジュールの違いは何か、またcmakeのincludeコマンドでモジュールを見つけて使用できるように独自のモジュールを作成するにはどうしたらよいか、どなたか説明していただけませんか?

Windowsでcmake 2.8.1を使っています。

EDIT

この問題は、cmakeがどのように動作することになっているのかを理解していないことにあると確信しています。私が思うに すべき を書くことです。 find_package が動作するようになります。

しかし、現状では、自分の質問に答えることはまだできない。

解決方法は?

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 そのものです。