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_options
funziona in base alla destinazione (tramite l'impostazione delle proprietà COMPILE_OPTIONS
e della INTERFACE_COMPILE_OPTIONS
destinazione), 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_options
solito è più leggibile.
Ad esempio, per impostare le opzioni di compilazione di un target in foo
base 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
, PRIVATE
e INTERFACE
le parole chiave definiscono la portata delle opzioni . Ad esempio, se ci colleghiamo foo
in bar
con target_link_libraries(bar foo)
:
PRIVATE
le 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
PUBLIC
le opzioni verranno applicate sia al target originale foo
che al target di consumobar