CMAKE_CURRENT_LIST_DIR がどのように動作するかについて、一見矛盾した事実が報告されています。今、私は混乱の理由を知っています:
まず、私の Linux 環境で:
$ cd /path/to/home
$ mkdir cmake-test
$ cd cmake-test
$ mkdir source
$ mkdir source/subdirectory
$ mkdir build
次の 2 つのファイルを作成します。
$ cat source/CMakeLists.txt
include(subdirectory/foo.cmake)
$ cat source/subdirectory/foo.cmake
message("CMAKE_CURRENT_LIST_DIR is ${CMAKE_CURRENT_LIST_DIR}")
CMake は、Fraser と Robert Dailey によって報告されたように動作します。
$ cd build
$ cmake ../source
CMAKE_CURRENT_LIST_DIR is /path/to/home/cmake-test/source/subdirectory
[...]
ただし、CMakeLists.txt から呼び出す関数を foo.cmake に追加します。
$ cat ../source/subdirectory/foo.cmake
message("CMAKE_CURRENT_LIST_DIR is ${CMAKE_CURRENT_LIST_DIR}")
function(bar)
message("CMAKE_CURRENT_LIST_DIR in bar() is ${CMAKE_CURRENT_LIST_DIR}")
endfunction()
$ cat ../source/CMakeLists.txt
include(subdirectory/foo.cmake)
bar()
それで:
$ cmake ../source
CMAKE_CURRENT_LIST_DIR is /path/to/home/cmake-test/source/subdirectory
CMAKE_CURRENT_LIST_DIR in bar() is /path/to/home/cmake-test/source
[...]
そのため、foo.cmake の CMAKE_CURRENT_LIST_DIR の値は、foo.cmake が含まれているときと bar() が呼び出されたときで同じではありません。これは、CMAKE_CURRENT_LIST_DIR の仕様によるものです。
bar() 内から foo.cmake のディレクトリにアクセスするための 1 つの解決策を次に示します。
$ cat ../source/subdirectory/foo.cmake
set(DIR_OF_FOO_CMAKE ${CMAKE_CURRENT_LIST_DIR})
function(bar)
message("DIR_OF_FOO_CMAKE in bar() is ${DIR_OF_FOO_CMAKE}")
endfunction()
その後、私が探していた動作が得られます:
$ cmake ../source
DIR_OF_FOO_CMAKE in bar() is /path/to/home/cmake-test/source/subdirectory
[...]