Різниця між 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
А також чим вони відрізняються від простих і приємних ./?
киб

Відповіді:


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файлом, який зараз обробляється.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.