|  | # Copyright 2022 The Dawn & Tint Authors | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | cmake_minimum_required(VERSION 3.10.2) | 
|  |  | 
|  | # When upgrading to CMake 3.11 we can remove DAWN_PLACEHOLDER_FILE because source-less add_library | 
|  | # becomes available. | 
|  | # When upgrading to CMake 3.12 we should add CONFIGURE_DEPENDS to DawnGenerator to rerun CMake in | 
|  | # case any of the generator files changes. We should also remove the CACHE "" FORCE stuff to | 
|  | # override options in third_party dependencies. We can also add the HOMEPAGE_URL | 
|  | # entry to the project `HOMEPAGE_URL "https://dawn.googlesource.com/dawn"` | 
|  |  | 
|  | project( | 
|  | Dawn | 
|  | DESCRIPTION "Dawn, a WebGPU implementation" | 
|  | LANGUAGES C CXX | 
|  | ) | 
|  | enable_testing() | 
|  |  | 
|  | set_property(GLOBAL PROPERTY USE_FOLDERS ON) | 
|  |  | 
|  | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) | 
|  | set(CMAKE_POSITION_INDEPENDENT_CODE ON) | 
|  | set(CMAKE_CXX_STANDARD 17) | 
|  | set(CMAKE_DEBUG_POSTFIX "") | 
|  |  | 
|  | if ("${CMAKE_BUILD_TYPE}" STREQUAL "") | 
|  | message(STATUS "No build type selected, default to Debug") | 
|  | set(CMAKE_BUILD_TYPE "Debug") | 
|  | endif() | 
|  |  | 
|  | set(DAWN_BUILD_GEN_DIR "${Dawn_BINARY_DIR}/gen") | 
|  | set(DAWN_GENERATOR_DIR "${Dawn_SOURCE_DIR}/generator") | 
|  | set(DAWN_SRC_DIR "${Dawn_SOURCE_DIR}/src") | 
|  | set(DAWN_INCLUDE_DIR "${Dawn_SOURCE_DIR}/include") | 
|  | set(DAWN_TEMPLATE_DIR "${DAWN_GENERATOR_DIR}/templates") | 
|  |  | 
|  | set(DAWN_PLACEHOLDER_FILE "${DAWN_SRC_DIR}/Placeholder.cpp") | 
|  |  | 
|  | ################################################################################ | 
|  | # Configuration options | 
|  | ################################################################################ | 
|  |  | 
|  | # option_if_not_defined(name description default) | 
|  | # Behaves like: | 
|  | #   option(name description default) | 
|  | # If a variable is not already defined with the given name, otherwise the | 
|  | # function does nothing. | 
|  | # Simplifies customization by projects that use Dawn as a dependency. | 
|  | function (option_if_not_defined name description default) | 
|  | if(NOT DEFINED ${name}) | 
|  | option(${name} ${description} ${default}) | 
|  | endif() | 
|  | endfunction() | 
|  |  | 
|  | # set_if_not_defined(name value description) | 
|  | # Behaves like: | 
|  | #   set(${name} ${value} CACHE STRING ${description}) | 
|  | # If a variable is not already defined with the given name, otherwise the | 
|  | # function does nothing. | 
|  | # Simplifies customization by projects that use Dawn as a dependency. | 
|  | function (set_if_not_defined name value description) | 
|  | if(NOT DEFINED ${name}) | 
|  | set(${name} ${value} CACHE STRING ${description}) | 
|  | endif() | 
|  | endfunction() | 
|  |  | 
|  | # Default values for the backend-enabling options | 
|  | set(ENABLE_D3D12 OFF) | 
|  | set(ENABLE_METAL OFF) | 
|  | set(ENABLE_OPENGLES OFF) | 
|  | set(ENABLE_DESKTOP_GL OFF) | 
|  | set(ENABLE_VULKAN OFF) | 
|  | set(USE_WAYLAND OFF) | 
|  | set(USE_X11 OFF) | 
|  | set(BUILD_SAMPLES OFF) | 
|  | if (WIN32) | 
|  | set(ENABLE_D3D12 ON) | 
|  | if (NOT WINDOWS_STORE) | 
|  | # Enable Vulkan in win32 compilation only | 
|  | # since UWP only supports d3d | 
|  | set(ENABLE_VULKAN ON) | 
|  | endif() | 
|  | elseif(APPLE) | 
|  | set(ENABLE_METAL ON) | 
|  | elseif(ANDROID) | 
|  | set(ENABLE_VULKAN ON) | 
|  | set(ENABLE_OPENGLES ON) | 
|  | elseif(UNIX) | 
|  | set(ENABLE_OPENGLES ON) | 
|  | set(ENABLE_DESKTOP_GL ON) | 
|  | set(ENABLE_VULKAN ON) | 
|  | set(USE_X11 ON) | 
|  | endif() | 
|  |  | 
|  | # GLFW is not supported in UWP | 
|  | if ((WIN32 AND NOT WINDOWS_STORE) OR UNIX AND NOT ANDROID) | 
|  | set(DAWN_SUPPORTS_GLFW_FOR_WINDOWING ON) | 
|  | endif() | 
|  |  | 
|  | # Current examples are depend on GLFW | 
|  | if (DAWN_SUPPORTS_GLFW_FOR_WINDOWING) | 
|  | set(BUILD_SAMPLES ON) | 
|  | endif() | 
|  |  | 
|  | option_if_not_defined(DAWN_ENABLE_ASAN "Enable address sanitizer" OFF) | 
|  | option_if_not_defined(DAWN_ENABLE_TSAN "Enable thread sanitizer" OFF) | 
|  | option_if_not_defined(DAWN_ENABLE_MSAN "Enable memory sanitizer" OFF) | 
|  | option_if_not_defined(DAWN_ENABLE_UBSAN "Enable undefined behaviour sanitizer" OFF) | 
|  |  | 
|  | option_if_not_defined(DAWN_ENABLE_D3D12 "Enable compilation of the D3D12 backend" ${ENABLE_D3D12}) | 
|  | option_if_not_defined(DAWN_ENABLE_METAL "Enable compilation of the Metal backend" ${ENABLE_METAL}) | 
|  | option_if_not_defined(DAWN_ENABLE_NULL "Enable compilation of the Null backend" ON) | 
|  | option_if_not_defined(DAWN_ENABLE_DESKTOP_GL "Enable compilation of the OpenGL backend" ${ENABLE_DESKTOP_GL}) | 
|  | option_if_not_defined(DAWN_ENABLE_OPENGLES "Enable compilation of the OpenGL ES backend" ${ENABLE_OPENGLES}) | 
|  | option_if_not_defined(DAWN_ENABLE_VULKAN "Enable compilation of the Vulkan backend" ${ENABLE_VULKAN}) | 
|  |  | 
|  | option_if_not_defined(DAWN_ALWAYS_ASSERT "Enable assertions on all build types" OFF) | 
|  | option_if_not_defined(DAWN_USE_WAYLAND "Enable support for Wayland surface" ${USE_WAYLAND}) | 
|  | option_if_not_defined(DAWN_USE_X11 "Enable support for X11 surface" ${USE_X11}) | 
|  |  | 
|  | option_if_not_defined(DAWN_BUILD_SAMPLES "Enables building Dawn's samples" ${BUILD_SAMPLES}) | 
|  | option_if_not_defined(DAWN_BUILD_NODE_BINDINGS "Enables building Dawn's NodeJS bindings" OFF) | 
|  | option_if_not_defined(DAWN_ENABLE_SWIFTSHADER "Enables building Swiftshader as part of the build and Vulkan adapter discovery" OFF) | 
|  |  | 
|  | option_if_not_defined(DAWN_ENABLE_PIC "Build with Position-Independent-Code enabled" OFF) | 
|  |  | 
|  | if (DAWN_ENABLE_OPENGLES OR DAWN_ENABLE_DESKTOP_GL) | 
|  | set(TINT_DEFAULT_GLSL ON) | 
|  | else() | 
|  | set(TINT_DEFAULT_GLSL OFF) | 
|  | endif() | 
|  |  | 
|  | option_if_not_defined(TINT_BUILD_SAMPLES "Build samples" ${DAWN_BUILD_SAMPLES}) | 
|  | option_if_not_defined(TINT_BUILD_DOCS "Build documentation" ON) | 
|  | option_if_not_defined(TINT_DOCS_WARN_AS_ERROR "When building documentation, treat warnings as errors" OFF) | 
|  |  | 
|  | option_if_not_defined(TINT_BUILD_SPV_READER "Build the SPIR-V input reader" ${DAWN_ENABLE_VULKAN}) | 
|  | option_if_not_defined(TINT_BUILD_WGSL_READER "Build the WGSL input reader" ON) | 
|  | option_if_not_defined(TINT_BUILD_GLSL_WRITER "Build the GLSL output writer" ${TINT_DEFAULT_GLSL}) | 
|  | option_if_not_defined(TINT_BUILD_HLSL_WRITER "Build the HLSL output writer" ${DAWN_ENABLE_D3D12}) | 
|  | option_if_not_defined(TINT_BUILD_MSL_WRITER "Build the MSL output writer" ${DAWN_ENABLE_METAL}) | 
|  | option_if_not_defined(TINT_BUILD_SPV_WRITER "Build the SPIR-V output writer" ${DAWN_ENABLE_VULKAN}) | 
|  | option_if_not_defined(TINT_BUILD_WGSL_WRITER "Build the WGSL output writer" ON) | 
|  |  | 
|  | option_if_not_defined(TINT_BUILD_FUZZERS "Build fuzzers" OFF) | 
|  | option_if_not_defined(TINT_BUILD_SPIRV_TOOLS_FUZZER "Build SPIRV-Tools fuzzer" OFF) | 
|  | option_if_not_defined(TINT_BUILD_AST_FUZZER "Build AST fuzzer" OFF) | 
|  | option_if_not_defined(TINT_BUILD_REGEX_FUZZER "Build regex fuzzer" OFF) | 
|  | option_if_not_defined(TINT_BUILD_BENCHMARKS "Build benchmarks" OFF) | 
|  | option_if_not_defined(TINT_BUILD_TESTS "Build tests" ON) | 
|  | option_if_not_defined(TINT_BUILD_AS_OTHER_OS "Override OS detection to force building of *_other.cc files" OFF) | 
|  | option_if_not_defined(TINT_BUILD_REMOTE_COMPILE "Build the remote-compile tool for validating shaders on a remote machine" OFF) | 
|  |  | 
|  | option_if_not_defined(TINT_ENABLE_BREAK_IN_DEBUGGER "Enable tint::debugger::Break()" OFF) | 
|  | option_if_not_defined(TINT_EMIT_COVERAGE "Emit code coverage information" OFF) | 
|  | option_if_not_defined(TINT_CHECK_CHROMIUM_STYLE "Check for [chromium-style] issues during build" OFF) | 
|  | option_if_not_defined(TINT_SYMBOL_STORE_DEBUG_NAME "Enable storing of name in tint::ast::Symbol to help debugging the AST" OFF) | 
|  |  | 
|  | # Recommended setting for compability with future abseil releases. | 
|  | set(ABSL_PROPAGATE_CXX_STD ON) | 
|  |  | 
|  | set_if_not_defined(DAWN_THIRD_PARTY_DIR "${Dawn_SOURCE_DIR}/third_party" "Directory in which to find third-party dependencies.") | 
|  | set_if_not_defined(DAWN_ABSEIL_DIR "${DAWN_THIRD_PARTY_DIR}/abseil-cpp" "Directory in which to find Abseil") | 
|  | set_if_not_defined(DAWN_GLFW_DIR "${DAWN_THIRD_PARTY_DIR}/glfw" "Directory in which to find GLFW") | 
|  | set_if_not_defined(DAWN_JINJA2_DIR "${DAWN_THIRD_PARTY_DIR}/jinja2" "Directory in which to find Jinja2") | 
|  | set_if_not_defined(DAWN_KHRONOS_DIR "${DAWN_THIRD_PARTY_DIR}/khronos" "Directory in which to find Khronos GL headers") | 
|  | set_if_not_defined(DAWN_SPIRV_HEADERS_DIR "${DAWN_THIRD_PARTY_DIR}/vulkan-deps/spirv-headers/src" "Directory in which to find SPIRV-Headers") | 
|  | set_if_not_defined(DAWN_SPIRV_TOOLS_DIR "${DAWN_THIRD_PARTY_DIR}/vulkan-deps/spirv-tools/src" "Directory in which to find SPIRV-Tools") | 
|  | set_if_not_defined(DAWN_SWIFTSHADER_DIR "${DAWN_THIRD_PARTY_DIR}/swiftshader" "Directory in which to find swiftshader") | 
|  | set_if_not_defined(DAWN_TINT_DIR "${Dawn_SOURCE_DIR}" "Directory in which to find Tint") | 
|  | set_if_not_defined(DAWN_VULKAN_DEPS_DIR "${DAWN_THIRD_PARTY_DIR}/vulkan-deps" "Directory in which to find vulkan-deps") | 
|  | set_if_not_defined(DAWN_VULKAN_HEADERS_DIR "${DAWN_VULKAN_DEPS_DIR}/vulkan-headers/src" "Directory in which to find Vulkan-Headers") | 
|  | set_if_not_defined(DAWN_VULKAN_TOOLS_DIR "${DAWN_VULKAN_DEPS_DIR}/vulkan-tools/src" "Directory in which to find Vulkan-Tools") | 
|  |  | 
|  | # Dependencies for DAWN_BUILD_NODE_BINDINGS | 
|  | set_if_not_defined(NODE_ADDON_API_DIR "${DAWN_THIRD_PARTY_DIR}/node-addon-api" "Directory in which to find node-addon-api") | 
|  | set_if_not_defined(NODE_API_HEADERS_DIR "${DAWN_THIRD_PARTY_DIR}/node-api-headers" "Directory in which to find node-api-headers") | 
|  | set_if_not_defined(WEBGPU_IDL_PATH "${DAWN_THIRD_PARTY_DIR}/gpuweb/webgpu.idl" "Path to the webgpu.idl definition file") | 
|  | set_if_not_defined(GO_EXECUTABLE "go" "Golang executable for running the IDL generator") | 
|  |  | 
|  | # Much of the backend code is shared among desktop OpenGL and OpenGL ES | 
|  | if (${DAWN_ENABLE_DESKTOP_GL} OR ${DAWN_ENABLE_OPENGLES}) | 
|  | set(DAWN_ENABLE_OPENGL ON) | 
|  | endif() | 
|  |  | 
|  | if(DAWN_ENABLE_PIC) | 
|  | set(CMAKE_POSITION_INDEPENDENT_CODE ON) | 
|  | endif() | 
|  |  | 
|  | if (${TINT_BUILD_SPIRV_TOOLS_FUZZER}) | 
|  | message(STATUS "TINT_BUILD_SPIRV_TOOLS_FUZZER is ON - setting | 
|  | TINT_BUILD_FUZZERS | 
|  | TINT_BUILD_SPV_READER | 
|  | TINT_BUILD_SPV_WRITER | 
|  | TINT_BUILD_WGSL_READER | 
|  | TINT_BUILD_WGSL_WRITER | 
|  | TINT_BUILD_GLSL_WRITER | 
|  | TINT_BUILD_HLSL_WRITER | 
|  | TINT_BUILD_MSL_WRITER to ON") | 
|  | set(TINT_BUILD_FUZZERS ON CACHE BOOL "Build tint fuzzers" FORCE) | 
|  | set(TINT_BUILD_SPV_READER ON CACHE BOOL "Build SPIR-V reader" FORCE) | 
|  | set(TINT_BUILD_SPV_WRITER ON CACHE BOOL "Build SPIR-V writer" FORCE) | 
|  | set(TINT_BUILD_WGSL_READER ON CACHE BOOL "Build WGSL reader" FORCE) | 
|  | set(TINT_BUILD_WGSL_WRITER ON CACHE BOOL "Build WGSL writer" FORCE) | 
|  | set(TINT_BUILD_GLSL_WRITER ON CACHE BOOL "Build HLSL writer" FORCE) | 
|  | set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "Build HLSL writer" FORCE) | 
|  | set(TINT_BUILD_MSL_WRITER ON CACHE BOOL "Build MSL writer" FORCE) | 
|  | endif() | 
|  |  | 
|  | if (${TINT_BUILD_AST_FUZZER}) | 
|  | message(STATUS "TINT_BUILD_AST_FUZZER is ON - setting | 
|  | TINT_BUILD_FUZZERS | 
|  | TINT_BUILD_WGSL_READER | 
|  | TINT_BUILD_WGSL_WRITER | 
|  | TINT_BUILD_SPV_WRITER | 
|  | TINT_BUILD_MSL_WRITER | 
|  | TINT_BUILD_GLSL_WRITER | 
|  | TINT_BUILD_HLSL_WRITER to ON") | 
|  | set(TINT_BUILD_FUZZERS ON CACHE BOOL "Build tint fuzzers" FORCE) | 
|  | set(TINT_BUILD_WGSL_READER ON CACHE BOOL "Build WGSL reader" FORCE) | 
|  | set(TINT_BUILD_WGSL_WRITER ON CACHE BOOL "Build WGSL writer" FORCE) | 
|  | set(TINT_BUILD_SPV_WRITER ON CACHE BOOL "Build SPIR-V writer" FORCE) | 
|  | set(TINT_BUILD_MSL_WRITER ON CACHE BOOL "Build MSL writer" FORCE) | 
|  | set(TINT_BUILD_GLSL_WRITER ON CACHE BOOL "Build GLSL writer" FORCE) | 
|  | set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "Build HLSL writer" FORCE) | 
|  | endif() | 
|  |  | 
|  | if (${TINT_BUILD_REGEX_FUZZER}) | 
|  | message(STATUS "TINT_BUILD_REGEX_FUZZER is ON - setting | 
|  | TINT_BUILD_FUZZERS | 
|  | TINT_BUILD_WGSL_READER | 
|  | TINT_BUILD_WGSL_WRITER | 
|  | TINT_BUILD_SPV_WRITER | 
|  | TINT_BUILD_MSL_WRITER | 
|  | TINT_BUILD_GLSL_WRITER | 
|  | TINT_BUILD_HLSL_WRITER to ON") | 
|  | set(TINT_BUILD_FUZZERS ON CACHE BOOL "Build tint fuzzers" FORCE) | 
|  | set(TINT_BUILD_WGSL_READER ON CACHE BOOL "Build WGSL reader" FORCE) | 
|  | set(TINT_BUILD_WGSL_WRITER ON CACHE BOOL "Build WGSL writer" FORCE) | 
|  | set(TINT_BUILD_SPV_WRITER ON CACHE BOOL "Build SPIR-V writer" FORCE) | 
|  | set(TINT_BUILD_MSL_WRITER ON CACHE BOOL "Build MSL writer" FORCE) | 
|  | set(TINT_BUILD_GLSL_WRITER ON CACHE BOOL "Build GLSL writer" FORCE) | 
|  | set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "Build HLSL writer" FORCE) | 
|  | endif() | 
|  |  | 
|  | message(STATUS "Dawn build D3D12 backend: ${DAWN_ENABLE_D3D12}") | 
|  | message(STATUS "Dawn build Metal backend: ${DAWN_ENABLE_METAL}") | 
|  | message(STATUS "Dawn build Vulkan backend: ${DAWN_ENABLE_VULKAN}") | 
|  | message(STATUS "Dawn build OpenGL backend: ${DAWN_ENABLE_DESKTOP_GL}") | 
|  | message(STATUS "Dawn build OpenGL ES backend: ${DAWN_ENABLE_OPENGLES}") | 
|  | message(STATUS "Dawn build Null backend: ${DAWN_ENABLE_NULL}") | 
|  |  | 
|  | message(STATUS "Dawn build with asserts in all configurations: ${DAWN_ALWAYS_ASSERT}") | 
|  | message(STATUS "Dawn build Wayland support: ${DAWN_USE_WAYLAND}") | 
|  | message(STATUS "Dawn build X11 support: ${DAWN_USE_X11}") | 
|  |  | 
|  | message(STATUS "Dawn build samples: ${DAWN_BUILD_SAMPLES}") | 
|  | message(STATUS "Dawn build Node bindings: ${DAWN_BUILD_NODE_BINDINGS}") | 
|  | message(STATUS "Dawn build Swiftshader: ${DAWN_ENABLE_SWIFTSHADER}") | 
|  |  | 
|  | message(STATUS "Dawn build PIC: ${DAWN_ENABLE_PIC}") | 
|  |  | 
|  | message(STATUS "Dawn build with ASAN: ${DAWN_ENABLE_ASAN}") | 
|  | message(STATUS "Dawn build with TSAN: ${DAWN_ENABLE_TSAN}") | 
|  | message(STATUS "Dawn build with MSAN: ${DAWN_ENABLE_MSAN}") | 
|  | message(STATUS "Dawn build with UBSAN: ${DAWN_ENABLE_UBSAN}") | 
|  |  | 
|  | message(STATUS "Tint build samples: ${TINT_BUILD_SAMPLES}") | 
|  | message(STATUS "Tint build docs: ${TINT_BUILD_DOCS}") | 
|  | message(STATUS "Tint build docs with warn as error: ${TINT_DOCS_WARN_AS_ERROR}") | 
|  | message(STATUS "Tint build SPIR-V reader: ${TINT_BUILD_SPV_READER}") | 
|  | message(STATUS "Tint build WGSL reader: ${TINT_BUILD_WGSL_READER}") | 
|  | message(STATUS "Tint build GLSL writer: ${TINT_BUILD_GLSL_WRITER}") | 
|  | message(STATUS "Tint build HLSL writer: ${TINT_BUILD_HLSL_WRITER}") | 
|  | message(STATUS "Tint build MSL writer: ${TINT_BUILD_MSL_WRITER}") | 
|  | message(STATUS "Tint build SPIR-V writer: ${TINT_BUILD_SPV_WRITER}") | 
|  | message(STATUS "Tint build WGSL writer: ${TINT_BUILD_WGSL_WRITER}") | 
|  | message(STATUS "Tint build fuzzers: ${TINT_BUILD_FUZZERS}") | 
|  | message(STATUS "Tint build SPIRV-Tools fuzzer: ${TINT_BUILD_SPIRV_TOOLS_FUZZER}") | 
|  | message(STATUS "Tint build AST fuzzer: ${TINT_BUILD_AST_FUZZER}") | 
|  | message(STATUS "Tint build regex fuzzer: ${TINT_BUILD_REGEX_FUZZER}") | 
|  | message(STATUS "Tint build benchmarks: ${TINT_BUILD_BENCHMARKS}") | 
|  | message(STATUS "Tint build tests: ${TINT_BUILD_TESTS}") | 
|  | message(STATUS "Tint build checking [chromium-style]: ${TINT_CHECK_CHROMIUM_STYLE}") | 
|  | message(STATUS "Tint build remote-compile tool: ${TINT_BUILD_REMOTE_COMPILE}") | 
|  |  | 
|  | if (NOT ${TINT_LIB_FUZZING_ENGINE_LINK_OPTIONS} STREQUAL "") | 
|  | message(STATUS "Using provided LIB_FUZZING_ENGINE options: ${TINT_LIB_FUZZING_ENGINE_LINK_OPTIONS}") | 
|  | endif() | 
|  |  | 
|  | message(STATUS "Using python3") | 
|  | find_package(PythonInterp 3 REQUIRED) | 
|  |  | 
|  |  | 
|  | ################################################################################ | 
|  | # common_compile_options - sets compiler and linker options common for dawn and | 
|  | # tint on the given target | 
|  | ################################################################################ | 
|  | function(common_compile_options TARGET) | 
|  | if (COMPILER_IS_LIKE_GNU) | 
|  | target_compile_options(${TARGET} PRIVATE | 
|  | -fno-exceptions | 
|  | -fno-rtti | 
|  | ) | 
|  |  | 
|  | if (${DAWN_ENABLE_MSAN}) | 
|  | target_compile_options(${TARGET} PUBLIC -fsanitize=memory) | 
|  | target_link_options(${TARGET} PUBLIC -fsanitize=memory) | 
|  | elseif (${DAWN_ENABLE_ASAN}) | 
|  | target_compile_options(${TARGET} PUBLIC -fsanitize=address) | 
|  | target_link_options(${TARGET} PUBLIC -fsanitize=address) | 
|  | elseif (${DAWN_ENABLE_TSAN}) | 
|  | target_compile_options(${TARGET} PUBLIC -fsanitize=thread) | 
|  | target_link_options(${TARGET} PUBLIC -fsanitize=thread) | 
|  | elseif (${DAWN_ENABLE_UBSAN}) | 
|  | target_compile_options(${TARGET} PUBLIC -fsanitize=undefined) | 
|  | target_link_options(${TARGET} PUBLIC -fsanitize=undefined) | 
|  | endif() | 
|  | endif(COMPILER_IS_LIKE_GNU) | 
|  |  | 
|  | if(MSVC) | 
|  | target_compile_options(${TARGET} PUBLIC /utf-8) | 
|  | endif() | 
|  | endfunction() | 
|  |  | 
|  | if (${DAWN_ENABLE_TSAN}) | 
|  | add_compile_options(-stdlib=libc++) | 
|  | add_link_options(-stdlib=libc++) | 
|  | endif() | 
|  |  | 
|  | ################################################################################ | 
|  | # Dawn's public and internal "configs" | 
|  | ################################################################################ | 
|  |  | 
|  | # The public config contains only the include paths for the Dawn headers. | 
|  | add_library(dawn_public_config INTERFACE) | 
|  | target_include_directories(dawn_public_config INTERFACE | 
|  | "${DAWN_INCLUDE_DIR}" | 
|  | "${DAWN_BUILD_GEN_DIR}/include" | 
|  | ) | 
|  |  | 
|  | # The internal config conatins additional path but includes the dawn_public_config include paths | 
|  | add_library(dawn_internal_config INTERFACE) | 
|  | target_include_directories(dawn_internal_config INTERFACE | 
|  | "${DAWN_SRC_DIR}" | 
|  | "${DAWN_BUILD_GEN_DIR}/src" | 
|  | ) | 
|  | target_link_libraries(dawn_internal_config INTERFACE dawn_public_config) | 
|  |  | 
|  | # Compile definitions for the internal config | 
|  | if (DAWN_ALWAYS_ASSERT OR $<CONFIG:Debug>) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_ASSERTS") | 
|  | endif() | 
|  | if (DAWN_ENABLE_D3D12) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_D3D12") | 
|  | endif() | 
|  | if (DAWN_ENABLE_METAL) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_METAL") | 
|  | endif() | 
|  | if (DAWN_ENABLE_NULL) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_NULL") | 
|  | endif() | 
|  | if (DAWN_ENABLE_DESKTOP_GL) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_DESKTOP_GL") | 
|  | endif() | 
|  | if (DAWN_ENABLE_OPENGLES) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_OPENGLES") | 
|  | endif() | 
|  | if (DAWN_ENABLE_OPENGL) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_OPENGL") | 
|  | endif() | 
|  | if (DAWN_ENABLE_VULKAN) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_VULKAN") | 
|  | endif() | 
|  | if (DAWN_USE_WAYLAND) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_USE_WAYLAND") | 
|  | endif() | 
|  | if (DAWN_USE_X11) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "DAWN_USE_X11") | 
|  | endif() | 
|  | if (WIN32) | 
|  | target_compile_definitions(dawn_internal_config INTERFACE "NOMINMAX" "WIN32_LEAN_AND_MEAN") | 
|  | endif() | 
|  |  | 
|  | set(CMAKE_CXX_STANDARD "17") | 
|  |  | 
|  | ################################################################################ | 
|  | # Tint | 
|  | ################################################################################ | 
|  |  | 
|  | set(TINT_LIB_FUZZING_ENGINE_LINK_OPTIONS "" CACHE STRING "Used by OSS-Fuzz to control, via link options, which fuzzing engine should be used") | 
|  |  | 
|  | set(TINT_ROOT_SOURCE_DIR ${PROJECT_SOURCE_DIR}) | 
|  |  | 
|  | # CMake < 3.15 sets /W3 in CMAKE_CXX_FLAGS. Remove it if it's there. | 
|  | # See https://gitlab.kitware.com/cmake/cmake/-/issues/18317 | 
|  | if (MSVC) | 
|  | if (CMAKE_CXX_FLAGS MATCHES "/W3") | 
|  | string(REPLACE "/W3" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | if (${TINT_CHECK_CHROMIUM_STYLE}) | 
|  | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -add-plugin -Xclang find-bad-constructs") | 
|  | endif() | 
|  |  | 
|  | if (${TINT_BUILD_SPV_READER}) | 
|  | include_directories("${DAWN_THIRD_PARTY_DIR}/vulkan-deps/spirv-tools/include") | 
|  | endif() | 
|  |  | 
|  | if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND (CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")) | 
|  | set(COMPILER_IS_CLANG_CL TRUE) | 
|  | endif() | 
|  |  | 
|  | if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR | 
|  | (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") OR | 
|  | ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND | 
|  | (NOT COMPILER_IS_CLANG_CL))) | 
|  | set(COMPILER_IS_LIKE_GNU TRUE) | 
|  | endif() | 
|  |  | 
|  | # Enable msbuild multiprocessor builds | 
|  | if (MSVC AND NOT COMPILER_IS_CLANG_CL) | 
|  | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") | 
|  | endif() | 
|  |  | 
|  | set(TINT_OS_CC_SUFFIX "other") | 
|  | if (NOT TINT_BUILD_AS_OTHER_OS) | 
|  | if(UNIX OR APPLE) | 
|  | set(TINT_OS_CC_SUFFIX "posix") | 
|  | set(TINT_OS_CC_SUFFIX "posix") | 
|  | elseif(WIN32) | 
|  | set(TINT_OS_CC_SUFFIX "windows") | 
|  | set(TINT_OS_CC_SUFFIX "windows") | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | if(${TINT_BUILD_DOCS}) | 
|  | find_package(Doxygen) | 
|  | if(DOXYGEN_FOUND) | 
|  | set(DOXYGEN_WARN_AS_ERROR NO) | 
|  | if(TINT_DOCS_WARN_AS_ERROR) | 
|  | set(DOXYGEN_WARN_AS_ERROR YES) | 
|  | endif() | 
|  |  | 
|  | set(DOXYGEN_WARN_FORMAT "$file:$line: $text") | 
|  | if (MSVC) | 
|  | set(DOXYGEN_WARN_FORMAT "$file($line): $text") | 
|  | endif() | 
|  |  | 
|  | add_custom_target(tint-docs ALL | 
|  | COMMAND ${CMAKE_COMMAND} | 
|  | -E env | 
|  | "DOXYGEN_OUTPUT_DIRECTORY=${CMAKE_BINARY_DIR}/docs" | 
|  | "DOXYGEN_WARN_AS_ERROR=${DOXYGEN_WARN_AS_ERROR}" | 
|  | "DOXYGEN_WARN_FORMAT=${DOXYGEN_WARN_FORMAT}" | 
|  | ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile | 
|  | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | 
|  | COMMENT "Generating API documentation" | 
|  | VERBATIM) | 
|  | else() | 
|  | message("Doxygen not found. Skipping documentation") | 
|  | endif(DOXYGEN_FOUND) | 
|  | endif() | 
|  |  | 
|  | function(tint_core_compile_options TARGET) | 
|  | target_include_directories(${TARGET} PUBLIC "${TINT_ROOT_SOURCE_DIR}") | 
|  | target_include_directories(${TARGET} PUBLIC "${TINT_ROOT_SOURCE_DIR}/include") | 
|  |  | 
|  | if (${TINT_BUILD_SPV_READER} OR ${TINT_BUILD_SPV_WRITER}) | 
|  | target_include_directories(${TARGET} PUBLIC | 
|  | "${DAWN_THIRD_PARTY_DIR}/spirv-headers/include") | 
|  | endif() | 
|  |  | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_SPV_READER=$<BOOL:${TINT_BUILD_SPV_READER}>) | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_WGSL_READER=$<BOOL:${TINT_BUILD_WGSL_READER}>) | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_GLSL_WRITER=$<BOOL:${TINT_BUILD_GLSL_WRITER}>) | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_HLSL_WRITER=$<BOOL:${TINT_BUILD_HLSL_WRITER}>) | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_MSL_WRITER=$<BOOL:${TINT_BUILD_MSL_WRITER}>) | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_SPV_WRITER=$<BOOL:${TINT_BUILD_SPV_WRITER}>) | 
|  | target_compile_definitions(${TARGET} PUBLIC -DTINT_BUILD_WGSL_WRITER=$<BOOL:${TINT_BUILD_WGSL_WRITER}>) | 
|  |  | 
|  | common_compile_options(${TARGET}) | 
|  |  | 
|  | if (TINT_EMIT_COVERAGE) | 
|  | if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") | 
|  | target_compile_options(${TARGET} PRIVATE "--coverage") | 
|  | target_link_options(${TARGET} PRIVATE "gcov") | 
|  | elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") | 
|  | target_compile_options(${TARGET} PRIVATE "-fprofile-instr-generate" "-fcoverage-mapping") | 
|  | target_link_options(${TARGET} PRIVATE "-fprofile-instr-generate" "-fcoverage-mapping") | 
|  | else() | 
|  | message(FATAL_ERROR "Coverage generation not supported for the ${CMAKE_CXX_COMPILER_ID} toolchain") | 
|  | endif() | 
|  | endif(TINT_EMIT_COVERAGE) | 
|  | endfunction() | 
|  |  | 
|  | function(tint_default_compile_options TARGET) | 
|  | tint_core_compile_options(${TARGET}) | 
|  |  | 
|  | set(COMMON_GNU_OPTIONS | 
|  | -Wall | 
|  | -Werror | 
|  | -Wextra | 
|  | -Wno-documentation-unknown-command | 
|  | -Wno-padded | 
|  | -Wno-switch-enum | 
|  | -Wno-unknown-pragmas | 
|  | ) | 
|  |  | 
|  | set(COMMON_CLANG_OPTIONS | 
|  | -Wno-c++98-compat | 
|  | -Wno-c++98-compat-pedantic | 
|  | -Wno-format-pedantic | 
|  | -Wno-return-std-move-in-c++11 | 
|  | -Wno-unknown-warning-option | 
|  | -Wno-undefined-var-template | 
|  | -Wno-used-but-marked-unused | 
|  | -Weverything | 
|  | ) | 
|  |  | 
|  | if (COMPILER_IS_LIKE_GNU) | 
|  | target_compile_options(${TARGET} PRIVATE | 
|  | -pedantic-errors | 
|  | ${COMMON_GNU_OPTIONS} | 
|  | ) | 
|  |  | 
|  | if (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") OR | 
|  | ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")) | 
|  | target_compile_options(${TARGET} PRIVATE | 
|  | ${COMMON_CLANG_OPTIONS} | 
|  | ) | 
|  | endif() | 
|  | endif(COMPILER_IS_LIKE_GNU) | 
|  |  | 
|  | if (MSVC) | 
|  | # Specify /EHs for exception handling. | 
|  | target_compile_options(${TARGET} PRIVATE | 
|  | /bigobj | 
|  | /EHsc | 
|  | /W4 | 
|  | /WX | 
|  | /wd4068 | 
|  | /wd4127 | 
|  | /wd4244 | 
|  | /wd4267 | 
|  | /wd4324 | 
|  | /wd4458 | 
|  | /wd4514 | 
|  | /wd4571 | 
|  | /wd4625 | 
|  | /wd4626 | 
|  | /wd4710 | 
|  | /wd4774 | 
|  | /wd4820 | 
|  | /wd5026 | 
|  | /wd5027 | 
|  | ) | 
|  |  | 
|  | # When building with clang-cl on Windows, try to match our clang build | 
|  | # options as much as possible. | 
|  | if (COMPILER_IS_CLANG_CL) | 
|  | target_compile_options(${TARGET} PRIVATE | 
|  | ${COMMON_GNU_OPTIONS} | 
|  | ${COMMON_CLANG_OPTIONS} | 
|  | # Disable warnings that are usually disabled in downstream deps for | 
|  | # gcc/clang, but aren't for clang-cl. | 
|  | -Wno-global-constructors | 
|  | -Wno-zero-as-null-pointer-constant | 
|  | -Wno-shorten-64-to-32 | 
|  | -Wno-shadow-field-in-constructor | 
|  | -Wno-reserved-id-macro | 
|  | -Wno-language-extension-token | 
|  | ) | 
|  | endif() | 
|  | endif() | 
|  | endfunction() | 
|  |  | 
|  | ################################################################################ | 
|  | # Run on all subdirectories | 
|  | ################################################################################ | 
|  |  | 
|  | add_subdirectory(third_party) | 
|  |  | 
|  | # TODO(crbug.com/tint/455): Tint does not currently build with CMake when | 
|  | # BUILD_SHARED_LIBS=1, so always build it as static for now. | 
|  | set(BUILD_SHARED_LIBS_SAVED ${BUILD_SHARED_LIBS}) | 
|  | set(BUILD_SHARED_LIBS 0) | 
|  | add_subdirectory(src/tint) | 
|  | set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_SAVED}) | 
|  |  | 
|  | add_subdirectory(generator) | 
|  | add_subdirectory(src/dawn) | 
|  |  | 
|  | ################################################################################ | 
|  | # Samples | 
|  | ################################################################################ | 
|  |  | 
|  | if (TINT_BUILD_SAMPLES) | 
|  | add_subdirectory(src/tint/cmd) | 
|  | endif() | 
|  |  | 
|  | if (TINT_BUILD_FUZZERS) | 
|  | add_subdirectory(src/tint/fuzzers) | 
|  | endif() | 
|  |  | 
|  | add_custom_target(tint-lint | 
|  | COMMAND ./tools/lint | 
|  | WORKING_DIRECTORY ${TINT_ROOT_SOURCE_DIR} | 
|  | COMMENT "Running linter" | 
|  | VERBATIM) | 
|  |  | 
|  | add_custom_target(tint-format | 
|  | COMMAND ./tools/format | 
|  | WORKING_DIRECTORY ${TINT_ROOT_SOURCE_DIR} | 
|  | COMMENT "Running formatter" | 
|  | VERBATIM) | 
|  |  | 
|  |  | 
|  | if (TINT_EMIT_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") | 
|  | # Generates a lcov.info file at the project root. | 
|  | # This can be used by tools such as VSCode's Coverage Gutters extension to | 
|  | # visualize code coverage in the editor. | 
|  | get_filename_component(CLANG_BIN_DIR ${CMAKE_C_COMPILER} DIRECTORY) | 
|  | set(PATH_WITH_CLANG "${CLANG_BIN_DIR}:$ENV{PATH}") | 
|  | add_custom_target(tint-generate-coverage | 
|  | COMMAND ${CMAKE_COMMAND} -E env PATH=${PATH_WITH_CLANG} ./tools/tint-generate-coverage $<TARGET_FILE:tint_unittests> | 
|  | DEPENDS tint_unittests | 
|  | WORKING_DIRECTORY ${TINT_ROOT_SOURCE_DIR} | 
|  | COMMENT "Generating tint coverage data" | 
|  | VERBATIM) | 
|  | endif() | 
|  |  | 
|  | if (TINT_BUILD_REMOTE_COMPILE) | 
|  | add_subdirectory(tools/src/cmd/remote-compile) | 
|  | endif() |