137

ウィキから:

CMAKE_CURRENT_SOURCE_DIR これは、現在処理されている CMakeLists.txt があるディレクトリです。

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

ドキュメントから:

CMAKE_CURRENT_SOURCE_DIR:現在処理中のソース ディレクトリへのパス。これは、現在 cmake によって処理されているソース ディレクトリへのフル パスです。

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

これらの変数が異なる値を保持するのはどのような状況ですか?

4

2 に答える 2

174

変数CMAKE_CURRENT_SOURCE_DIRとは、 includeコマンドCMAKE_CURRENT_LIST_DIRを使用して別のファイルに含まれる CMake リスト ファイルの異なるディレクトリを参照する場合があります。たとえば、 aがディレクトリに存在し、次のディレクティブが含まれている場合CMakeLists.txtproject

include(src/CMakeLists.txt)

while src/CMakeLists.txtis being processingは whileCMAKE_CURRENT_LIST_DIRを参照しますが、それでも外部ディレクトリをproject/src指します。CMAKE_CURRENT_SOURCE_DIRproject

CMAKE_CURRENT_LIST_DIRCMakeLists.txt現在処理中のファイルの隣にあるテンプレート ファイルやバッチ スクリプトなどのリソース ファイルを見つける必要がある場合に便利です。


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

于 2013-03-27T18:49:54.810 に答える
11

定義

CMAKE_SOURCE_DIR: CMakeList.txt ファイルを含む最上位フォルダー (ソース ディレクトリ)。異なるスコープで値が変わることはありません。

PROJECT_SOURCE_DIR: project() コマンドを含む、独自のスコープを持つ CMakeList.txt ファイルを含む最も近いフォルダー。

CMAKE_CURRENT_SOURCE_DIR: 独自のスコープを持つ CMakeList.txt ファイルを含む最も近いフォルダー。(ファイルに project() コマンドを含める必要はありません)

CMAKE_CURRENT_LIST_DIR: 現在処理中の CMakeList.txt または .cmake ファイルを含むフォルダー。

独自のスコープとは、スコープ ルールに関連しています。include(file) コマンドは新しいスコープを作成していませんが、add_subdirectory は PROJECT_SOURCE_DIR および CMAKE_CURRENT_SOURCE_DIR の値に影響する新しいスコープを作成しています。

プロジェクト構造を以下のようにします。

A/
=> CMakeList.txt
=> B/
   => CMakeList.txt

サブフォルダー B の CMakeList.txt ファイルにメッセージ コマンドを入力して、すべての cmake 変数を出力するとします。

  • フォルダ A の CMakeList.txt に include("B/CMakeList.txt") という行が含まれている場合、

CMAKE_SOURCE_DIR「project/Aへのパス」であるソースディレクトリになります。

PROJECT_SOURCE_DIRinclude コマンドは新しいスコープを作成せず、独自のスコープを持ち、プロジェクト コマンドを含む最も近い CMakeList.txt ファイルがフォルダー A にあるため、「project/A へのパス」になります。

CMAKE_CURRENT_SOURCE_DIRinclude コマンドは新しいスコープを作成せず、独自のスコープを持つ最も近い CMakeList.txt ファイルがフォルダー A にあるため、"path to project/A" になります。

CMAKE_CURRENT_LIST_DIR現在処理中のファイルはサブフォルダー B にあるため、"path to project/A/B" になります。

  • CMakeList.txt に行 add_subdirectory("./B") が含まれている場合、

CMAKE_SOURCE_DIR「project/Aへのパス」であるソースディレクトリになります。

PROJECT_SOURCE_DIRadd_subdirectory コマンドは新しいスコープを作成し、独自のスコープを持ち、プロジェクト コマンドを含む最も近い CMakeList.txt ファイルがサブフォルダー B にあるため、「project/A/B へのパス」になります。

CMAKE_CURRENT_SOURCE_DIRadd_subdirectory コマンドが新しいスコープを作成し、独自のスコープを持つ最も近い CMakeList.txt ファイルがサブフォルダー B にあるため、"path to project/A/B" になります。

CMAKE_CURRENT_LIST_DIR現在処理中のファイルはサブフォルダー B にあるため、"path to project/A/B" になります。

参考https ://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/Useful-Variables

于 2021-05-17T10:59:48.657 に答える