1. ホーム
  2. cmake

[解決済み] CMAKE_CURRENT_SOURCE_DIRとCMAKE_CURRENT_LIST_DIRの相違点

2022-06-11 06:57:03

質問

Wikiから。

cmake_current_source_dir これは、現在処理中の CMakeLists.txt が置かれているディレクトリです。

cmake_current_list_dir (2.8.3 以降) これは現在処理中のリストファイルのディレクトリです。

Docsから。

cmake_current_source_dir: 現在処理中のソースディレクトリへのパスです。 cmakeが現在処理しているソースディレクトリへのフルパスです。

cmake_current_list_dirです。 現在処理されているリストファイルのフルディレクトリ。 CMake がプロジェクトのリストファイルを処理するとき、この変数は常に現在処理されているリストファイル (CMAKE_CURRENT_LIST_FILE) が置かれているディレクトリに設定されます。この値は、動的なスコープを持ちます。CMake がソース ファイル内のコマンドの処理を開始すると、この変数にそのファイルがあるディレクトリーが設定されます。CMake がファイルからのコマンドの処理を終了すると、以前の値が復元されます。したがって、マクロまたは関数内の変数の値は、マクロまたは関数定義を含むファイルのディレクトリではなく、コールスタックの最下位エントリを呼び出すファイルのディレクトリになります。

どのような状況で、これらの変数が異なる値を保持するのでしょうか。

どのように解決するのですか?

変数 CMAKE_CURRENT_SOURCE_DIR CMAKE_CURRENT_LIST_DIR を持つ別のファイルがインクルードする CMake リストファイルに対して、異なるディレクトリを参照することがあります。 インクルード コマンドで他のファイルによってインクルードされる CMake リストファイルに対して、異なるディレクトリを参照することができます。例えば、もし CMakeLists.txt がディレクトリに存在する場合 project に存在し、以下のディレクティブを含んでいます。

include(src/CMakeLists.txt)

次に src/CMakeLists.txt が処理されている間 CMAKE_CURRENT_LIST_DIR を参照します。 project/src 一方 CMAKE_CURRENT_SOURCE_DIR はまだ外側のディレクトリを指しています。 project .

CMAKE_CURRENT_LIST_DIR の隣にあるテンプレートファイルやバッチスクリプトのようなリソースファイルを探すのに便利です。 CMakeLists.txt ファイルの隣にある、テンプレートファイルやバッチスクリプトのようなリソースファイルを探すのに便利です。


add_subdirectory() コマンドではなく include() を指定した場合、動作が異なり src/CMakeLists.txt が処理されているときは、両方の変数が project/src .