Cambia il valore predefinito di CMAKE_CXX_FLAGS_DEBUG e gli amici in CMake

Vorrei modificare i valori predefiniti per CMAKE_CXX_FLAGS_RELEASE o CMAKE_CXX_FLAGS_DEBUG in CMake. Fondamentalmente, ho alcune impostazioni predefinite di progetto che differiscono leggermente da quelle di CMake (ad esempio per la versione), e non dovrei chiedermi “Oh, il loro -O3 o il nostro -O2 hanno la precedenza quando vengono aggiunti con add_compile_options.”

Ora, so come impostare questi valori, ma non so come renderli modificabili dall’utente nei due modi usuali: usando – DCMAKE_CXX_FLAGS_DEBUG=yourflags sulla riga di comando o configurandolo con ccmake o CMakeSetup.

Il problema è che CMAKE imposta e memorizza nella cache i valori predefiniti per questi e, se si tenta di sovrascrivere le variabili senza utilizzare FORCE, i “valori predefiniti” non vengono mai modificati. Se uso FORCE nel mio comando set: set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING "" FORCE) , lo sovrascriverà ogni volta che viene eseguito lo script, eliminando la possibilità per l’utente di modificarlo se lo desidera.

Sono riuscito a modificarlo per funzionare con CCMAKE facendo quanto segue, ma questo non funziona ancora con cmake -DCMAKE_CXX_FLAGS_DEBUG in quanto sovrascrive il cambiamento dell’utente DOPO averlo fatto:

 set(DEFAULTS_SET FALSE CACHE BOOL "") set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE) set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE) 

Ovviamente, questo è un brutto attacco e non funziona completamente (nel caso di cmake -Dwhatever = thisorthat). Potrei aggiungere anche altri tipi di build, ma non vedo davvero perché questo dovrebbe essere necessario solo per cambiare alcune semplici cose.

Modifica 1 marzo 2015:

Ho creato una soluzione che funziona, anche se non sono ancora entusiasta di quello che devo fare. Ho visto altri commenti che risolvono il problema dell’impostazione di CMAKE_CXX_FLAGS_DEBUG e dei suoi amici senza farli venire scalzati, ma inizialmente non ha funzionato per me perché stavo cercando di selezionarli anche in base al compilatore che era in uso. Il compilatore non è determinato, tuttavia, fino a quando non ha già riempito le variabili per me. Il trucco che ho usato è il seguente. È necessario impostare le variabili flags su qualcosa di “speciale” prima del comando di progetto.

 set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "") project(your_project C CXX) if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET") # Do some compiler switching here and then set your flags with FORCE. set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE) endif() 

Questo ora mi permette di scegliere valori predefiniti che sono completamente sostituibili tramite riga di comando con -D o in cmake-gui.