2015-06-16 14 views
7

Niedawno zmieniłem kilka projektów z autotools na cmake.cmake - uzyskaj używane flagi linii poleceń "-D"

jedną wspólną rzeczą, którą lubiłem w autotoolach, jest to, że jeśli przejdę do katalogu budowania src. znajduje się plik config.log/config.status - gdzie na górze znajduje się polecenie ./configure --params - więc łatwo jest ponownie użyć wcześniej używanych flag linii poleceń.

(jak po kompilacji niektóre rzeczy - chcę dodać kolejny --enable-this - tak skopiować & pastę z config.log/status - i ponownie uruchom ./configure --old-params --enable-this)

w cmake - mam kilka -D flagi - jak mogę znaleźć użytą linię poleceń jak w config.log/status - z projektem cmake?

wiem tam jest CMakeCache ... - ale trudno wyodrębnić używane flagi

edit:

wymyśliłem następujące rozwiązanie:

#save commandline to rebuild this :) 
set(USED_CMD_LINE "cmake ") 
set(MY_CMAKE_FLAGS CMAKE_BUILD_TYPE CMAKE_INSTALL_PREFIX ENABLE_SSL ENABLE_LUA ENABLE_SSH ENABLE_SNMP MYSQL_USER MYSQL_PASS MYSQL_HOST MYSQL_DB FULL_FEATURES USE_COVERAGE) 
FOREACH(cmd_line_loop IN ITEMS ${MY_CMAKE_FLAGS}) 
    if(${cmd_line_loop}) 
     STRING(CONCAT USED_CMD_LINE ${USED_CMD_LINE} "-D" ${cmd_line_loop} "=" ${${cmd_line_loop}} " ") 
    endif() 
ENDFOREACH(cmd_line_loop) 
STRING(CONCAT USED_CMD_LINE ${USED_CMD_LINE} " .. ") 
#store to a file aka "config.status" 
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/config.status ${USED_CMD_LINE}) 

tworzy plik config.status w folderze build - zawierający wszystkie ustawione parametry cmake.

pro:

  • wydaje się rozwiązać mój problem
  • wydaje się działać na późniejszej cmake wzywa

