2011-12-12 1 views
18

coś takiego:Jak uzyskać zmienną CMake z wiersza poleceń?

cmake --get-variable=MY_CMAKE_VARIABLE 

Zmienna może występować w dołączonym pliku CMake.

+1

Pytanie jest nieco niejasne: Czy chcesz podać wartość zmiennej w wierszu polecenia? Czy chcesz wyodrębnić istniejącą zmienną z jakiegoś CMakeFile i mieć cmake wydrukować ją na standardowe wyjście? –

Odpowiedz

15

Jeśli istniejący plik cache, można zrobić:

grep MY_CMAKE_VARIABLE CMakeCache.txt 

Jeżeli nie masz jeszcze pliku pamięci podręcznej i chcesz zobaczyć, jakie opcje są w pliku CMakeLists.txt, można zrobić (w innym katalogu, ponieważ będzie to zapisać plik cache):

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE 

który powróci do ciebie coś

<VARIABLE>:<TYPE>=<VALUE> 

Jeśli jest to zmienna zaawansowana, dodaj flagę -A do tego samego polecenia i będzie zawierało zmienne zaawansowane. Oczywiście, jeśli chcesz tylko wartość, można to zrobić:

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE | cut -d "=" -f2 

EDIT

Na przykład, z CMakeLists.txt czyli:

cmake_minimum_required(VERSION 2.8) 

project(test) 

include(otherFile.txt) 

set(MY_VAR "Testing" CACHE STRING "") 

i gdzie innyplik. txt to:

set(MY_OTHER_VAR "Hi" CACHE STRING "") 

Polecenie (uruchom z innego katalogu):

cmake -L ../cmaketest 

Daje:

-- The C compiler identification is GNU 
-- The CXX compiler identification is GNU 
-- Check for working C compiler: /usr/bin/gcc 
-- Check for working C compiler: /usr/bin/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/tgallagher/cmaketest-build 
-- Cache values 
CMAKE_BUILD_TYPE:STRING= 
CMAKE_INSTALL_PREFIX:PATH=/usr/local 
MY_OTHER_VAR:STRING=Hi 
MY_VAR:STRING=Testing 

Tak, to nie pokazuje zmienne z innymi plikami. Powinien przeanalizować całą kompilację. Problem polega jednak na tym, że nie pokazuje żadnych zmiennych, które nie są oznaczone jako CACHE. I nie pokaże żadnego, który jest buforowany WEWNĘTRZNY, i wyświetli tylko ZAAWANSOWANE, jeśli zamiast -L użyto -LA.

Jeśli twoje zmienne są oznaczone jako WEWNĘTRZNE lub nie są CACHEd, to nie ma żadnej metody w CMake, aby je wyciągnąć. Ale zmienne inne niż CACHEd mają być przejściowe, więc nie jestem pewien, dlaczego i tak potrzebne są one poza środowiskiem kompilacji.

+0

Brak tych sugestii wydaje się działać dla zmiennych, które są zawarte w innych CMakeFiles – Allan

+0

Dodano działający przykład, który zawiera inne pliki cmake. Co próbujesz osiągnąć? Być może istnieje inny sposób lub sposób ustawienia zmiennych, dzięki czemu można z nich korzystać w powyższym podejściu. – tpg2114

-1

-D <var>:<type>=<value>:

Kiedy cmake jest pierwszy bieg w pustym drzewie budowania, to tworzy plik CMakeCache.txt i zapełnia ją dostosować ustawienia dla projektu. Ta opcja może być używana do określenia ustawienia, które ma pierwszeństwo przed domyślną wartością projektu. Opcję tę można powtórzyć dla dowolnej liczby wpisów pamięci podręcznej.

+1

To nie jest pytanie OP: –

2

Jeśli potrzebujesz uzyskać zmienną użytkownika niezaśmietaną, ale nie możesz edytować oryginalnego skryptu cmake, możesz użyć sztuczki. Tworzenie nowego pliku CMakeLists.txt w innym katalogu, o następującej treści:

include(<Path to original CMakeLists.txt>) 

message(STATUS "MY_VAR={${MY_VAR}}") 

Jest całkiem możliwe, CUpewnij będzie popełnił dużo błędów podczas pracy w nowym katalogu.Ścieżki względne, jeśli są używane w oryginalnym skrypcie, są z pewnością przyczyną takich błędów. Ale cmake wydrukuje ostatnią wartość przypisaną do zmiennej. Ponadto filtrować wszystkie błędy i ostrzeżenia przy użyciu dowolnego znanego procesora tekstu (zakładamy UNIX znajomy), na przykład:

cmake . | sed -n 's/-- MY_VAR={\(.*\)}/\1/p' 2>&1 

Używam tego podejścia w skryptach konserwacji projekty, to niezawodnie, o ile nie ma oryginalne CMakeLists.txt błędy składniowe.

1

Zastosowanie:

cmake -LA -N /path/to/project 

aby uzyskać listę wszystkich wartości cache. -N jest ważne; uniemożliwia cmake próbowanie generowania plików kompilacji i pokazuje tylko zawartość pamięci podręcznej.