Разница между CMAKE_CURRENT_SOURCE_DIR и CMAKE_CURRENT_LIST_DIR

105

Из вики:

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 завершает обработку команд из файла, он восстанавливает предыдущее значение. Следовательно, значение переменной внутри макроса или функции - это каталог файла, вызывающего самую нижнюю запись в стеке вызовов, а не каталог файла, содержащего определение макроса или функции.

При каких обстоятельствах эти переменные будут иметь разные значения?

Уильям Пейн
источник
10
А также чем они отличаются от простых и красивых ./?
kyb

Ответы:

139

Переменные 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файлом, который в настоящее время обрабатывается.


Примечание. При использовании add_subdirectory()команды вместо include()поведение отличается, и при src/CMakeLists.txtобработке обе переменные будут указывать на project/src.

сакра
источник
42
+1. Я бы просто добавил, что это CMAKE_CURRENT_LIST_DIRменяется с каждым файлом, который вы include(); его не нужно называть CMakeLists.txt.
Энгью больше не гордится SO
2
Хорошее обсуждение здесь того, как эффективно использовать CMAKE_CURRENT_LIST_DIRи include(...)в ваших проектах.
jmcarter9t
1
Легко запутаться, потому что CMAKE_CURRENT_SOURCE_DIRон больше похож на, CMAKE_SOURCE_DIRчем подразумевается в документации.
Малахи
А с add_subdirectory()? Обе переменные будут указывать на папку?
einpoklum
@einpoklum, да, они оба указывают на папку,
rjhcnf