con:

  • w stanie ustawić chmod na FILE(write? zmienna
  • MY_CMAKE_FLAGS zawiera znane flagi - musi być ręcznie aktualizowany jeśli nowa flaga dodaje

pozdrowienia

+1

To jest doskonałe pytanie - który miałem przez kilka lat, ale nie poprosił o StackOverflow. Nie sądzę, że istnieje sposób na uzyskanie zestawu flag -D podczas wywoływania cmake. Poniższa odpowiedź na pytanie, jak wyświetlić dokładne polecenia, które wynikają z wywołania cmake, nie zawiera argumentów użytych w wywołaniu konfiguracji cmake. Prawidłowa odpowiedź jest trudniejsza, niż można by się spodziewać, ponieważ użytkownik może ciągle rekonfigurować katalog budowania cmake'a za pomocą 'cmake -Danotherflag = value.". – Phil

+0

to smutne! w rzeczywistości naprawdę kocham cmake, rozwiązuje jak problemy 3.5mio (nauczyłem się żyć z) z autotools - ale brak uzyskiwania przez użytkownika flag linii poleceń, jest naprawdę zły. –

+0

zobacz moje edytowane pytanie - to alteast dla mnie rozwiązuje mój problem (w sposób nie doskonały tak) –

Odpowiedz

1

Jedną z cech, które mogą być pomocne obraca się na fladze CMAKE_EXPORT_COMPILE_COMMANDS w CWprowadä projektu Pamięć podręczna. Podczas kompilacji sprawi, że CMake wygeneruje plik JSON compile_commands.json w katalogu binarnym, który zawiera dokładne wywołania kompilatora dla wszystkich jednostek tłumaczeniowych.

+2

thx za odpowiedź, i miło wiedzieć o "CMAKE_EXPORT_COMPILE_COMMANDS", ale to nie rozwiązuje mojego problemu. –

0

Cmake nie daje łatwego sposobu na wyświetlenie wszystkich użytych flag -D (definiuje). Jednak dla poprawnie napisanych CMakeLists, nie jest konieczne znać pełną linię poleceń z wszystkimi flagami D, aby zmienić jedną konkretną definicję/opcję.

Rozważmy snipplet:

SET(my_var_1 TRUE CACHE BOOL "my var 1") 
SET(my_var_2 TRUE CACHE BOOL "my var 2") 

message(STATUS "my_var_1 ${my_var_1}") 
message(STATUS "my_var_2 ${my_var_2}") 

Pierwszy CUpewnij inwokacja:

>cmake .. -Dmy_var_1=FALSE 
-- my_var_1 FALSE 
-- my_var_2 TRUE 
-- Configuring done 
-- Generating done 
-- Build files have been written to: out 

drugie CUpewnij inwokacja:

>cmake .. -Dmy_var_2=FALSE 
-- my_var_1 FALSE 
-- my_var_2 FALSE 
-- Configuring done 
-- Generating done 
-- Build files have been written to: out 

Zauważ, że my_var_1=FALSE nawet to nie jest jawnie stwierdził (pobierane z pamięci podręcznej)

+0

thx za odpowiedź Wiem, że funkcje, oparte na cmakecache , ale na moje pytanie bardziej przypomina - mam folder kompilacji na serwerze A - i chcę skompilować źródło na innym serwerze od zera (w dniach autotools - Właśnie pobrałem źródło do nowego serwera - skopiowałem polecenie configure ze stanu konfiguracji i uruchomiłem to na nowym serwerze) zobacz moje edytowane pytanie - w ten sposób mogę żyć z –

+1

Biorąc pod uwagę Twoją ostatnią edycję, powiedzmy, że możesz żyć ze śledzeniem '' MY_CMAKE_FLAGS'', powinieneś rozważyć moduł cmake [FeatureSummary] (http://www.cmake.org/cmake/help/v3.3/module/FeatureSummary.html). – Phil

0

Możesz spojrzeć na to, co odbywa się w skrypcie bootstrap w kodzie źródłowym CUpewnij za:

# Write our default settings to Bootstrap${_cmk}/InitialCacheFlags.cmake. 
echo ' 
# Generated by '"${cmake_source_dir}"'/bootstrap 
# Default cmake settings. These may be overridden any settings below. 
set (CMAKE_INSTALL_PREFIX "'"${cmake_prefix_dir}"'" CACHE PATH "Install path prefix, prepended onto install directories." FORCE) 
set (CMAKE_DOC_DIR "'"${cmake_doc_dir}"'" CACHE PATH "Install location for documentation (relative to prefix)." FORCE) 
set (CMAKE_MAN_DIR "'"${cmake_man_dir}"'" CACHE PATH "Install location for man pages (relative to prefix)." FORCE) 
set (CMAKE_DATA_DIR "'"${cmake_data_dir}"'" CACHE PATH "Install location for data (relative to prefix)." FORCE) 
' > "${cmake_bootstrap_dir}/InitialCacheFlags.cmake" 

[...] 

"${cmake_bootstrap_dir}/cmake" "${cmake_source_dir}" "-C${cmake_bootstrap_dir}/InitialCacheFlags.cmake" "-G${cmake_bootstrap_generator}" ${cmake_options} ${cmake_bootstrap_system_libs} "[email protected]" 

Skrypt boostrap generuje plik InitialCacheFlags.cmake a następnie wstępne ładowanie go z opcją cmake -C.

I - jeśli dodatkowo chcesz wyprowadzić wartości do stdout - ten początkowy bufor CMake również przyjmuje polecenia message() oprócz poleceń set(... CACHE).

Zobacz także How to store CMake build settings