Разница между CMAKE_CURRENT_SOURCE_DIR и CMAKE_CURRENT_LIST_DIR
Из Wiki:
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 завершает обработку команд из файла, он восстанавливает предыдущее значение. Поэтому значение переменной внутри макроса или функции является каталогом файла, вызывающего самую нижнюю запись в стеке вызовов, а не в каталоге файла, содержащего определение макроса или функции.
При каких обстоятельствах эти переменные будут иметь разные значения?
Ответы
Ответ 1
Переменные CMAKE_CURRENT_SOURCE_DIR
и CMAKE_CURRENT_LIST_DIR
может ссылаться на разные каталоги для файла списка CMake, который содержится в другом файле с помощью команды include. Например, если a 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
, который в настоящее время обрабатывается.