Разница между 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.