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?
./
?Odpowiedzi:
Zmienne
CMAKE_CURRENT_SOURCE_DIR
iCMAKE_CURRENT_LIST_DIR
mogą odnosić się do różnych katalogów dla pliku listy CMake, który jest zawarty w innym pliku z poleceniem include . Np. Jeśli aCMakeLists.txt
jest obecny w kataloguproject
i zawiera następującą dyrektywęwtedy gdy
src/CMakeLists.txt
jest przetwarzanyCMAKE_CURRENT_LIST_DIR
będzie odnosić się do,project/src
podczas gdyCMAKE_CURRENT_SOURCE_DIR
nadal wskazuje na katalog zewnętrznyproject
.CMAKE_CURRENT_LIST_DIR
przydaje się, gdy trzeba zlokalizować pliki zasobów, takie jak pliki szablonów lub skrypty wsadowe, które znajdują się obokCMakeLists.txt
aktualnie przetwarzanego pliku.Uwaga: W przypadku używania
add_subdirectory()
polecenia zamiastinclude()
, zachowanie jest inne, a podczassrc/CMakeLists.txt
przetwarzania obie zmienne będą wskazywaćproject/src
.źródło
CMAKE_CURRENT_LIST_DIR
zmienia się z każdym plikieminclude()
; nie trzeba go nazywaćCMakeLists.txt
.CMAKE_CURRENT_LIST_DIR
iinclude(...)
w swoich projektach.CMAKE_CURRENT_SOURCE_DIR
jest bardziej podobny doCMAKE_SOURCE_DIR
tego, co sugerują dokumenty.add_subdirectory()
? Czy obie zmienne będą wskazywać na folder?