|  | # Copyright 2024 The Dawn & Tint Authors | 
|  | # | 
|  | # Redistribution and use in source and binary forms, with or without | 
|  | # modification, are permitted provided that the following conditions are met: | 
|  | # | 
|  | # 1. Redistributions of source code must retain the above copyright notice, this | 
|  | #    list of conditions and the following disclaimer. | 
|  | # | 
|  | # 2. Redistributions in binary form must reproduce the above copyright notice, | 
|  | #    this list of conditions and the following disclaimer in the documentation | 
|  | #    and/or other materials provided with the distribution. | 
|  | # | 
|  | # 3. Neither the name of the copyright holder nor the names of its | 
|  | #    contributors may be used to endorse or promote products derived from | 
|  | #    this software without specific prior written permission. | 
|  | # | 
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
|  | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|  | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
|  | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
|  | # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
|  | # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
|  | # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
|  | # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
|  | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
|  | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  |  | 
|  | # Common compiler flag config. This can be depended on directly, or via | 
|  | # dawn_internal_config. | 
|  | add_library(dawn_warnings_config INTERFACE) | 
|  |  | 
|  | # Flags we can add without bothering with CheckCompilerFlag. | 
|  |  | 
|  | if (DAWN_WERROR) | 
|  | if (COMPILER_IS_LIKE_GNU) | 
|  | target_compile_options(dawn_warnings_config | 
|  | INTERFACE | 
|  | "-Werror" | 
|  | ) | 
|  | endif() | 
|  | endif() | 
|  | if (DAWN_WEVERYTHING) | 
|  | # This is NOT a supported configuration; Dawn is not currently intended to be warning-clean in | 
|  | # this configuration. For now it is a way to manually discover new warnings we should fix. | 
|  | # TODO(crbug.com/436300898): Improve this config and enable more (or all) warnings. | 
|  | if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") | 
|  | target_compile_options(dawn_warnings_config | 
|  | INTERFACE | 
|  | "-Weverything" | 
|  | "-Wno-c++98-compat" | 
|  | "-Wno-c++98-compat-pedantic" | 
|  | "-Wno-covered-switch-default" | 
|  | "-Wno-global-constructors" | 
|  | "-Wno-padded" | 
|  | "-Wno-poison-system-directories" | 
|  | "-Wno-shadow" | 
|  | "-Wno-shadow-field-in-constructor" | 
|  | "-Wno-unsafe-buffer-usage" | 
|  | ) | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | # Flags that might not be supported in every version of a compiler. | 
|  |  | 
|  | # This requires CMake 3.19 features (for the `CheckCompilerFlag` module). | 
|  | # Just skip it for older CMake versions and let the warnings appear. | 
|  | if (CMAKE_VERSION VERSION_LESS "3.19") | 
|  | return () | 
|  | endif () | 
|  |  | 
|  | include(CheckCompilerFlag) | 
|  |  | 
|  | function (dawn_add_flag flag) | 
|  | foreach (lang IN LISTS ARGN) | 
|  | check_compiler_flag("${lang}" "${flag}" "dawn_have_compiler_flag-${lang}-${flag}") | 
|  | if (dawn_have_compiler_flag-${lang}-${flag}) | 
|  | target_compile_options(dawn_warnings_config | 
|  | INTERFACE | 
|  | "$<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:${lang}>:${flag}>>" | 
|  | ) | 
|  | endif () | 
|  | endforeach () | 
|  | endfunction () | 
|  |  | 
|  | set(langs C CXX) | 
|  |  | 
|  | dawn_add_flag("-Wconditional-uninitialized" ${langs}) | 
|  | dawn_add_flag("-Wcstring-format-directive" ${langs}) | 
|  | dawn_add_flag("-Wctad-maybe-unsupported" ${langs}) | 
|  | dawn_add_flag("-Wc++11-narrowing" ${langs}) | 
|  | dawn_add_flag("-Wdeprecated-copy" ${langs}) | 
|  | dawn_add_flag("-Wdeprecated-copy-dtor" ${langs}) | 
|  | dawn_add_flag("-Wduplicate-enum" ${langs}) | 
|  | dawn_add_flag("-Wextra-semi" ${langs}) | 
|  | dawn_add_flag("-Wextra-semi-stmt" ${langs}) | 
|  | dawn_add_flag("-Wimplicit-fallthrough" ${langs}) | 
|  | dawn_add_flag("-Winconsistent-missing-destructor-override" ${langs}) | 
|  | dawn_add_flag("-Winvalid-offsetof" ${langs}) | 
|  | dawn_add_flag("-Wmissing-field-initializers" ${langs}) | 
|  | dawn_add_flag("-Wnon-c-typedef-for-linkage" ${langs}) | 
|  | dawn_add_flag("-Wpessimizing-move" ${langs}) | 
|  | dawn_add_flag("-Wrange-loop-analysis" ${langs}) | 
|  | dawn_add_flag("-Wredundant-move" ${langs}) | 
|  | dawn_add_flag("-Wshadow-field" ${langs}) | 
|  | dawn_add_flag("-Wstrict-prototypes" ${langs}) | 
|  | dawn_add_flag("-Wsuggest-destructor-override" ${langs}) | 
|  | dawn_add_flag("-Wsuggest-override" ${langs}) | 
|  | dawn_add_flag("-Wtautological-unsigned-zero-compare" ${langs}) | 
|  | dawn_add_flag("-Wunreachable-code-aggressive" ${langs}) | 
|  | dawn_add_flag("-Wunused-but-set-variable" ${langs}) | 
|  | dawn_add_flag("-Wunused-macros" ${langs}) | 
|  |  | 
|  | if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") | 
|  | if (CMAKE_CXX_COMPILER_VERSION_MAJOR VERSION_LESS_EQUAL 18) | 
|  | dawn_add_flag("-Wno-gcc-compat" ${langs}) | 
|  | endif () | 
|  | if (WIN32) | 
|  | dawn_add_flag("/clang:-pedantic" ${langs}) | 
|  | # Allow the use of __uuidof() | 
|  | dawn_add_flag("-Wno-language-extension-token" ${langs}) | 
|  | else () | 
|  | dawn_add_flag("-pedantic" ${langs}) | 
|  | endif () | 
|  | endif () | 
|  |  | 
|  | if (MSVC) | 
|  | # Dawn extends wgpu enums with internal enums. | 
|  | # MSVC considers these invalid switch values. crbug.com/dawn/397. | 
|  | dawn_add_flag("/wd4063" CXX) | 
|  | # MSVC things that a switch over all the enum values of an enum class is | 
|  | # not sufficient to cover all control paths. Turn off this warning so that | 
|  | # the respective clang warning tells us where to add switch cases | 
|  | # (otherwise we have to add default: DAWN_UNREACHABLE() that silences clang too) | 
|  | dawn_add_flag("/wd4715" CXX) | 
|  | # /ZW makes sure we don't add calls that are forbidden in UWP. | 
|  | # and /EHsc is required to be used in combination with it, | 
|  | # even if it is already added by the windows GN defaults, | 
|  | # we still add it to make every /ZW paired with a /EHsc | 
|  | dawn_add_flag("/ZW:nostdlib" CXX) | 
|  | dawn_add_flag("/EHsc" CXX) | 
|  | endif () |