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>_FLAGS
jest 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_options
działa na zasadzie docelowej (poprzez ustawienie właściwości COMPILE_OPTIONS
i INTERFACE_COMPILE_OPTIONS
target), 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_options
zwykle jest to bardziej czytelne.
Na przykład, aby ustawić opcje kompilacji celu foo
na 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}>")