定義
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_DIR
include コマンドは新しいスコープを作成せず、独自のスコープを持ち、プロジェクト コマンドを含む最も近い CMakeList.txt ファイルがフォルダー A にあるため、「project/A へのパス」になります。
CMAKE_CURRENT_SOURCE_DIR
include コマンドは新しいスコープを作成せず、独自のスコープを持つ最も近い 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_DIR
add_subdirectory コマンドは新しいスコープを作成し、独自のスコープを持ち、プロジェクト コマンドを含む最も近い CMakeList.txt ファイルがサブフォルダー B にあるため、「project/A/B へのパス」になります。
CMAKE_CURRENT_SOURCE_DIR
add_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