2011-12-21 12 views
7

Ho una configurazione CMAKE in cui tutte le mie configurazioni di progetto includono il flag del compilatore /RTC1 (Both Runtime Checks). Tuttavia, desidero passare all'opzione Default per un solo progetto, poiché dispone anche del flag del compilatore /clr; che è incompatibile con il flag Runtime Checks. Sono relativamente nuovo a CMAKE, quindi potrebbe essere una soluzione ovvia, ma finora non sono riuscito a trovarlo.Rimuovi runtime Controlla il flag del compilatore per progetto in CMAKE

Qualsiasi aiuto sarebbe apprezzato.

risposta

10

non sono riuscito a trovare una soluzione per cui ho potuto piacevolmente rimuovere le opzioni particolari, ma ho trovato un modo di strappare l'opzione dal flag di compilazione variabili utilizzando un REGEX REPLACE:

STRING (REGEX REPLACE "/RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 

Dove questo potrebbe non essere l'approccio più ideale, ha funzionato bene nella mia situazione in cui si tratta di uno scenario con casing speciale.

+0

FWIW, ho dovuto ripeterlo con 'CMAKE_C_FLAGS' e' CMAKE_C_FLAGS_DEBUG'. Ho fatto questo in un ciclo usando [il pattern da CMakeLists.txt di SDL2 qui] (https://github.com/spurious/SDL-mirror/blob/release-2.0.3/CMakeLists.txt#L158). –

2

Se si aggiungono le bandiere con add_definitions(), è possibile rimuoverle con remove_definitions, vedere documentation.

Inoltre, è possibile giocare con la proprietà di destinazione COMPILE_DEFINITIONS.

+0

Ho provato a utilizzare 'remove_definitions', ma l'impostazione originale era impostata con' set (...) ', quindi' remove_definitions' non funzionava. Ho finito per risolvere il problema utilizzando un comando REPLACE di REGEX. –

+0

Capisco. Non era chiaro dalla tua domanda. – arrowd

1

Recentemente ho affrontato lo stesso problema e non ho trovato soluzioni eleganti. Tuttavia questo codice fa il lavoro:

foreach(flag_var 
     CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 
     CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
    STRING (REGEX REPLACE "/RTC[^ ]*" "" ${flag_var} "${${flag_var}}") 
endforeach(flag_var) 
set_property(TARGET necessary_targets_here APPEND_STRING PROPERTY COMPILE_FLAGS " /RTC1") 

Se avete solo bisogno di cancellare /RTC bandiera per una configurazione (ex Debug.) Si può provare il seguente approccio:

STRING (REGEX REPLACE "/RTC[^ ]*" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") 
foreach(target_var necessary_targets_here) 
    target_compile_options(${target_var} PRIVATE $<$<CONFIG:Debug>: /RTC1>) 
endforeach() 

prega, nota utilizzando generator expression$<$<CONFIG:Debug>: /RTC1 > che si espande a /RTC1 solo in Debug.

Problemi correlati