Jak ustawić poziom ostrzegania dla projektu (a nie całego rozwiązania) za pomocą CMake ? Powinien działać na Visual Studio i GCC .
Znalazłem różne opcje, ale większość z nich nie działa lub nie jest zgodna z dokumentacją.
cmake
warning-level
Wernight
źródło
źródło
/Wall
flaga obsługi nowych wersji programu Visual Studio (co najmniej 2013) (o nazwieEnableAllWarnings
). Generuje jeszcze więcej ostrzeżeń niż/W4
. Jednak z mojego doświadczenia wynika o wiele za dużo ostrzeżeń./Wall
przydaje się, jeśli chcesz stosować „subtraktywną” strategię ostrzeżeń, podobnie jak strategia clang-Weverything
. Zamiast wybierać ostrzeżenia do włączenia, włączasz wszystko, a następnie wybierasz określone ostrzeżenia do wyłączenia.W nowoczesnym CMake dobrze działa:
Mój kolega zasugerował alternatywną wersję:
Zastąp
${TARGET_NAME}
rzeczywistą nazwą celu.-Werror
jest opcjonalna, zamienia wszystkie ostrzeżenia w błędy.Lub użyj,
add_compile_options(...)
jeśli chcesz zastosować go do wszystkich celów, zgodnie z sugestią @aldo w komentarzach.Pamiętaj też, aby zrozumieć różnicę między
PRIVATE
iPUBLIC
(opcje publiczne będą dziedziczone przez cele zależne od danego celu).źródło
add_compile_options(...)
jeśli chcesz zastosować go do wszystkich celów.else()
lubendif()
.add_compile_options()
polega na tym, że ostrzeżenia będą propagowane do celów dodanych przezadd_subdirectory()
. Jeśli włączysz w ten sposób biblioteki zewnętrzne, możesz otrzymać wiele ostrzeżeń, jeśli ta biblioteka została zaprojektowana z innym poziomem ostrzeżenia.Niektóre moduły CMake, które napisałem, obejmują eksperymentalne tłumienie ostrzeżeń międzyplatformowych :
Wynik dla Xcode:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
atrybut Xcode (inaczej ustawienia kompilacji -> ostrzeżenia -> podejrzane niejawne konwersje -> TAK )-Werror
Makefile gcc i clang:
-Wconversion
,-Werror
Studio wizualne:
/WX
,/w14244
Spinki do mankietów
źródło
Oto najlepsze rozwiązanie, jakie do tej pory znalazłem (w tym sprawdzenie kompilatora):
Spowoduje to ustawienie poziomu ostrzeżenia 2 w programie Visual Studio. Przypuszczam
-W2
, że działałoby to również w GCC (niesprawdzone).Aktualizacja z @Williams: Powinna być
-Wall
dla GCC.źródło
-Wall
i być może-Wextra
tak szczegółowa, jak na stronie gcc.gnu.org/onlinedocs/gcc/Warning-Options.html-W -Wall -Wextra -pedantic
.-Wextra
IIRC zastąpione-W
w późniejszej wersji GCC, ale dla zachowania kompatybilności zostawiam oba.Zgodnie z dokumentacją Cmake 3.17.1 :
GCC i Clang współużytkują te flagi, więc powinno to obejmować wszystkie 3.
źródło
add_compile_options
obejmuje cały katalog, atarget_compile_options
dotyczy tylko jednego celu.Jeśli używasz
target_compile_options
- cmake spróbuje użyć podwójnej/W*
flagi, co da ostrzeżenie kompilatorowi.źródło
add_compile_options
jedynego, aby uzyskać mnóstwo ostrzeżeń, które/W3
są zastępowane/W4
. Fakt, że CMake nie zajmuje się tą podstawową opcją (ustawieniem poziomu ostrzegawczego) jest nie do uwierzenia.