W przypadku nowoczesnego CMake (wersje 2.8.12 i nowsze) należy użyć target_compile_options, który wewnętrznie używa właściwości docelowych.
CMAKE_<LANG>_FLAGSjest zmienną globalną i najbardziej podatną na błędy w użyciu. Nie obsługuje również wyrażeń generatora , co może być bardzo przydatne.
add_compile_options opiera się na właściwościach katalogu, co jest dobre w niektórych sytuacjach, ale zwykle nie jest najbardziej naturalnym sposobem określania opcji.
target_compile_optionsdziała na zasadzie docelowej (poprzez ustawienie właściwości COMPILE_OPTIONSi INTERFACE_COMPILE_OPTIONStarget), co zwykle daje najczystszy kod CMake, ponieważ opcje kompilacji dla pliku źródłowego są określane przez to, do którego projektu należy plik (a nie do którego katalogu jest umieszczony na dysku twardym). Ma to dodatkową zaletę, że automatycznie dba o przekazywanie opcji do zależnych celów, jeśli jest to wymagane.
Mimo że są nieco bardziej szczegółowe, polecenia dla każdego celu pozwalają na dość precyzyjną kontrolę nad różnymi opcjami kompilacji i (z mojego osobistego doświadczenia) są najmniej narażone na bóle głowy na dłuższą metę.
Teoretycznie można również ustawić odpowiednie właściwości bezpośrednio za pomocą set_target_properties, ale target_compile_optionszwykle jest to bardziej czytelne.
Na przykład, aby ustawić opcje kompilacji celu foona podstawie konfiguracji przy użyciu wyrażeń generatora, możesz napisać:
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")