Per CMake moderno (versioni 2.8.12 e successive) dovresti usare target_compile_options, che utilizza internamente le proprietà di destinazione.
CMAKE_<LANG>_FLAGSè una variabile globale e la più soggetta a errori da utilizzare. Inoltre non supporta le espressioni del generatore , che possono tornare molto utili.
add_compile_options si basa sulle proprietà della directory, il che va bene in alcune situazioni, ma di solito non è il modo più naturale per specificare le opzioni.
target_compile_optionsfunziona in base alla destinazione (tramite l'impostazione delle proprietà COMPILE_OPTIONSe della INTERFACE_COMPILE_OPTIONSdestinazione), che di solito produce il codice CMake più pulito, poiché le opzioni di compilazione per un file di origine sono determinate dal progetto a cui appartiene il file (piuttosto che dalla directory in cui è posizionato sul disco rigido). Ciò ha l'ulteriore vantaggio che si occupa automaticamente di passare le opzioni alle destinazioni dipendenti, se richiesto.
Anche se sono un po 'più verbosi, i comandi per target consentono un controllo ragionevolmente fine sulle diverse opzioni di build e (nella mia esperienza personale) hanno meno probabilità di causare mal di testa a lungo termine.
In teoria, potresti anche impostare le rispettive proprietà direttamente usando set_target_properties, ma di target_compile_optionssolito è più leggibile.
Ad esempio, per impostare le opzioni di compilazione di un target in foobase alla configurazione utilizzando espressioni del generatore è possibile scrivere:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
I PUBLIC, PRIVATEe INTERFACEle parole chiave definiscono la portata delle opzioni . Ad esempio, se ci colleghiamo fooin barcon target_link_libraries(bar foo):
PRIVATEle opzioni verranno applicate solo alla destinazione stessa ( foo) e non ad altre librerie (consumatori) che si collegano ad essa.
INTERFACE le opzioni verranno applicate solo all'obiettivo di consumo bar
PUBLICle opzioni verranno applicate sia al target originale fooche al target di consumobar