Różnica między CMAKE_CURRENT_SOURCE_DIR a CMAKE_CURRENT_LIST_DIR

105

Z Wiki:

CMAKE_CURRENT_SOURCE_DIR to jest katalog, w którym znajduje się aktualnie przetwarzany plik CMakeLists.txt

CMAKE_CURRENT_LIST_DIR (od 2.8.3) jest to katalog aktualnie przetwarzanego pliku listy.

Z Dokumentów:

CMAKE_CURRENT_SOURCE_DIR: ścieżka do aktualnie przetwarzanego katalogu źródłowego. To pełna ścieżka do katalogu źródłowego, który jest obecnie przetwarzany przez cmake.

CMAKE_CURRENT_LIST_DIR: Pełny katalog aktualnie przetwarzanego pliku listy. Ponieważ CMake przetwarza pliki list w twoim projekcie, ta zmienna będzie zawsze ustawiona na katalog, w którym znajduje się plik listy, który jest obecnie przetwarzany (CMAKE_CURRENT_LIST_FILE). Wartość ma zakres dynamiczny. Gdy CMake rozpoczyna przetwarzanie poleceń w pliku źródłowym, ustawia tę zmienną na katalog, w którym znajduje się ten plik. Gdy CMake kończy przetwarzanie poleceń z pliku, przywraca poprzednią wartość. Dlatego wartością zmiennej wewnątrz makra lub funkcji jest katalog pliku wywołującego najniższy wpis na stosie wywołań, a nie katalog pliku zawierającego makro lub definicję funkcji.

W jakich okolicznościach te zmienne miałyby różne wartości?

William Payne
źródło
10
A także czym różnią się od prostych i ładnych ./?
kyb

Odpowiedzi:

139

Zmienne CMAKE_CURRENT_SOURCE_DIRi CMAKE_CURRENT_LIST_DIRmogą odnosić się do różnych katalogów dla pliku listy CMake, który jest zawarty w innym pliku z poleceniem include . Np. Jeśli a CMakeLists.txtjest obecny w katalogu projecti zawiera następującą dyrektywę

include(src/CMakeLists.txt)

wtedy gdy src/CMakeLists.txtjest przetwarzany CMAKE_CURRENT_LIST_DIRbędzie odnosić się do, project/srcpodczas gdy CMAKE_CURRENT_SOURCE_DIRnadal wskazuje na katalog zewnętrzny project.

CMAKE_CURRENT_LIST_DIRprzydaje się, gdy trzeba zlokalizować pliki zasobów, takie jak pliki szablonów lub skrypty wsadowe, które znajdują się obok CMakeLists.txtaktualnie przetwarzanego pliku.


Uwaga: W przypadku używania add_subdirectory()polecenia zamiast include(), zachowanie jest inne, a podczas src/CMakeLists.txtprzetwarzania obie zmienne będą wskazywać project/src.

sakra
źródło
42
+1. Chciałbym tylko dodać, że CMAKE_CURRENT_LIST_DIRzmienia się z każdym plikiem include(); nie trzeba go nazywać CMakeLists.txt.
Angew nie jest już dumny z SO
2
Dobra dyskusja o tym, jak efektywnie wykorzystywać CMAKE_CURRENT_LIST_DIRi include(...)w swoich projektach.
jmcarter9t
1
Łatwo zdezorientowany, ponieważ CMAKE_CURRENT_SOURCE_DIRjest bardziej podobny do CMAKE_SOURCE_DIRtego, co sugerują dokumenty.
Malachi
A z add_subdirectory()? Czy obie zmienne będą wskazywać na folder?
einpoklum
@einpoklum, tak, oba wskazują na folder,
rjhcnf