mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-16 20:31:20 +00:00
This Cl removes the visiblity flags from the CMake file. In both Debug and Release mode on OSX setting these flags caused piles of warnings about mis-matched visibility settings throughout the third_party libraries. This CL fixes that by removing the flags. This maynot be the right way to fix this, but it does fix the warnings. We need to decide if we want to hide symbols by default and, if so, figure out how to fix the downstream projects. Change-Id: I8ee7422cfa2aec3715dba226da58e974f39e0d18 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/100420 Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
645 lines
26 KiB
CMake
645 lines
26 KiB
CMake
# 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)
|
|
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()
|